Краткий курс о CSS селекторах
Всем привет! Тут я попытаюсь объяснить, какие есть селекторы в css. Эти знания позволят вам лучше таргетировать рекламу на своём сайте, размещая её в самых неожиданных местах!
Чтобы узнать, какие селекторы используются на вашем сайте, нажмите правой кнопкой мыши по нужному элементу и выберите пункт "Просмотреть код". Или воспользуйтесь комбинацией ctrl+shift+i
, чтобы открыть консоль разработчика в браузере.
В конце статьи приведены примеры задач от пользователей и решения от меня. Задавайте свои вопросы в комментариях, после модерации задачи будут добавлены в статью.
Селекторы
CSS3-селекторы – фундаментально полезная вещь.
Даже если вы почему-то не пользуетесь ими в CSS, есть много фреймворков для их кросс-браузерного использования CSS3 из JavaScript.
Поэтому эти селекторы необходимо знать.
Основные виды селекторов
Основных видов селекторов всего несколько:
*
– любые элементы.div
– элементы с таким тегом.#id
– элемент с даннымid
..class
– элементы с таким классом.[name="value"]
– селекторы на атрибут.:visited
– «псевдоклассы», остальные разные условия на элемент.
Селекторы можно комбинировать, записывая последовательно, без пробела:
.c1.c2
– элементы одновременно с двумя классамиc1
иc2
a#id.c1.c2:visited
– элементa
с даннымid
, классамиc1
иc2
, и псевдоклассомvisited
Отношении
В CSS3 предусмотрено четыре вида отношений между элементами.
Самые известные вы наверняка знаете:
div p
– элементыp
, являющиеся потомкамиdiv
.div > p
– только непосредственные потомки
Есть и два более редких:
div ~ p
– правые соседи: всеp
на том же уровне вложенности, которые идут послеdiv
.div + p
– первый правый сосед:p
на том же уровне вложенности, который идёт сразу послеdiv
(если есть).
Использование символа решётки позволяет обратиться к уникальному идентификатору элемента id
.
Идентификатор id
должен быть уникальным и может использоваться на странице только один раз.
На скриншоте ниже обозначен
id
шапки сайта, чтобы обратиться к нему нужно написать#header
Синтаксис
.X
Символ точки позволяет обратиться к классу элемента - class
Отличие селектора class
от id
в том, что id должен быть уникальным и не может использоваться для выбора нескольких элементов на странице, а у class'а таких проблем нет.
На скриншоте ниже обозначен
class
контейнера хлебных крошек, чтобы обратиться к нему нужно написать.breadcrumbs
X
Что вы будете делать, если вам понадобится выбрать только элементы определённого типа
? В этом случае вы не сможете использовать id
или class
, вам на помощь придёт селектор по типу элемента. Если вам нужны все обычные списки, просто используйте ul
, а для нумерованного списка ol
.
X Y
Ещё один из часто используемых типов селекторов - это контекстный
селектор. Он используется для выбора элементов, соответствующих определённому контексту. Например, вместо того, чтобы выбрать все элементы списка li
на странице, вам нужно выбрать только элементы из нумерованного спика ol
, в таком случае используйте селектор ol li
.
X > Y
Разница между селекторами X Y
и X > Y
в том, что в последнем примере мы выберем только прямого потомка.
Селектор #container > ul
выберет только тот элемент ul
, который является прямым потомком элемента div
с id
равным container
. Он не выберет, например, элемент ul
, являющийся потомком первого элемента li
.
X + Y
Это соседний селектор. Он поможет нам выбрать только тот элемент, который следует сразу же за указанным элементом. Если нужно выбрать только первый параграф текста, следующий сразу за тэгом ul
, то используйте селектор ul + p
.
X ~ Y
Этот селектор похож на X + Y
, но он менее строгий. Соседний селектор (ul + p
) выберет только первый элемент, следующий сразу же за указанным элементом. Селектор X ~ Y
выберет все элементы p
, расположенные после элемента ul
.
X[title]
Это селектор атрибутов. Он выберет только те ссылки, у которых имеется указанный атрибут title
.
X[href="foo"]
Селктор выберет тот элемент, у которого атрибут href
равен foo.
X[href*="nettuts"]
Звёздочка означает, что значение должно быть частью указанного атрибута.
X[href^="http"]
Символ ^
в регулярных выражениях используется для указания начала строки. Если необходимо выбрать все ссылки, начинающиеся с http
, то можете использовать код из примера сверху.
X[href$=".jpg"]
Мы используем символ из регулярных выражений $
, который указывает на конец строки. В этом случае нужно найти все ссылки на фото, т.е. путь в них должен заканчиваться на .jpg
.
X:not(selector)
Псевдокласс отрицания
бывает очень полезен. Представьте, что вам нужно выбрать все тэги div, кроме одного с id
равным container
. Код выше сделает именно это.
X:nth-child(n)
Псевдокласс :nth-child
решает проблему выбора конкретного элемента в стеке.
:nth-child
принимает в качестве параметра число, но отсчёт ведётся не от нуля. Если вам нужен второй по счёту элемент, используйте li:nth-child(2)
.
Вы можете использовать этот псевдокласс для выбора нескольких элементов. Например, li:nth-child(4n)
позволит нам выбрать каждый четвертый элемент списка.
X:nth-last-child(n)
Представьте, что у вас есть огромный список ul
, и вам нужно выбрать только третий элемент с конца. Вместо того, чтобы писать li:nth-child(397)
, вы можете использовать псевдокласс :nth-last-child
.
Этот метод работает аналогично :nth-child
. Отличие в том, что отсчёт элементов ведётся с конца.
X:first-child
Этот псевдокласс позволит нам выбрать только первый дочерний элемент.
X:last-child
В отличие от :first-child
, селектор :last-child
выберет последний дочерний элемент.
Примеры
- Задача от пользователя: Миш, есть ситуация, может подскажешь решение. Я вывожу блок рекламы перед списком, перед видео и после заголовка h2, или h3. Бывает так, что список, или видео попадают сразу перед заголовком. В итоге у меня висит реклама перед списком/видео, потом идет заголовок и сразу реклама после него, выходит много рекламы. Может есть какая-то хитрая конструкция селектора?
Решение:h2:not( ul+h2 ):not( p:has( iframe )+h2 ), h3:not( ul+h3 ):not( p:has( iframe )+h3 )
- Задача от пользователя: Помогите вывести блок после ссылки, в которой есть картинка
Решение:a:has( img )
- Задача от пользователя: Нужно вывести блок после первого и/или второго параграфа, которые следует за
h2
Решение:h2 + p
иh2 + p + p
- Задача от пользователя: Привет! Можно ли в плагине выводить рекламу, к примеру, после каждого
h2
, но кроме первого?
Решение:h2:not( :first-of-type )
- Задача от пользователя: А если 1 и 2й пропустить, то h2:not(:first-of-type)(:second-of-type) не будет работать?)
Решение: нет,h2:not( :nth-of-type( 1 ) ):not( :nth-of-type( 2 ) )
так будет понятнее :) - Задача от пользователя: Подскажите пожалуйста, как вывести рекламный блок под вторым подзаголовком, причём любым, что будет вторым Н2, Н3, Н4
Решение:h2, h3, h4, h5, h6