【问题标题】:Make fixed width flexbox items wrap correctly使固定宽度的 flexbox 项目正确包装
【发布时间】:2015-07-16 09:45:42
【问题描述】:
如果弹性项目在 Google Chrome 中的宽度是固定的,我将无法正确包装它们。但是,当使用基于百分比的宽度时,一切都会正确换行。
如何使用固定宽度的项目进行这项工作?
参见示例:
http://codepen.io/anon/pen/wajWLz
* {
box-sizing: border-box;
font-family: Arial;
}
.wrapper {
width: 300px;
background: #eee;
border: solid #ddd 1px;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-moz-box-wrap: wrap;
-webkit-box-wrap: wrap;
-webkit-flex-wrap: wrap;
-ms-flexbox-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
.item {
background: #ddd;
border: solid 1px #aaa;
width: 100px;
/* Doesn't wrap correctly */
}
.wrapper-second .item {
width: 33.333333%
/* Wraps correctly */
}
<p>The wrapper is 300px wide, each item is <strong>100px</strong> wide</p>
<div class="wrapper">
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
</div>
<p>you should see 3 items per row,
<br />Chrome however wraps after the 2nd item (wraps too soon).</p>
<p>when you change the item width to <strong>33.333333%</strong>, it however wraps correctly.</p>
<div class="wrapper wrapper-second">
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
</div>
<p><strong>Question:</strong> how can I make flexbox wrap fixed width items correctly?</p>
【问题讨论】:
标签:
css
flexbox
word-wrap
fixed-width
【解决方案1】:
您的问题是您已将所有元素设置为box-sizing: border-box;。这意味着.wrapper 的width 将包括边框宽度。
修复任一:
- 将
box-sizing: content-box; 添加到.wrapper
- 在
.wrapper 上将width: 300px; 更改为width: 302px;
* {
box-sizing: border-box;
font-family: Arial;
}
.wrapper {
box-sizing: content-box;
width: 300px;
background: #eee;
border: solid #ddd 1px;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-moz-box-wrap: wrap;
-webkit-box-wrap: wrap;
-webkit-flex-wrap: wrap;
-ms-flexbox-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
.item {
background: #ddd;
border: solid 1px #aaa;
width: 100px;
/* Doesn't wrap correctly */
}
.wrapper-second .item {
width: 33.333333%
/* Wraps correctly */
}
<p>The wrapper is 300px wide, each item is <strong>100px</strong> wide</p>
<div class="wrapper">
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
</div>
<p>you should see 3 items per row,
<br />Chrome however wraps after the 2nd item (wraps too soon).</p>
<p>when you change the item width to <strong>33.333333%</strong>, it however wraps correctly.</p>
<div class="wrapper wrapper-second">
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
</div>
<p><strong>Question:</strong> how can I make flexbox wrap fixed width items correctly?</p>
【解决方案2】:
border-box 语句似乎有问题。
如果您将其从通用选择器中删除并专门应用于子项,它似乎可以工作。
.wrapper {
width: 300px;
background: #eee;
border: solid #ddd 1px;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-moz-box-wrap: wrap;
-webkit-box-wrap: wrap;
-webkit-flex-wrap: wrap;
-ms-flexbox-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
.item {
background: #ddd;
border: solid 1px #aaa;
box-sizing: border-box;
width: 100px;
}
<div class="wrapper">
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
<div class="item">item</div>
</div>