Прокладка-нижняя/верхняя часть в макете flexbox
У меня есть flexbox макет, содержащий два элемента. Один из них использует padding-bottom:
#flexBox {
border: 1px solid red;
width: 50%;
margin: 0 auto;
padding: 1em;
display: flex;
flex-direction: column;
}
#text {
border: 1px solid green;
padding: .5em;
}
#padding {
margin: 1em 0;
border: 1px solid blue;
padding-bottom: 56.25%; /* intrinsic aspect ratio */
height: 0;
}
<div id='flexBox'>
<div id='padding'></div>
<div id='text'>Some text</div>
</div>
Ответы
Ответ 1
Обновление апрель 2016
(все еще действует в мае 2017 года)
Спецификации были обновлены до:
Процентные поля и прокладки на гибких элементах могут быть разрешены либо:
- их собственная ось (разрешение влево/вправо разрешено по ширине, верхнее/нижнее разрешение против высоты) или
- встроенная ось (левая/правая/верхняя/нижняя часть всех разрешает по ширине)
источник: Модуль гибкого модульного модуля CSS Уровень 1
Это означает, что chrome IE FF и Edge (даже если они не имеют такого же поведения) следуют рекомендациям specs.
Спекуляции также говорят:
Авторы должны избегать использования процентов в прокладках или полях на гибких полностью, так как они будут иметь разное поведение в разных браузеры. [источник]
Работа вокруг:
Вы можете обернуть первый дочерний элемент контейнера flex в другом элементе и поместить padding-bottom
на второй дочерний элемент:
#flexBox {
border: 1px solid red;
width: 50%;
margin: 0 auto;
padding: 1em;
display: flex;
flex-direction: column;
}
#text {
border: 1px solid green;
padding: .5em;
}
#padding {
margin: 1em 0;
border: 1px solid blue;
}
#padding > div {
padding-bottom: 56.25%; /* intrinsic aspect ratio */
}
<div id='flexBox'>
<div id='padding'><div></div></div>
<div id='text'>Some text</div>
</div>
Ответ 2
Принятый ответ правильный, но я улучшил решение, используя псевдоэлемент вместо добавления нового элемента в HTML.
Пример: http://jsfiddle.net/4q5c4ept/
HTML:
<div id='mainFlexbox'>
<div id='videoPlaceholder'>
<iframe id='catsVideo' src="//www.youtube.com/embed/tntOCGkgt98?showinfo=0" frameborder="0" allowfullscreen></iframe>
</div>
<div id='pnlText'>That cool! This text is underneath the video in the HTML but above the video because of 'column-reverse' flex-direction. </div>
</div>
CSS
#mainFlexbox {
border: 1px solid red;
width: 50%;
margin: 0 auto;
padding: 1em;
display: flex;
flex-direction: column-reverse;
}
#pnlText {
border: 1px solid green;
padding: .5em;
}
#videoPlaceholder {
position: relative;
margin: 1em 0;
border: 1px solid blue;
}
#videoPlaceholder::after {
content: '';
display: block;
/* intrinsic aspect ratio */
padding-bottom: 56.25%;
height: 0;
}
#catsVideo {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
Ответ 3
Я использовал vh вместо% отлично работал в Safari, Firefox и Edge
Ответ 4
<div class="flex-parent">
<div class="flexchild">
<div class="pad"></div>
</div>
</div>
.flex-child{
height:100%;
}
.padd{
padding-top:100% /* write 100%, or instead your value*/;
}