使固定宽度的 flexbox 项目正确包装
Make fixed width flexbox items wrap correctly
如果弹性项目在 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>
这似乎是 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>
您的问题是您已将所有元素设置为 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>
如果弹性项目在 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>
这似乎是 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>
您的问题是您已将所有元素设置为 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>