Как объединить псевдо-элементы с псевдо-классами?
как объединить псевдо-элементы, такие как :after
С псевдо-классами, такими как :hover
и :not
?
li {
margin-bottom: 10px;
}
li:after {
content: '';
display: block;
width: 0;
height: 3px;
background: #009688;
transition: width .8s;
}
li:hover:after {
width: 100%;
}
<ul>
<li>first</li>
<li>second</li>
<li>third</li>
<li>forth</li>
<li>fifth</li>
</ul>
как я могу исключить, например, первый и третий элементы в списке из этого эффекта наведения?
2 ответов
вы можете :not()
псевдо-класс :nth-child()
селектор такой.
li {
margin-bottom: 10px;
}
li:after {
content: '';
display: block;
width: 0;
height: 3px;
background: #009688;
transition: width .8s;
}
li:not(:nth-child(1)):not(:nth-child(3)):hover:after {
width: 100%;
}
<ul>
<li>first</li>
<li>second</li>
<li>third</li>
<li>forth</li>
<li>fifth</li>
</ul>
нет никаких особых правил сочетания псевдо-классы и псевдо-элементы, кроме одного правила, которое говорит на сложный селектор может быть только один псевдо-элемент, и он должен появиться в самом конце. Псевдоклассы могут быть записаны в любом порядке-порядок простых селекторов не меняет значения составного селектора. Обратите внимание, что псевдо-элемент, в отличие от псевдо-класса, не является простым селектором.
вы можете написать любой из
li:not(:nth-child(1)):not(:nth-child(3)):hover:after
или
li:hover:not(:nth-child(1)):not(:nth-child(3)):after
или
li:hover:not(:nth-child(3)):not(:nth-child(1)):after
или, черт, даже
li:not(:nth-child(3)):hover:not(:nth-child(1)):after
и вы получите тот же результат (при условии, что браузер не глючит), пока :after
, псевдо-элемент, появляется последнее (и li
, сначала появится селектор типов).
по соглашению большинство авторов предпочитают размещать структурные псевдоклассы, такие как :nth-child()
, перед динамическими псевдоклассами, такими как :hover
. Но это совершенно личное. предпочтения; это не имеет значения для браузера.