Flexbox: 4 элемента в строке
Я использую flex box для отображения 8 элементов, которые будут динамически изменять размер с моей страницы. Как заставить его разделить элементы на две строки? (4 в ряду)?
вот соответствующий СНиП:
(или, если вы предпочитаете jsfiddle - http://jsfiddle.net/vivmaha/oq6prk1p/2/)
.parent-wrapper {
height: 100%;
width: 100%;
border: 1px solid black;
}
.parent {
display: flex;
font-size: 0;
flex-wrap: wrap;
margin: -10px 0 0 -10px;
}
.child {
display: inline-block;
background: blue;
margin: 10px 0 0 10px;
flex-grow: 1;
height: 100px;
}
<body>
<div class="parent-wrapper">
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
7 ответов:
добавить ширину к
.child
элементы. Я лично бы использовал проценты наmargin-left
Если вы хотите иметь его всегда 4 в строке..child { display: inline-block; background: blue; margin: 10px 0 0 2%; flex-grow: 1; height: 100px; width: calc(100% * (1/4) - 10px - 1px); }
ты
flex-wrap: wrap
на контейнере. Это хорошо, потому что он переопределяет значение по умолчанию:nowrap
(источник). Это причина, по которой элементы не переносятся, чтобы сформировать сетку в в некоторых случаях.в этом случае основная проблема
flex-grow: 1
на деталях гибкого трубопровода.The
flex-grow
свойство на самом деле не размер гибких элементов. Его задача-распределить свободное пространство в контейнере (источник). Так что независимо от того, насколько мал размер экрана, каждый элемент получит пропорциональную часть свободного места на линии.более конкретно, в вашем контейнере есть восемь гибких элементов. С
flex-grow: 1
, каждый из них получает 1/8 свободного места на линии. Поскольку в ваших элементах нет содержимого, они могут сжиматься до нулевой ширины и никогда не будут обернуты.решение состоит в том, чтобы определить ширину на элементах. Попробуйте это:
.parent { display: flex; flex-wrap: wrap; } .child { flex: 1 0 21%; /* explanation below */ margin: 5px; height: 100px; background-color: blue; }
<div class="parent"> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> </div>
С
flex-grow: 1
определенными вflex
стенография, в этом нет необходимостиflex-basis
быть 25%, что фактически приведет к трем элементам в строке из-за полей.С
flex-grow
будет потреблять свободное место в строке,flex-basis
только должен быть достаточно большим, чтобы применять обертывание. В данном случае, сflex-basis: 21%
, есть много места для полей, но никогда не хватает места для Пятого элемента.
вот еще один передовой.
вы можете сделать это таким образом:
.parent{ display: flex; flex-wrap: wrap; } .child{ width: 25%; box-sizing: border-box; }
образец: https://codepen.io/capynet/pen/WOPBBm
и более полный пример: https://codepen.io/capynet/pen/JyYaba
<style type="text/css"> .parent{ display: flex; flex-wrap: wrap; } .parent .child{ flex: 1 1 25%; } </style> <div class="parent"> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> </div>
надеюсь, что это помогает. для более подробной информации вы можете следить за этим ссылке
Я считаю, что этот пример является более barebones и легче понять затем @dowomenfart.
.child { display: inline-block; margin: 0 1em; flex-grow: 1; width: calc(25% - 2em); }
Это выполняет такие же вычисления ширины пока режущ прямо к мясу. Математика намного проще и
em
это новый стандарт благодаря своей масштабируемости и мобильности.
.parent-wrapper { height: 100%; width: 100%; border: 1px solid black; } .parent { display: flex; font-size: 0; flex-wrap: wrap; margin-right: -10px; margin-bottom: -10px; } .child { background: blue; height: 100px; flex-grow: 1; flex-shrink: 0; flex-basis: calc(25% - 10px); } .child:nth-child(even) { margin: 0 10px 10px 10px; background-color: lime; } .child:nth-child(odd) { background-color: orange; }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> </style> </head> <body> <div class="parent-wrapper"> <div class="parent"> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> <div class="child"></div> </div> </div> </body> </html>
;)
вот еще один способ без использования
calc()
.// 4 PER ROW // 100 divided by 4 is 25. Let's use 21% for width, and the remainder 4% for left & right margins... .child { margin: 0 2% 0 2%; width: 21%; } // 3 PER ROW // 100 divided by 3 is 33.3333... Let's use 30% for width, and remaining 3.3333% for sides (hint: 3.3333 / 2 = 1.66666) .child { margin: 0 1.66666% 0 1.66666%; width: 30%; } // and so on!
вот и все. Вы можете получить фантазии с размерами, чтобы получить более эстетические размеры, но это идея.