Псевдоклассы в CSS

Псевдоклассы в CSS

Ну кто из нас не знает, что такое псевдоселекторы (или псевдоклассы) в CSS? Да-да, это то, что обычно пишут после селектора через двоеточие. Самые известные псевдоклассы это :link, :hover, :visited и :active.

Такие конструкции в CSS, как правило, можно встретить в каждом файле стилей, но их использование ограничивается лишь описанием состояния ссылок и не более того.

В общем, тема псевдоселекторов еще не обсуждалась на нашем сайте, так что самое время приступить ;-)

Итак, как я уже сказал, веб-разработчики используют псевдоклассы в основном для задания стилей ссылок, например :link для непосещенной ссылки, :hover для ссылки при наведении, :active для нажатой и удерживаемой ссылки и :visited для посещенной. Кстати, у нас есть отличная статья про оформление ссылок, рекомендую.

Идем дальше. Как вы думаете, сколько, помимо этих четырех, существует псевдоклассов? :first-child, last-child? Кто еще? Все? А на самом деле всего их 33. Рассмотрим все детально.

Название и назначение псевдоклассов 

  1. :link — отвечает за стили непосещенной ссылки;
  2. :hover — состояние объекта (не обязательно ссылки) при наведении на него мышкой;
  3. :active — состояние активного объекта (например, для ссылки и зажатие ее мышкой);
  4. :visited — состояние посещенной ссылки;
  5. :focus — когда вы используете какой-то объект на страницы, то на нем устанавливается фокус (в случае и текстовым поле это постановка курсора в это поле);
  6. :first-child — первый дочерний элемент текущего элемента;
  7. :last-child — соответственно, последний дочерний элемент чего-то;
  8. :only-child — применяет стиль к элементу, если он единственный дочерний элемент;
  9. :nth-child() — какой-то по счету с начала дочерний элемент, например p:nth-child(4);
  10. :nth-last-child() — аналогично, только отчет с конца; интересно, что в этом и предыдущем селекторах можно задавать не только конкретные цифры, но и счетность, к примеру вот так: ul li:nth-last-child(2n+1);
  11. :lang() — если у элемента указан язык (с помощью атрибута lang, например lang="en"), то этот элемент можно выбрать так;
  12. :root — дает указание применить стиль к корневому элементу (в html документе это тег <html>);
  13. :not() — дает ограничение на применение стилей по селектору (то есть селектор .red-block:not(div) применит указанный стиль ко всем элементам с классом .red-block, только есть этот элемент не <div>);
  14. :empty — выбирает пустые элементы;
  15. :first-of-type — применяет стиль к первому элементу этого типа, то есть если у вас есть два дива, стиль будет работать только для первого из них;
  16. :last-of-type — аналогично предыдущему, только для последнего элемента;
  17. :only-of-type — применяет стили к элементы, если он имеет уникальный тип внутри своего родителя;
  18. :nth-of-type() — выбирает указанный по счету с начала элемент текущего типа;
  19. :nth-last-of-type() — тоже самое, но отсчет с конца;
  20. :target — например, если у вас адрес имеет вид index.html#anchor, то этот псевдо класс задаст правило для элемента с id="anchor";
  21. :enabled — выбирает активные инпуты;
  22. :disabled — а этот неактивные;
  23. :checked — отмеченные чекбоксы и выбранные радиобаттоны;
  24. :indeterminate — для радиобаттонов и чекбоксов опеределяет состояние, когда они «никакие», то есть ни выбраны, ни не выбраны (ужас как написал ;-)
  25. :default — элемент по-умолчанию, например кнопка отправки формы;
  26. :valid — стиль для правильного инпута (когда указана data type в HTML 5);
  27. :invalid — когда, соответственно, инпут невалиден;
  28. :in-range — когда значение инпута находиться в заданных границах (type="range", задан min и max, но это все только в HTML 5);
  29. :out-of-range — когда не попадает в границы;
  30. :required — все обязательные поля;
  31. :optional — все необязательные;
  32. :read-only — те элементы, которые доступны только для чтения;
  33. :read-write — для чтения и записи.

Ну что, классно? Сообщения о валидации формы можно без JS выводить, подсвечивать активные поля, писать меньше кода — эх, красота была бы, если это бы добро работало везде ;-) Мечтания в сторону, переходим к таблице поддержки браузерами.

Поддержка псевдоселекторов в разных браузерах

Как вы понимаете, ограниченность использование псевдоклассов не так просто появилась, вызвана она частичной их поддержкой в браузерах. Чего уж говорить про какой-нибудь :out-of-range, если даже :active достаточно странно работает в нашем любимом ИЕ.

В ячейке указано либо нет (совсем нет), либо версия или билд, начиная с которого псевдокласс поддерживается.

  Gecko
