Dre*_*TeK 7 html css css3 flexbox css-grid
在下面的示例中,我希望将所有项目都设置为最大内容的宽度(例如,项目5).
列表中的项目数是动态的,可能有数百个.
每个项目内容的宽度也是动态的.
每行中的项目数量将根据容器的宽度而变化.
期望的输出
注意: 媒体查询不适用于我的方案.
Flex
被认为是一维的.这意味着它可以在单个轴(行)上实现所需的结果,除非内容小于可用空间.
非包装示例(单行)
.container {
display: flex;
}
.item {
background: #58c;
text-align: center;
white-space: nowrap;
margin: 0 10px 10px 0;
flex: 1;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5 is longer</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
</div>
Run Code Online (Sandbox Code Playgroud)
Flex的flex-wrap
属性可用于创建二维布局.再次这很好用,但需要一个固定的宽度值才能计算每个项目的宽度.
包装示例(多行)
.container {
display: flex;
flex-wrap:wrap;
}
.item {
background: #58c;
text-align: center;
white-space: nowrap;
margin: 0 10px 10px 0;
flex: 0 1 100px;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5 is longer</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
Run Code Online (Sandbox Code Playgroud)
对于二维设计,建议使用CSS Grid,但下面的示例使用固定宽度.这似乎min-content
需要考虑因素,但如何?
失败的例子
grid-template-columns: repeat(auto-fit, min-content);
Run Code Online (Sandbox Code Playgroud)
固定示例(多行)
.container {
display: grid;
grid-template-columns: repeat(auto-fit, 100px);
grid-auto-rows: 20px;
grid-gap: 5px;
}
.item {
background: #58c;
text-align: center;
white-space: nowrap;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5 is longer</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
Run Code Online (Sandbox Code Playgroud)
由于以下W3C注释,我不认为这可以通过网格实现:
"自动重复(自动填充或自动装配)不能与固有或灵活的尺寸相结合."
从根本上说,我认为用css做这个没有内在的方法.
要获得每个项目的宽度,它需要:
我看不到同时从另一行AND列推断项目宽度的方法.
这似乎是 CSS Grid 应该能够处理的问题。但我在规范中没有看到任何提供解决方案的内容。我并不是说它不存在,无论是作为一个简单的命令还是规则的组合。我只是还没有找到它(如果存在的话)。
\n\n这是我能得到的最接近的:
\n\n.container {\r\n display: grid;\r\n grid-auto-columns: min-content; /* max-content works, as well */\r\n grid-gap: 10px;\r\n}\r\n\r\n.item {\r\n background: #58c;\r\n text-align: center;\r\n white-space: nowrap;\r\n}
Run Code Online (Sandbox Code Playgroud)\r\n<div class="container">\r\n <div class="item">1</div>\r\n <div class="item">2</div>\r\n <div class="item">3</div>\r\n <div class="item">4</div>\r\n <div class="item">5 is longer</div>\r\n <div class="item">6</div>\r\n <div class="item">7</div>\r\n <div class="item">8</div>\r\n <div class="item">9</div>\r\n <div class="item">10</div>\r\n</div>
Run Code Online (Sandbox Code Playgroud)\r\n上面的代码解决了宽度问题——所有项目都是最长项目的长度。但没有包装。这个问题在下面的例子中被翻转了。
\n\n.container {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(min-content, 1px));\r\n grid-gap: 10px;\r\n}\r\n\r\n.item {\r\n background: #58c;\r\n text-align: center;\r\n white-space: nowrap;\r\n}
Run Code Online (Sandbox Code Playgroud)\r\n<div class="container">\r\n <div class="item">1</div>\r\n <div class="item">2</div>\r\n <div class="item">3</div>\r\n <div class="item">4</div>\r\n <div class="item">5 is longer</div>\r\n <div class="item">6</div>\r\n <div class="item">7</div>\r\n <div class="item">8</div>\r\n <div class="item">9</div>\r\n <div class="item">10</div>\r\n</div>
Run Code Online (Sandbox Code Playgroud)\r\n上面的代码进行了包装,并绕过了使用时的固有大小限制repeat()
。然而,最长内容等长要求失败了。
\n \n\n\n\n自动重复(
\n\n \nauto-fill
或)不能与固有或灵活auto-fit
大小组合\n 。
auto
您可以通过以下方式绕过限制:
repeat(auto-fill, minmax(min-content, 1px))\n
Run Code Online (Sandbox Code Playgroud)\n\n\n \n\n\n\n定义大于或等于min且小于或等于max 的大小范围。
\n\n如果max < min,则max被忽略并被
\n\nminmax(min,max)
视为min。作为最大值,一个
\n<flex>
值设置 track\xe2\x80\x99s 弹性系数;它至少是无效的。
也许其他人可以从这里拿走它。
\n