Как не отображать ::after содержимое, если один дочерний элемент у родителя?
Не существует способа CSS (сегодня, но с помощью родительского селектора это может когда-нибудь) удалить псевдо на основе количества гибких элементов, даже если это дочерний элемент и действует как гибкий элемент, он все равно не может быть явным нацелен на что-либо еще, кроме как через своего родителя.
Простым обходным решением было бы использование левого поля в сочетании с transform
, когда есть только 1 элемент, здесь используется селектор only-child
.
Можно было бы использовать и position: relative; left: 50%
, хотя margin-left
на одну строку меньше
Это будет работать с любым количеством элементов, независимо от их размера.
Фрагмент стека
.main {
background: #999;
margin: 0 auto;
width: 500px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.box {
background: #7ab9d7;
color: #555;
height: 30px;
width: 30%;
margin-bottom: 30px;
text-align: center;
font-size: 30px;
padding-top: 120px;
}
.main::after {
height: 0;
width: 30%;
content: "";
}
.main div:only-child { /* added rule */
margin-left: 50%;
transform: translateX(-50%);
}
<div class="main">
<div class="box">1</div>
</div>
<br>
<div class="main">
<div class="box">1</div>
<div class="box">1</div>
</div>
<br>
<div class="main">
<div class="box">1</div>
<div class="box">1</div>
<div class="box">1</div>
<div class="box">1</div>
</div>
<br>
Обновлено на основе комментария, где, если есть 2 элемента, они также должны располагаться по центру.
Чтобы добиться этого с помощью существующей разметки/CSS, нам также необходимо использовать псевдоним ::before
.
С парой умных CSS-селекторов мы можем подсчитать если есть 1 или 2 элемента.
Это работает так, когда 1 или 2 элемента, используется автоматическое поле, а со свойством order
элементы позиционируются после ::after
, который теперь имеет ширину 100% и переместит элементы в новую строку, и там они не будут быть затронуты либо псевдо.
Для 3 или более элементов они будут располагаться перед обоими псевдо-элементами, где ::before
теперь будет действовать так же, как ::after
в исходном решении, и элементы выравнивания по левому краю в последней строке.
демонстрация скрипта
Фрагмент стека
.main {
background: #999;
margin: 0 auto;
width: 500px;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.box {
background: #7ab9d7;
color: #555;
height: 30px;
width: 30%;
margin-bottom: 30px;
text-align: center;
font-size: 30px;
padding-top: 120px;
}
.main::before {
height: 0;
width: 30%;
content: "";
order: 1;
}
.main::after {
height: 0;
width: 100%;
content: "";
order: 2;
}
/* new rules */
.main div:only-child, /* if 1 only */
.main div:first-child:nth-last-child(2) + div { /* if 2, the 2nd*/
order: 3;
margin-left: auto;
margin-right: auto;
}
.main div:first-child:nth-last-child(2) { /* if 2, the 1st */
order: 3;
margin-left: auto;
}
<div class="main">
<div class="box">1</div>
</div>
<br>
<div class="main">
<div class="box">1</div>
<div class="box">2</div>
</div>
<br>
<div class="main">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
</div>
<br>
<div class="main">
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
</div>
person
Ason
schedule
08.10.2017
.box
, вы хотите удалить псевдоэлемент или центрировать его? - person karthikaruna   schedule 08.10.2017