(Firefox)
Trident
(IE)
Webkit
(Chrome/Safari)
Presto
(Opera)
:link 1.0 3.0 85 7.0
:visited 1.0 3.0 85 7.0
:active 1.0 Нет 85 7.0
:hover 1.0 7.0 419.3 7.0
:focus 1.0 8.0 Yes 7.0
:first-child 1.0 7.0 85 7.0
:lang() 1.2 8.0 525 7.5
:root 1.0 Нет 85 9.5
:not() 1.0 Нет 85 9.5
:empty 1.8 Нет 412 9.5
:first-of-type 1.9.1 Нет 525 9.5
:last-child 1.0 Нет 525 9.5
:last-of-type 1.9.1 Нет 525 9.5
:only-child 1.8 Нет 525 9.5
:only-of-type 1.9.1 Нет 525 9.5
:nth-child 1.9.1 Нет 525 9.5
:nth-last-of-type 1.9.1 Нет 525 9.5
:nth-last-child 1.9.1 Нет 525 9.5
:nth-of-type 1.9.1 Нет 525 9.5
:target 1.3 Нет 525 Частично
:enabled 1.8 Нет 525 9.0
:disabled 1.8 Нет 525 9.0
:checked 1.0 Нет 525 9.0
:indeterminate 1.9.2 Нет 522 Нет
:default 1.9 Нет Нет 9.0
:valid 1.8 Нет Нет 9.0
:invalid 1.8 Нет Нет 9.0
:in-range 1.8 Нет Нет 9.0
:out-of-range 1.8 Нет Нет 9.0
:required Нет Нет Нет 9.0
:optional Нет Нет Нет 9.0
:read-only Нет Нет Нет Нет
:read-write Нет Нет Нет Нет

Вот так, весь кайф обламали ;-(

Хотя, никто же не запрещает вам использовать псевдоклассы. Просто делайте ваши стили так, что если браузер пользователя не поддерживает тот или иной псевдоселектор, он (пользователь) не страдал от этого, то есть все жизненно важные для пользования сайтом вещи должны работать как часы и без псевдоклассов.

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 41

жон
Статья так себе.
Не имеют смысла эти псевдоклассы, раз эксполитр не поддерживает их.
Нафиг надо.
#
жон
Sergey
Статья отличная. Я пользовался такими псевдоклассами, но о трети этого списка не знал... Исчё раз спасибо! :)))
DonkeyHot
Большое спасибо за статью.
Верстаю давно, но для того, чтобы реализовывать функционал этих селекторов обычно использовал дополнительные классы. Теперь буду умнее :)

Жону по поводу IE: для него всё равно обычно выделяется дополнительная таблица стилей с костылями на каждом шагу, так что использовать описанное можно и нужно.
juice
Спасибо за статью!
на самом деле навряд ли стоит использовать, если только для каких либо внутренних корпоративных проектов, где можно посадить всех на один браузер, а вот для рунета - все таки рано (ие сразу мимо, + несоответсвие по последним позициям списка). Опять же если только кастылями спасаться :)
Алик Кириллович
Почему :hover в списке «Название и назначение псевдо классов» упоминается два раза — под номером 2 и под номером 4:

2. «:hover — состояние объекта (не обязательно ссылки) при наведении на него мышкой»

4. «:hover — состояние элемента при наведении на него»
Алик Кириллович
В списке «Название и назначение псевдо классов» пропущен псевдокласс :visited, а вместо него повторно описан :hover
Switch
А почему :hover 2 раза написан?
Grin
Всем заметившим мой косяк спасибо, все поправил.
Василий
Полностью согласен с 1-ым комментарием, никакого смысла нет. Вот если бы по статистике в России использовали чаще Оперу или Мазилу, то тогда другой разговор. Приходится верстать шаблон без Псевдо классов!
glivera
хороший пост, спасибо
но куда из этого списка подевались такие псевдоклассы как :before и :after?
#
glivera
Андрей
:Нетt() вместо :not в таблице

за статью спасибо.
#
Андрей
Grin
glivera, :before, :after, :first-letter и :first-line это не псевдо классы, а псевдо элементы
glivera
и правда "pseudo-element", гоню:)
#
glivera
Kykyryzo
как же бесит этот IE, нихера не умеет. а как верстать начинаешь...постоянно какие то IE шные баги вылетают
Руслан
"Статья отличная. Я пользовался такими псевдоклассами, но о трети этого списка не знал... Исчё раз спасибо! :)))" - прямо в яблочко. Давай еще. ИЕ да, ненавижу експлоер, вот только какие идиоты им пользуются
i hate photoshop
оу... сколько всего опера поддерживает. не ожидал...)
Тормоз
Странно. В своё время очень внимательно читал спецификации, а всё равно нашёл для себя псевдоклассы, о которых и не подозревал. Спасибо, хороший стимул использовать их в работе.

