Добавьте разделительную линию между гибкими элементами с равным пространственным распределением
У меня есть список с различными элементами, которые имеют автоматическую ширину (в моем случае не может быть задана фиксированная ширина). я использую justify-content: space-between
потому что мой первый элемент должен начинаться в начале контейнера, а мой последний элемент - в конце.
Все вышеперечисленное работает нормально, но всякий раз, когда я пытаюсь добавить строку между этими элементами списка, проблемы начинают появляться. У меня нет никакого способа определить, сколько пикселей или% я должен расположить эти линии. Есть ли способ "динамически" расположить линии между различными элементами списка или нет?
Используемый нами HTML-файл недоступен для редактирования, поскольку он отображается в используемой нами CMS.
Вот что у меня есть:
Это то, что я пытаюсь достичь
Вот код, который у меня есть
html {
box-sizing: border-box;
}
.Container {
max-width: 70%;
margin-right: auto;
margin-left: auto;
background: blue;
padding-top: 20px;
padding-bottom: 20px;
}
.Flex {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
list-style: none;
margin: 0;
padding: 0;
}
.Flex-item {
background: red;
position: relative;
}
.Flex-item:after {
content: "";
position: absolute;
background: white;
width: 1px;
height: 40px;
top: 50%;
transform: translateY(-50%);
}
<div class="Container">
<ul class="Flex">
<li class="Flex-item">Lorem</li>
<li class="Flex-item">consectetur</li>
<li class="Flex-item">vestibulum</li>
<li class="Flex-item">nec</li>
<li class="Flex-item">condimentum</li>
</ul>
</div>
7 ответов
Я использую это решение в проекте, над которым я работаю.
Это устанавливает justify-content: space-between;
на гибком контейнере и flex: 1 1 auto;
на детей с левой рамкой на всех детей, кроме первого.
Я изменил ваш пример CSS, чтобы вы могли посмотреть. Я не был уверен, что у вас будет фоновый цвет для детей, поэтому я просто использовал высоту строки, чтобы получить большие границы.
html {
box-sizing: border-box;
}
.Container {
max-width: 70%;
margin-right: auto;
margin-left: auto;
background: blue;
padding-top: 20px;
padding-bottom: 20px;
}
.Flex {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
list-style: none;
margin: 0;
padding: 0;
}
.Flex-item {
flex: 1 1 auto;
background: red;
position: relative;
text-align: center;
line-height: 40px;
}
.Flex-item + .Flex-item {
border-left: solid 1px white;
}
<div class="Container">
<ul class="Flex">
<li class="Flex-item">Lorem</li>
<li class="Flex-item">consectetur</li>
<li class="Flex-item">vestibulum</li>
<li class="Flex-item">nec</li>
<li class="Flex-item">condimentum</li>
</ul>
</div>
Без изменений в HTML.
Вы можете заставить это работать, используя вложенный flexbox
es - я понимаю, что вы не можете изменить разметку, но, по крайней мере, вы должны обернуть содержимое li
в span
как у меня здесь:
Делать
.flex-item
такжеflexbox
с текстом вspan
(это будет иметь красный фон сейчас) и разделитель как:after
элементПрименять
flex-grow
а такжеflex-shrink
до 1 иflex-basis
вauto
дляFlex-item
,flex: 0
до концаFlex-item
а такжеmargin-auto
к:after
также способствует эффекту.
Демо может объяснить это лучше - см. Ниже:
html {
box-sizing: border-box;
}
.Container {
max-width: 70%;
margin-right: auto;
margin-left: auto;
background: blue;
padding-top: 20px;
padding-bottom: 20px;
}
.Flex {
display: flex;
justify-content: space-between;
list-style: none;
margin: 0;
padding: 0;
}
.Flex-item {
display: flex;
justify-content: space-between;
align-items: center;
flex: 1 1 auto;
}
.Flex-item span {
background: red;
}
.Flex-item:not(:last-child):after {
content: "";
border: 1px solid white;
height: 40px;
margin: auto;
}
.Flex-item:last-child {
flex: 0;
}
<div class="Container">
<ul class="Flex">
<li class="Flex-item">
<span>Lorem</span>
</li>
<li class="Flex-item">
<span>consectetur</span>
</li>
<li class="Flex-item">
<span>vestibulum</span>
</li>
<li class="Flex-item">
<span>nec</span>
</li>
<li class="Flex-item">
<span>condimentum</span>
</li>
</ul>
</div>
Вместо :after
попробуйте использовать набор <li class="separator"></li>
.Container {
max-width: 70%;
margin: 0 auto;
background: blue;
}
.Flex {
display: flex;
justify-content: space-between;
list-style: none; padding: 20px 0; margin:0;
}
.Flex-item {
background: red;
}
.separator {
background: white; width: 1px;
}
<div class="Container">
<ul class="Flex">
<li class="Flex-item">Lorem</li>
<li class="separator" aria-hidden="true" role="presentation"></li>
<li class="Flex-item">consectetur</li>
<li class="separator" aria-hidden="true" role="presentation"></li>
<li class="Flex-item">vestibulum</li>
<li class="separator" aria-hidden="true" role="presentation"></li>
<li class="Flex-item">nec</li>
<li class="separator" aria-hidden="true" role="presentation"></li>
<li class="Flex-item">condimentum</li>
</ul>
</div>
PS: да, я пытался использовать display: list-item
изначально на :after
псевдо но наах.
Я думаю, что единственный способ сделать это с помощью flexbox - это обернуть текст в новый элемент, как это сделал @Kukkuz в другом ответе.
Без этой дополнительной оболочки вы все равно можете получить разделители с равными интервалами, но красный фон не ограничивается длиной текста.
Ниже приведен пример с:
- Никаких изменений в HTML.
- Нет необходимости в псевдоэлементах.
- Нет необходимости в абсолютном позиционировании.
Если цвет фона для текста не требуется, удалите его, и это все, что вам нужно.
.Flex {
display: flex;
list-style: none;
margin: 0;
padding: 0;
}
.Flex-item {
flex: 1 1 auto;
background: red;
}
.Flex-item {
text-align: center;
}
.Flex-item:first-child {
text-align: left;
}
.Flex-item:last-child {
text-align: right;
}
.Flex-item + .Flex-item {
border-left: 1px solid white;
}
.Container {
max-width: 70%;
margin-right: auto;
margin-left: auto;
background: blue;
padding-top: 20px;
padding-bottom: 20px;
}
<div class="Container">
<ul class="Flex">
<li class="Flex-item">Lorem</li>
<li class="Flex-item">consectetur</li>
<li class="Flex-item">vestibulum</li>
<li class="Flex-item">nec</li>
<li class="Flex-item">condimentum</li>
</ul>
</div>
Если вы можете добавить span
вокруг текста, который позволит вам ограничить красный фон длиной текста, тогда все готово:
.Flex {
display: flex;
list-style: none;
margin: 0;
padding: 0;
}
.Flex-item {
flex: 1 1 auto;
display: inline-flex;
justify-content: center;
}
.Flex-item span {
background-color: red;
}
.Flex-item:first-child span {
margin-right: auto;
}
.Flex-item:last-child span {
margin-left: auto;
}
.Flex-item + .Flex-item {
border-left: 1px solid white;
}
.Container {
max-width: 70%;
margin-right: auto;
margin-left: auto;
background: blue;
padding-top: 20px;
padding-bottom: 20px;
}
<div class="Container">
<ul class="Flex">
<li class="Flex-item"><span>Lorem</span></li>
<li class="Flex-item"><span>consectetur</span></li>
<li class="Flex-item"><span>vestibulum</span></li>
<li class="Flex-item"><span>nec</span></li>
<li class="Flex-item"><span>condimentum</span></li>
</ul>
</div>
Если ты пьянешь flex
Вы можете получить что-то близкое к тому, что вы пытаетесь сделать без какой-либо дополнительной разметки.
Это включает в себя псевдо, order
Селекторы & css3 (отлично в сторону flex
).
http://codepen.io/gc-nomade/pen/BpzYWP
body {
margin:0;
}
.Flex, .Flex-item {
display:flex;
padding:0.5em 0;
margin:0;
}
.Flex-item {
flex:1;/*spray them evenly*/
}
.Flex-item:before,
.Flex-item:after {/* add pseudos to fill extra space */
content:'';
flex:1;/* thats where it takes room not use by the text */
margin:-1em 0;/* grow them taller */
border-right:solid 1px white;
}
.Flex-item:first-child:before
{
order:2;/* put both pseudo after text*/
flex:.5;/* shrink that one can be .75 to .25 */
border:none; /* remove the border useless for the show */
}
.Flex-item:last-child:after {
order:-1;/* put both pseudos before text */
flex:0.5;/* shrink that one can be .75 to .25 */
}
.Flex-item:first-child + .Flex-item:before ,
.Flex-item:nth-last-child(1):after{
border:none; /* remove the border useless for the show */
}
body, :after, :before {
background:tomato;/* pseudo will hide li background */
}
li {
background:turquoise;
}
/* give some space around the text */
.Flex-item:first-child {
padding-left:1em;
}
.Flex-item:last-child {
padding-right:1em;
}
.Flex-item:before {
border:none;/* we do not need those after all */
margin-right:1em;
}
.Flex-item:after {
margin-left:1em;
}
.Flex-item:first-child:before {
margin:-1em 0;
}.Flex-item:last-child:after {
margin:-1em 0;
}
<div class="Container">
<ul class="Flex">
<li class="Flex-item">Lorem</li>
<li class="Flex-item">consectetur</li>
<li class="Flex-item">vestibulum</li>
<li class="Flex-item">nec</li>
<li class="Flex-item">condimentum</li>
</ul>
</div>
Попробуй это
html {
box-sizing: border-box;
}
.Container {
max-width: 90%;
margin-right: auto;
margin-left: auto;
background: blue;
padding-top: 11px;
padding-bottom: 50px;
}
.Flex {
list-style: none;
margin: 0;
padding: 0;
position: relative;
left: 50%;
transform: translateX(-50%);
float: left;
}
.Flex-item {
position: relative;
float: left;
padding: 5px 10px;
border-right:1px solid #fff;
}
.Flex-item:last-child{border-right:none;}
.Flex-item >div{
margin:0 5px;
background:red;
padding:5px;
}
<div class="Container">
<ul class="Flex">
<li class="Flex-item"><div>
Lorem
</div></li>
<li class="Flex-item"><div>
consectetur
</div></li>
<li class="Flex-item"><div>
vestibulum
</div></li>
<li class="Flex-item"><div>
nec
</div></li>
<li class="Flex-item"><div>
condimentum
</div></li>
</ul>
</div>