Как работать вложенные flexboxes
У меня есть небольшой пример вложенной установки flexbox: http://jsfiddle.net/ThomasSpiessens/MUrPj/12/
<div class="box fullSize">
<div class="boxHeader">HEADER</div>
<div class="boxContent">
<div class="box fullSize">
<div class="boxHeader moregreen">INNER HEADER</div>
<div class="boxContent red">CONTENT CONTENT CONTENT</div>
<div class="boxFooter moreblue">INNER FOOTER</div>
</div>
</div>
<div class="boxFooter">FOOTER</div>
</div>
В этом примере применяется следующее:
-
Классы
- CSS 'box используют свойства flexbox, на которые, как говорят, растут только boxContent. Для конкретных свойств и значений CSS, пожалуйста, проверьте скрипт.
- 'fullSize' просто устанавливает ширину и высоту до 100%.
Когда вы проверяете эту скрипту с Firefox и Chrome, вы получаете разные результаты. В Firefox он делает то, что, я полагаю, должен делать, это растяжение внутреннего .boxContent. Однако в Chrome внутренний .boxContent не растягивается.
У кого-нибудь есть идея, как сделать контент растянутым в Chrome? возможно, какое-либо свойство webkit отсутствует?
Ответы
Ответ 1
Если вам не нужен дополнительный div, удалите его. Иногда существует разница между высотой элемента и его длиной вдоль главной оси (ориентация столбца), что вызывает некоторую путаницу здесь. В принципе, похоже, что он выше, чем полагает браузер, поэтому height: 100%
работает не так, как вы ожидаете (я не уверен, какое поведение в этом случае правильно).
По какой-либо причине продвижение элемента в контейнер flex работает.
http://jsfiddle.net/MUrPj/14/
<div class="box fullSize">
<div class="boxHeader">HEADER</div>
<div class="boxContent box">
<div class="boxHeader moregreen">INNER HEADER</div>
<div class="boxContent red">CONTENT CONTENT CONTENT CONTENT CONTENT CONTENT CONTENT CONTENT CONTENT CONTENT CONTENT</div>
<div class="boxFooter moreblue">INNER FOOTER</div>
</div>
<div class="boxFooter">FOOTER</div>
</div>
Ответ 2
Этот вопрос был связан для конкретной проблемы: как сделать так, чтобы вложенные элементы во флекс-боксе заполняли всю высоту? Краткий ответ:
Используйте display:flex
на ребенке и избегайте height:100%
. Вот упрощенный пример кода.
CourtDemone объяснил это хорошо (подробнее здесь):
В соответствии со спецификацией flexbox значение align-self:stretch
(по умолчанию для элемента flex'd) изменяет только используемое значение свойства cross-size элемента (в данном случае, height). Однако проценты рассчитываются на основе указанного значения родительского свойства перекрестного размера, а не его используемого значения.
Ответ 3
Я нашел решение, не удаляя лишний div.
Вам нужно сделать boxContent относительным положением и содержащим его блоком абсолютным.
Прикрепив дополнительный класс CSS к внутреннему div:
<div class="boxContent">
<div class="box fullSize innerBox">
и следующий css:
.boxContent {
...
position: relative;
}
.innerBox{
position: absolute;
top: 0px;
bottom: 0px;
}
здесь обновленный jsfiddle: http://jsfiddle.net/MUrPj/223/
Этот вопрос довольно старый, но это может быть полезно для будущих посетителей
Ответ 4
Этот JsFiddle является минимально необходимым CSS-атрибутом для работы вложенных флексбоксов. Я показал это для столбца; если вы делаете это в строке, удалите два "flex-direction: column" s. [В этом тривиальном примере их удаление ничего не изменит, потому что в каждом flexbox есть только один дочерний элемент. Но как только вы добавите второго ребенка, вы будете работать либо в строке, либо в столбце.]
HTML:
<div id="e1">
<div id="e2">
<div id="e3">
</div>
</div>
</div>
CSS:
html, body, #e1 {
height: 100%; width: 100%;
}
#e1 {
background-color: #ff0000;
display: flex;
flex-direction: column;
}
#e2 {
background-color: #ffff00;
/* Try removing either of the next 2 lines - a box collapses. */
flex: 1;
display: flex;
flex-direction: column;
}
#e3 {
background-color: #00ff00;
flex: 1;
}
По моему опыту, Safari 13 (как для MacOS, так и для iOS) более привередлив (вложенные гибкие элементы), чем Chrome 77, Firefox 69 или даже Edge 18.
Хотя в этом простом примере все 3 реагируют одинаково, у меня сложилась более сложная ситуация, которая работала во всех, кроме Safari. Тем не менее, код, показанный здесь, особенно две строки в #e2
после "Попробуйте удалить любую из следующих двух строк", - это суть того, что заставило мою более сложную ситуацию работать в Safari.
Кроме того, в случае возникновения трудностей первым шагом является удаление всех атрибутов высоты "процентов" внутри вложенных элементов. Здесь это означает, что #e1
разрешено иметь height: 100%
- это в контексте его родителя, который не является гибким контейнером. Но #e2
и #e3
не должны объявлять %
высоты.
Вложенные элементы с высотой , которые не относятся к их родительскому элементу (пиксели, ems, vh), хороши, AFAIK. Обратите внимание, что vh работает, потому что он относится к размеру окна, который не зависит от высоты вложенных flex-контейнеров (# e1, # e2). Так что логика вычислений легко понять браузером.