Ответ фотошопному спамеру: вообще-то Opera, пожалуй, самый передовой браузер. Например, многие элементы и атрибуты HTML5 она поддерживала ещё с версий 9.*.
Грамотей
"Псевдоклассы" пишется слитно. Или через дефис перед прописной буквой.
А в комментах все вроде без ошибок пишут.
#
Грамотей
Очередной вебмастер
Спасибо за статью. И не представлял, что их столько, очень полезная инфа. А насчет IE - все меняется к лучшему, не загорами html 5 и постоянный прогресс браузеров. Тормоза поддерживаю. Opera очень передовой брайзер, хотя мой выбор Mozilla.
B@rmaley.exe
Василий, Вы не поверите...

Опера, все-таки, не очень передовой браузер. Хром и лиса идут быстрее (Хотя я сам пользуюсь оперой).
#
B@rmaley.exe
Тормоз (лень остальное вписывать)
А почему форма меня не помнит? Офигительно неудобно.

B@rmaley.exe, а какая связь с популярностью?
#
Тормоз (лень остальное вписывать)
B@rmaley.exe
Какой еще популярностью?

Кстати, половина селекторов из статьи описаны только в CSS3, который постоянно дополняется и редактируется. Поэтому когда-то этот список был короче.
#
B@rmaley.exe
Гость
:indeterminate оО, не знал про этот класс. Не совсем понятен правда смысл его.
B@rmaley.exe
Гость, это не класс, а псвевдо-селектор.
А смысл его в какой-то мере проиллюстрирован здесь.
В виндовых окошках так обозначаются чекбоксы, состояние которых нельзя выразить точно (Например, атрибут "Только для чтения" для нескольких файлов, среди которых один для чтения, а остальные еще и для записи).
#
B@rmaley.exe
Каблучок
В последней верстке столкнулся с тем что ff и ie по разному понимают стили. С IE сложно, и не факт что все псевдоклассы он будет понимать.
Сандер
Как всегда отличается IE... все понятно.
Лично я пока пользовался только hover, link и visited.
hover отлично идет для вещей вроде
#counters a{opacity:.3;-moz-opacity:.3;filter:alpha(opacity=30);}
#counters a:hover{opacity:1.0;-moz-opacity:1.0;filter:alpha(opacity=100);}

а есть пример использования кросс-браузерного first-child?
B@rmaley.exe
Сандер, что Вы подразумеваете под кроссбраузерным? IE6-7? Если так, то там это дело реализуется expression'ами.
#
B@rmaley.exe
Сандер
Да нет, черт с IE6-7, но ведь из всего этого списка только немногие поддерживает хотя бы IE8 - и вот среди них ни разу не использованный мной first-child. Поэтому first-child условно можно отнести к кросс-браузерным. А вопрос был по примеру его использования.
Lebnik
на заметку :first-child не всегда работает в IE7, при сложной верстке наблюдал как Средство разработчика в осле показывает правильно, а отрендеренно неправильно!
Stac
Есть библиотеки, типа HTML5-now, которые добавляют функции HTML5 в старые несовместимые браузеры.

Так, что HTML5 верстку можно использовать. По крайней мере учиться ее использовать уже пора :)
Upet
Как всегда, Ишак впереди планеты всей... с плохой стороны
Вообще я не использую такое количество псевдоклассов, но прочитал с интересом, да уж, стольких вещей не знал в CSS
#
Upet
GonKon
Сам пользовался только link, visited и hover. Глядя на таблицу, большим и пользоваться не хочеться, ох уж эти баузеры.))Впрочем и нужды особой не возникало.
Статья отличная! ;) Респект!
Sergunik
Я как раз это искал)
Не знал как обозначать энную строчку (в таблице) особым способом. Приходилось ява скриптом проганять и призначать класс.
Теперь мое судоку www.sergunik.name/?p=216 будет быстрее работать:)
Санек
Крутая статья, реально весь кайф обламали, хотабы first-child можна юзать
#
Санек
Санек
у first-child находил очень много применений! такчто не надо
#
Санек
VRS
Спасибо, и не знала что есть столько псевдоклассов ... правда пришлось повозиться, прежде чем удалось выделить цветом 3й по счету родительский пункт многоуровневого меню.
..в закладки :), чтоб не забыть
#
VRS
Константин
Статья хорошая, а IE ф топку, им пользуются только домохозяйки с pentium3 не умеющие даже в редактор текст набрать >:|
Вообще планирую на своих будущих сайта специально не делать поддержку IE, буду размещать картинку с перечеркнутым IE, знаете как на дверях в магазинах делают, типа "вход с напитками воспрещен".
#
Константин
mdErrDX5341
IE или ни IE, что бы серфить в инете это точно ужас, но вот многих устройствах web интерфейс почему то корректно отображается только в IE(((((((((((((
#
mdErrDX5341
Гость
Я использую еще один интересный момент например
ul > li+li {color:red;} - меняет цвет текста с 2-го до конечного элемента li, если написать
ul > li+li+li - то с 3-го, ну и так дальше, иногда такой подход выручает), и это работает в IE7+, FF, в остальных не тестил.
#
Гость
Michael
Используйте http://selectivizr.com/ и будет вам всем счастье.

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler