Удалить зазор между столбцами в компоновке flex [дубликат]
этот вопрос уже есть ответ здесь:
у меня возникли проблемы с макетом flexbox. То, что я пытаюсь достичь, - это то, как позиционируется изображение ниже. Однако, используя margin и padding, я могу переместить элементы в правильное место без чего-то радикального.
Я, вероятно, приближаюсь к этому неправильно. Если бы кто-то мог дать мне совет и объяснить, как это сделать правильно, это было бы здорово.
каркас
Как правильно теперь
HTML-код
<div style="background: grey;">
<div class="parent-container" style="flex-direction: column; align-items: center; margin: 10px;">
<div class="aelia-text child33">
The first of it's kind, to<br/>
create a better customer<br/>
journey with reduced<br/>
collection waiting time and<br/>
a special moment that makes<br/>
even the most jet-lagged<br/>
shopper smile.
</div>
<div class="child33">
<div class="img-wrapper" ng-style="{'background-image':'url(/assets/Aelia_Robot_highres006.jpg)'}"></div>
</div>
<div class="child33">
<div class="img-wrapper" ng-style="{'background-image':'url(/assets/AELIA_IMAGE.jpg)'}"></div>
</div>
</div>
</div>
в CSS
.aelia-text {
background: white;
color: black;
font-size: 1.5vw;
font-family: portland-medium-font;
-ms-flex-pack: center;
justify-content: center;
-ms-flex-align: center;
align-items: center;
display: -ms-flexbox;
display: flex;
}
.child33 {
position: relative;
-ms-flex-positive: 1;
flex-grow: 1;
height: 50%;
width: 33.3%;
max-width: calc(100% * (1/3));
margin: 0;
position: relative;
-ms-flex-flow: nowrap row;
-o-flex-flow: nowrap row;
flex-flow: nowrap row;
border: 0;
outline: 0;
}
.parent-container {
display: -ms-flexbox;
display: flex;
font-size: 0;
margin: 0;
padding: 0;
border: 0;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
height: 92vh;
width: 100vw;
}
.img-wrapper {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-size: cover;
}
2 ответов
ваш гибкий контейнер (.parent-container
) имеет трех детей (элементы flex).
у каждого ребенка есть класс child33
.
контейнер flex имеет значение flex-direction: column
и flex-wrap: wrap
, что означает, что элементы будут выравниваться по вертикали и обертываться при необходимости, формируя новые столбцы.
.parent-container {
display: -ms-flexbox;
display: flex;
font-size: 0;
margin: 0;
padding: 0;
border: 0;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
height: 92vh;
width: 100vw;
}
<div class="parent-container" style="flex-direction: column; align-items: center; ...">
таким образом, в вашем изображении у вас есть макет из двух столбцов: два элемента в первом столбце, а третий элемент обертывается, чтобы сформировать второй.
причина обоих столбцов разбросаны является ли начальная настройка контейнера flex align-content: stretch
. Это означает, что несколько строк в оси Креста будет распределено равномерно по всей длине контейнера.
у вас уже есть align-items: center
в коде. Но это работает только на одной линии Flex контейнеров. Когда есть несколько линий в поперечной оси, вам нужно использовать align-content
.
Итак, переопределите настройку по умолчанию, добавив align-content: center
в свой контейнер.
body { margin: 0; }
.parent-container {
display: flex;
flex-direction: column;
align-items: center;
flex-wrap: wrap;
height: 92vh;
width: 100vw;
align-content: center; /* NEW */
}
.aelia-text {
display: flex;
justify-content: center;
align-items: center;
background: white;
color: black;
font-size: 1.5vw;
font-family: portland-medium-font;
}
.child33 {
flex-grow: 1;
height: 50%;
width: 33.3%;
max-width: calc(100% * (1/3));
margin: 0;
position: relative;
}
.img-wrapper {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
/* added image for demo; original code had relative URI */
background-image: url(http://i.imgur.com/60PVLis.png);
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
<div style="background: grey;">
<div class="parent-container">
<div class="aelia-text child33">
The first of it's kind, to
<br/> create a better customer
<br/> journey with reduced
<br/> collection waiting time and
<br/> a special moment that makes
<br/> even the most jet-lagged
<br/> shopper smile.
</div>
<div class="child33">
<div class="img-wrapper"></div>
</div>
<div class="child33">
<div class="img-wrapper"></div>
</div>
</div>
</div>
jsFiddle
спецификации:
в Multi-line контейнере гибкого трубопровода (даже одном с только одиночной линией), поперечный размер каждой линии минимальный размер, необходимый для flex элементы на линии (после выравнивания из-за
align-self
), и линии выровнены внутри контейнера flex сalign-content
свойство. в однолинейном контейнере гибкого трубопровода, поперечный размер линии является поперечным размером контейнера flex иalign-content
нет эффект. основной размер строки всегда совпадает с основным размером окно содержимого контейнера flex.8.4. Упаковка гибкий строки:
align-content
собственностьна
align-content
свойство выравнивает линии контейнера flex внутри контейнер гибкого трубопровода когда дополнительный космос в крест-оси, подобно тому, какjustify-content
выравнивает отдельные элементы в пределах главная ось. обратите внимание, что это свойство не влияет на однострочный flex контейнер.(курсив)
если я правильно понимаю, вы хотите центрировать оба столбца посередине. С .parent-container
и flex-direction: column;
в вашем встроенном стиле вам понадобится justify-content: center;
.
если вы посмотрите в разделе 'Основы & Terminologiy в модели CSS-уловок, которые, вы увидите, что justify-content играет с главной осью flexbox и align-items играет с поперечной осью. Поэтому, когда ваше направление flexbox находится в Столбцах, и вы хотите горизонтально центрировать столбцы, вам нужно выровнять их в главная ось или с атрибутом justify-content.
но если вы хотите сделать свой кросс-браузер flexbox, вам понадобится следующее:
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;