# Знаете ли вы селекторы? CSS3-селекторы -- фундаментально полезная вещь. Даже если вы почему-то (старый IE?) не пользуетесь ими в CSS, есть много фреймворков для их кросс-браузерного использования CSS3 из JavaScript. Поэтому эти селекторы необходимо знать. [cut] ## Основные виды селекторов Основных видов селекторов всего несколько: **Селекторы можно комбинировать, записывая последовательно, без пробела:** ## Отношения В CSS3 предусмотрено четыре вида отношений между элементами. Самые известные вы наверняка знаете: Есть и два более редких: Посмотрим их на примере HTML: ```html

Балтославянские языки

    ...Вложенный OL/LI список языков...
``` CSS-селекторы: ```css ##languages li { color: brown; /* потомки #languages, подходящие под селектор LI */ } ##languages > li { color: black; /* первый уровень детей #languages подходящих под LI */ } ##e-slavic { font-style: italic; } *!* ##e-slavic ~ li { /* правые соседи #e-slavic с селектором LI */ color: red; } */!* ##latvian { font-style: italic; } ##latvian * { /* потомки #latvian, подходяще под * (т.е. любые) */ font-style: normal; } *!* ##latvian + li { /* первый правый сосед #latvian с селектором LI */ color: green; } */!* ``` Результат: [iframe src="relation" border="1" edit link] ## Фильтр по месту среди соседей При выборе элемента можно указать его место среди соседей. Список псевдоклассов для этого: Пример использования для выделения в списке: [iframe src="nthchild" border="1" edit link] ```css /*+ hide="CSS к примеру выше" */ li:nth-child(2n) { /* чётные */ background: #eee; } li:nth-child(3) { /* 3-ий потомок */ color: red; } ``` ## Фильтр по месту среди соседей с тем же тегом Есть аналогичные псевдоклассы, которые учитывают не всех соседей, а только с тем же тегом: Они имеют в точности тот же смысл, что и обычные `:first-child`, `:last-child` и так далее, но во время подсчёта игнорируют элементы с другими тегами, чем тот, к которому применяется фильтр. Пример использования для раскраски списка `DT` "через один" и предпоследнего `DD`: [iframe src="nthchild-type" border="1" edit link] ```css /*+ hide="CSS к примеру выше" */ dt:nth-of-type(2n) { /* чётные dt (соседи с другими тегами игнорируются) */ background: #eee; } dd:nth-last-of-type(2) { /* второй dd снизу */ color: red; } ``` Как видим, селектор `dt:nth-of-type(2n)` выбрал каждый второй элемент `dt`, причём другие элементы (`dd`) в подсчётах не участвовали. ## Селекторы атрибутов
На атрибут целиком
На начало атрибута
На содержание
На конец атрибута
## Другие псевдоклассы ## Псевдоэлементы ::before, ::after "Псевдоэлементы" -- различные вспомогательные элементы, которые браузер записывает или может записать в документ. При помощи *псевдоэлементов* `::before` и `::after` можно добавлять содержимое в начало и конец элемента: ```html Обратите внимание: содержимое добавляется внутрь LI. ``` Псевдоэлементы `::before`/`::after` добавили содержимое в начало и конец каждого `LI`. [smart header="`:before` или `::before`?"] Когда-то все браузеры реализовали эти псевдоэлементы с одним двоеточием: `:after/:before`. Стандарт с тех пор изменился и сейчас все, кроме IE8, понимают также современную запись с двумя двоеточиями. А для IE8 нужно по-прежнему одно. Поэтому если вам важна поддержка IE8, то имеет смысл использовать одно двоеточие. Версии IE7- не понимают этих селекторов. [/smart] ## Практика Вы можете использовать информацию выше как справочную для решения задач ниже, которые уже реально покажут, владеете вы CSS-селекторами или нет.