К простым, или основным в плане их используемости селекторам можно отнести селектор класса и id. То есть ваши элементы браузером легко находятся и легко стилизуются. Однако далеко не всегда этого достаточно.
Что, если вам необходимо стилизовать столбцы таблицы? Поменять цвет у разных блоков с одним и тем же классом? Стилизовать элементы, не имеющих дочерних элементов или, наоборот, имеющих вполне определённые теги внутри?
Для этого существует масса селекторов, о которых мы здесь поговорим. В этой статье нам нужно будет разобраться с:
- дочерними селекторами
- соседними селекторами
- родственными селекторами
- селекторами атрибутов
- cелекторами псевдоклассов
- селекторами псевдоэлементов
Дочерние селекторы
Селекторы читаются справа налево, т.е. правила будут назначены для последнего элемента в цепочке.
Контекстный селектор (селектор потомка)
Контекстный селектор - это селектор типа родитель → вложенный элемент, которые предполагают, что правила, описанные в них, будут работать только в такой связке. Т.е. фактически это выборка потомков элемента? причем абсолютно неважно, насколько глубоко вложен дочерний элемент в родительский.
Контекстный селектор parent child: .menu a, footer li, .navbar li .nav-item. Если цепочка состоит из более, чем 2-х селекторов, то правила применятся только, если у вас в разметке есть все указанный элементы.
|
1 2 3 4 5 6 |
ul li { margin-bottom: 10px; color: blueviolet; } .menu a { display: block} |
В этих примерах форматирование назначено для элементов <li> внутри <ul>, но оно не будет работать для <li> внутри <ol>. Тут вы должны понимать, что такое форматирование сработает и для основного, и для вложенного списка <ul>, сколько бы их не было.
Второй селектор говорит о том, что мы назначаем свойство display: block для ссылки внутри элемента с классом .menu. При этом неважно, насколько глубоко вложен тег <a> в элемент с классом .menu.
See the Pen Context selector by Elen (@ambassador)on CodePen.
В этом примере вы можете увидеть, как свойства для ul li применяются только для нумерованных списков, а свойства для .menu → a работают и в случае с div.menu → lа, и в случае ul.menu → li → a, но в последнем мы видим смещение блока ссылок вправо за счет того, что в списках по умолчанию задан padding-left: 40px.
Дочерний селектор
Дочерний селектор, в отличие от контекстного, не распространяется на произвольную глубину вложенности. Он регламентирует правила только для тех элементов, которые вложены в указанный. В нем используется знак > для определения селектора, который и является дочерним.
В примере ниже селектор #wrap > div управляет только теми div-ами, которые вложены непосредственно в div#wrap, но на более глубоко вложенные div эти свойства не действуют. А вот селектор .row div уже сработал как для div.col, так и для вложенного в него div. Попробуйте на вкладке CSS для .row div поставить знак > между селекторами (.row > div) - и посмотрите, что будет.
See the Pen context selector & child by Elen (@ambassador) on CodePen.
Селекторы одного уровня вложенности
Соседний селектор
Соседний селектор позволяет указать на элемент, который находится рядом с текущим на том же уровне вложенности, например, h2 + p укажет на абзац, идущий сразу за заголовком <h2>.
|
1 2 3 4 5 |
h2 + p { color: #0b0; font-style: italic; text-indent: 20px; } |
Пример вживую:
See the Pen Next-sibling combinator by Elen (@ambassador) on CodePen.
К соседним селекторам можно отнести также .logo + ul, .label + input[type="text"] , li:first-of-type + li и т.д.
Родственный селектор
Родственный селектор похож на соседний, но, в отличие от соседнего элементы находятся на одном и том же уровне вложенности, но не обязательно располагаются друг за другом.
Вид селектора: elemA ~ elemB — правила записываются для elemB. При этом оба элемента имеют общего родителя и все элементы типа elemB находятся после элемента типа elemA в HTML.
|
1 2 3 4 5 |
h3 ~ p { color: #0b7; font-style: italic; text-indent: 20px; } |
В предыдущем примере вы найдете, что все абзацы, а не только первый, которые идут после заголовка 3-го уровня, имеют другой цвет и курсивное начертание.
Селекторы атрибутов
Атрибуты - это своего рода "расширения" для тегов. Т.е. это некие свойства, без которых часть элементов могут отлично существовать (например, универсальные атрибуты title, style, id), или обязательные атрибуты, как src и alt для тега <img> или href для <a>. Селекторы атрибутов записываются в квадратных скобках и имеют довольно много вариантов:
[title] {color: red}- указываем только атрибут, без значения - для всех элементов, у которых есть такой атрибутa[target]{border-bottom: 1px dotted #900} - для конкретных тегов, у которых есть такой атрибут (пример с аккордеоном).input[type="password"] {}- тег с атрибутом, имеющим конкретное значение[class^="col-"] {width: 30$%}- для элемента с атрибутом class="col-"(варианты:"col-1", "col-md-4", "col-inner-block")[class*="item"] {display: inline-block}- атрибутclassсодержит слово "item" в любом месте (варианты:item-blockилиpic-item)[class$="item"]- атрибутclassсодержит слово "item" в конце (т.е. "block-item", "icon-item", "menuitem")input[type="text"][required]- элемент с 2-мя атрибутами
В примере ниже вы найдете варианты использования селекторов атрибутов, перечисленные выше.
See the Pen Attributes selector by Elen (@ambassador) on CodePen.
Селекторы псевдоклассов
Псевдоклассов на самом деле очень много. Селектор псевдокласса начинается с двоеточия и чаще всего указывается после элемента или класса. Например:
|
1 2 3 |
a:hover { color: red } input:checked { border: 1px solid grey; } div:is(.blue) {display:none} |
Все селекторы псевдоклассов условно можно разделить на подгруппы:
- псевдоклассы, определяющие состояние элементов, в том числе ссылок;
- псевдоклассы для элементов форм:
- псевдоклассы, имеющие отношение к дереву элементов страницы;
- псевдоклассы, указывающие язык текста.
К группе, определяющей состояние элементов, относятся такие псевдоклассы, как:
:hover- применяется при наведении на ссылку или на любой другой элемент страницы:active- применяется к активным ссылкам, т.е., когда на ссылку нажали, но пока не отпустили курсор:link- применяется к непосещенным ссылкам:visited- применяется к посещенным ссылкам:target- представляет уникальный целевой элемент с подходящимidURL-фрагментом.
Пример использования псевдокласса :hover.
See the Pen Glowing Icon Hover Effect by Diego Lopes (@dig-lopes) on CodePen.
Пример псевдокласса :hover + использование родственного селектора типа .tooltip:hover ~ .popup-bg для отображения всплывающей подсказки. Для ее появления наведите курсор на знак вопроса.
See the Pen Emerging Tooltip by Mikael Ainalem (@ainalem) on CodePen.
Псевдоклассы для элементов форм:
:focus- применяется к элементу при получении им фокуса:checked- применяется к таким элементам форм, как переключатели (radio), флажки (checkbox) и пункты списка (option), когда они находятся в положениеcheckedилиselected. Этот псевдокласс, например, позволяет управлять переключателями, создавая переходы между слайдами.:required- находит любые элементы типа<input>, имеющие атрибутrequiredи позволяет показывать пользователям, что поля должны быть корректно заполнены перед отправкой формы.:valid- находит любые элементы типа<input>или<form>, контент которых валиден в соответствии с типом поля. Позволяет менять внешний вид полей при правильном вводе данных.:invalid- находит любые элементы типа<input>или<form>, контент которых невалиден в соответствии с типом поля. Позволяет менять внешний вид полей при неверном вводе данных.:in-rangeнаходит элементы (<input type="range|number">), значение которых соответствует указанному для них диапазону ограничений. Он позволяет странице показывать, когда значение элемента находится в допустимом диапазоне.
Примеры использования псевдоклассов для элементов форм вы найдете в отдельной статье.
Группа псевдоклассов, имеющих отношение к дереву элементов страницы
Самая многочисленная группа псевдоэлементов:
:first-child- первый дочерний элемент;:last-child- последний дочерний элемент;:only-child- единственный элемент у своего родителя;:nth-child(n)- n-ый элемент у своего родителя;:nth-child(even)- четный элемент у своего родителя;:nth-child(odd)- нечетный элемент у своего родителя;:first-of-type- первый элемент определенного типа;:last-of-type- последний элемент определенного типа (подробнее в статье);:only-type- единственный элемент определенного типа;:empty- выбирает элементы, не имеющим дочерних элементов, включая текстовые узлы или любые теги;:is(header, main, footer)- проверяет, является ли селектор указанным в скобках типом, классом и т.п. (подробнее в статье);:where(header, main, footer) - проверяет, является ли селектор указанным в скобках типом, классом и т.п.:not(header, main, footer)- проверяет, что селектор не является указанным в скобках типом, классом и т.п. (подробнее в статье);:has(.card-image)- селектор, имеющий внутри дочерний элемент указанного в скобках типа.
Выбор языка
:lang(en) - определяет язык, который используется на html-странице или в ее фрагменте.
В скобках вы должны указать нужный вам язык. Хорошо работает на мультиязычных сайтах, например для указания стилей при использовании плагина Polylang для WordPress.
Селекторы псевдоклассов можно сочетать:
|
1 2 3 4 5 6 |
p:first-child{ color: red; } p:first-child:hover{ color: green; } |
В примере ниже вы найдете стили для псевдоклассов :nth-child, :first-child, :last-child, :checked, которые применяются к мобильному меню:
See the Pen Untitled by Elen (@ambassador) on CodePen.
Там же есть использование родственного селектора.
Селекторы псевдоэлементов
Псевдоэлемент — это ключевое слово, добавляемое к селектору, которое позволяет стилизовать определённую часть выбранного элемента.
Псевдоэлемент позволяют управлять внешним видом не только самих элементов, но и выделением текста, например. Селектор псевдоэлемента начинается с двойного двоеточия.
Виды селекторов псевдоэлементов:
::selection- управляет стилями выделенного текста;::placeholder- внешний вид атрибутаplaceholderв текстовых полях;::after- добавляет контент перед закрывающим тегом;::before- добавляет контент после открывающего тега;::backdropэто прямоугольник с размерами окна, который создается сразу же после отрисовки любого элемента в полноэкранном режиме. Это включает элементы, установленные в полноэкранный режим с помощью Fullscreen API и элементы<dialog>.::first-letter- стили для первой буквы в элементе;::first-line- стили для первой строки в элементе;::marker- стили для маркеров списков.
Использование псевдоэлемента ::selection и псевдокласса :focus.
See the Pen Snake highlight by Mikael Ainalem (@ainalem) on CodePen.
Описание селекторов псевдоэлементов с примерами вы найдете в отдельной статье. Кроме того, при стилизации любых элементов стоит также учитывать приоритет селекторов.
Проверка понимания селекторов
Пройдите тест от Paulina Hetman: ответьте на 25 вопросов на понимание CSS-селекторов и узнайте свой результат.
See the Pen QUIZ: Well aimed? How well do you know CSS selectors? by Paulina Hetman (@pehaa) on CodePen.