0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В прошлых уроках и упражнениях мы использовали достаточно простые селекторы. Они позволяли выбрать элементы, к которым будут применены CSS правила. Вы уже умеете выбирать элемент по его тегу, классу, идентификатору и найти вложенный элемент.</p>
1
<p>В прошлых уроках и упражнениях мы использовали достаточно простые селекторы. Они позволяли выбрать элементы, к которым будут применены CSS правила. Вы уже умеете выбирать элемент по его тегу, классу, идентификатору и найти вложенный элемент.</p>
2
<p>CSS дает намного большие возможности по выбору элементов. В этом уроке мы изучим самые популярные селекторы второго и третьего уровня спецификации W3C. В конце урока будут оставлены ссылки на спецификации, в которых вы сможете узнать и о других селекторах.</p>
2
<p>CSS дает намного большие возможности по выбору элементов. В этом уроке мы изучим самые популярные селекторы второго и третьего уровня спецификации W3C. В конце урока будут оставлены ссылки на спецификации, в которых вы сможете узнать и о других селекторах.</p>
3
<h2>Выбор соседнего элемента</h2>
3
<h2>Выбор соседнего элемента</h2>
4
<p>Ранее использование селекторов указывало, какой конкретно элемент мы хотим выбрать и где он находится относительно своих родительских блоков. В большинстве случаев этого достаточно для точного указания элемента, но бывают случаи, когда нужно выбрать соседний элемент, а не вложенный. Например,</p>
4
<p>Ранее использование селекторов указывало, какой конкретно элемент мы хотим выбрать и где он находится относительно своих родительских блоков. В большинстве случаев этого достаточно для точного указания элемента, но бывают случаи, когда нужно выбрать соседний элемент, а не вложенный. Например,</p>
5
<p>По условию нашей задачи элемент timer полностью зависит от блока time. Предположим, что стиль таймера меняется в зависимости от наличия элемента с классом time. Есть несколько путей решения такой задачи:</p>
5
<p>По условию нашей задачи элемент timer полностью зависит от блока time. Предположим, что стиль таймера меняется в зависимости от наличия элемента с классом time. Есть несколько путей решения такой задачи:</p>
6
<ol><li>Положить оба элемента в единого родителя и дать им уникальные классы для разных ситуаций.</li>
6
<ol><li>Положить оба элемента в единого родителя и дать им уникальные классы для разных ситуаций.</li>
7
<li>Воспользоваться селектором соседнего элемента.</li>
7
<li>Воспользоваться селектором соседнего элемента.</li>
8
</ol><p>Чаще всего, именно первый вариант будет предпочтительным. При этом вы не раз столкнетесь с ситуациями, когда это невозможно. Такое может происходить при динамическом добавлении элементов на страницу. И тут на помощь приходят селекторы.</p>
8
</ol><p>Чаще всего, именно первый вариант будет предпочтительным. При этом вы не раз столкнетесь с ситуациями, когда это невозможно. Такое может происходить при динамическом добавлении элементов на страницу. И тут на помощь приходят селекторы.</p>
9
<p>В CSS существует два селектора для выбора элемента, который лежит рядом с другим элементом:</p>
9
<p>В CSS существует два селектора для выбора элемента, который лежит рядом с другим элементом:</p>
10
<ul><li>A + B - выбор элемента<em>B</em>, который находится непосредственно после элемента<em>A</em>. Такой селектор называется<em>смежным</em>или<em>соседним</em></li>
10
<ul><li>A + B - выбор элемента<em>B</em>, который находится непосредственно после элемента<em>A</em>. Такой селектор называется<em>смежным</em>или<em>соседним</em></li>
11
<li>A ~ B - выбор элемента<em>B</em>, который находится на том же уровне вложенности, что и<em>A</em>. При этом они имеют общего родителя и все элементы<em>B</em>находятся после элемента<em>A</em>в HTML. Такой селектор называется<em>родственным</em>.</li>
11
<li>A ~ B - выбор элемента<em>B</em>, который находится на том же уровне вложенности, что и<em>A</em>. При этом они имеют общего родителя и все элементы<em>B</em>находятся после элемента<em>A</em>в HTML. Такой селектор называется<em>родственным</em>.</li>
12
</ul><p>Для примера выше отлично подойдет смежный селектор. Элементы time и timer идут друг за другом и являются дочерними элементами одного и того же родителя. Стилизуем элемент timer в зависимости от существования элемента time:</p>
12
</ul><p>Для примера выше отлично подойдет смежный селектор. Элементы time и timer идут друг за другом и являются дочерними элементами одного и того же родителя. Стилизуем элемент timer в зависимости от существования элемента time:</p>
13
<p><a>Codepen</a></p>
13
<p><a>Codepen</a></p>
14
<p>Родственный селектор позволяет немного усложнить ситуацию. Ведь теперь будет возможность не просто выбрать соседний элемент, а элемент, лежащий на том же уровне. Изменим пример, который позволит наглядно продемонстрировать возможность родственного селектора.</p>
14
<p>Родственный селектор позволяет немного усложнить ситуацию. Ведь теперь будет возможность не просто выбрать соседний элемент, а элемент, лежащий на том же уровне. Изменим пример, который позволит наглядно продемонстрировать возможность родственного селектора.</p>
15
<p>Схематически CSS будет выглядеть следующим образом:</p>
15
<p>Схематически CSS будет выглядеть следующим образом:</p>
16
<p><a>Codepen</a></p>
16
<p><a>Codepen</a></p>
17
<h2>Селекторы по атрибуту</h2>
17
<h2>Селекторы по атрибуту</h2>
18
<p>Атрибуты - неизменная часть работы с HTML. Они не всегда несут в себе семантический смысл как, например, атрибуты alt, title, class, id и так далее.</p>
18
<p>Атрибуты - неизменная часть работы с HTML. Они не всегда несут в себе семантический смысл как, например, атрибуты alt, title, class, id и так далее.</p>
19
<p>HTML позволяет добавлять любые пользовательские атрибуты и работать с ними. Пользовательскими считаются такие атрибуты, которые мы определяем сами. Их не существует в документациях, спецификациях. Они нужны для разработчиков, чтобы удобнее обращаться к элементам или отделять похожие элементы. Целей может быть много и, с приобретением опыта, особенно при работе с языком<em>JavaScript</em>, вы заметите, что пользовательские атрибуты используются не так редко, как может показаться с самого начала.</p>
19
<p>HTML позволяет добавлять любые пользовательские атрибуты и работать с ними. Пользовательскими считаются такие атрибуты, которые мы определяем сами. Их не существует в документациях, спецификациях. Они нужны для разработчиков, чтобы удобнее обращаться к элементам или отделять похожие элементы. Целей может быть много и, с приобретением опыта, особенно при работе с языком<em>JavaScript</em>, вы заметите, что пользовательские атрибуты используются не так редко, как может показаться с самого начала.</p>
20
<p>Для стилизации таких элементов в CSS существуют специальные селекторы.</p>
20
<p>Для стилизации таких элементов в CSS существуют специальные селекторы.</p>
21
<p>Самый простой селектор по атрибуту просто выбирает элемент по его атрибуту. В<em>CSS</em>атрибут записывается внутри квадратных скобок, это и будет самым простым селектором по атрибуту. Для демонстрации создадим свой атрибут data-full-screen - это будет пользовательский атрибут и вы его не найдете в документациях. Для тренировки можете его назвать совершенно другим образом - смысл действий от этого не изменится:</p>
21
<p>Самый простой селектор по атрибуту просто выбирает элемент по его атрибуту. В<em>CSS</em>атрибут записывается внутри квадратных скобок, это и будет самым простым селектором по атрибуту. Для демонстрации создадим свой атрибут data-full-screen - это будет пользовательский атрибут и вы его не найдете в документациях. Для тренировки можете его назвать совершенно другим образом - смысл действий от этого не изменится:</p>
22
<p><a>Codepen</a></p>
22
<p><a>Codepen</a></p>
23
<p>Атрибут может указываться в сочетании с другими селекторами. Например, выше мы указали атрибут data-full-screen с элементом section. Такой селектор указывает на все элементы section с атрибутом data-full-screen. Если указать только атрибут, то такой селектор будет указывать на любые элементы с этим атрибутом:</p>
23
<p>Атрибут может указываться в сочетании с другими селекторами. Например, выше мы указали атрибут data-full-screen с элементом section. Такой селектор указывает на все элементы section с атрибутом data-full-screen. Если указать только атрибут, то такой селектор будет указывать на любые элементы с этим атрибутом:</p>
24
<p>Можно выбирать не только по названию атрибута, но и по его значению. В этом случае рядом с именем атрибута указывается его значение в следующем синтаксисе:</p>
24
<p>Можно выбирать не только по названию атрибута, но и по его значению. В этом случае рядом с именем атрибута указывается его значение в следующем синтаксисе:</p>
25
<p>С опытом вы заметите, что многие JavaScript-библиотеки работают именно с пользовательскими атрибутами. Это позволяет добиться изолированности компонентов и их удобного переиспользования.</p>
25
<p>С опытом вы заметите, что многие JavaScript-библиотеки работают именно с пользовательскими атрибутами. Это позволяет добиться изолированности компонентов и их удобного переиспользования.</p>
26
<p>Бывают ситуации, когда в HTML есть группа элементов с одинаковыми именами атрибутов, но с разными значениями. Причем некоторые из них могут быть похожи друг на друга, составляя части одного компонента. Например,</p>
26
<p>Бывают ситуации, когда в HTML есть группа элементов с одинаковыми именами атрибутов, но с разными значениями. Причем некоторые из них могут быть похожи друг на друга, составляя части одного компонента. Например,</p>
27
<p>Все три секции, по своей логике, будут иметь похожее оформление. Можно добавить всем одинаковый класс, но существует одна проблема: если элементы добавляются динамически, с помощью JS, то есть вероятность существования такого же класса внутри проекта. Это приведет к коллизии, когда один селектор перебьет свойства другого. Поэтому и используются атрибуты.</p>
27
<p>Все три секции, по своей логике, будут иметь похожее оформление. Можно добавить всем одинаковый класс, но существует одна проблема: если элементы добавляются динамически, с помощью JS, то есть вероятность существования такого же класса внутри проекта. Это приведет к коллизии, когда один селектор перебьет свойства другого. Поэтому и используются атрибуты.</p>
28
<p>Все три секции имеют одинаковую приставку<em>catalog</em>. Это поможет отделить их от остальных названий секций с помощью конструкции [data-nm-section^="catalog"]. Такой селектор выберет все элементы с атрибутом data-nm-section, значение которого<strong>начинается</strong>с catalog.</p>
28
<p>Все три секции имеют одинаковую приставку<em>catalog</em>. Это поможет отделить их от остальных названий секций с помощью конструкции [data-nm-section^="catalog"]. Такой селектор выберет все элементы с атрибутом data-nm-section, значение которого<strong>начинается</strong>с catalog.</p>
29
<p><a>Codepen</a></p>
29
<p><a>Codepen</a></p>
30
<p>Есть еще несколько похожих конструкций, которые ищут "вхождение" подстроки в строку:</p>
30
<p>Есть еще несколько похожих конструкций, которые ищут "вхождение" подстроки в строку:</p>
31
<ul><li>[data-nm-section$="catalog"] - вхождение подстроки в конце значения атрибута.</li>
31
<ul><li>[data-nm-section$="catalog"] - вхождение подстроки в конце значения атрибута.</li>
32
<li>[data-nm-section*="catalog"] - вхождение подстроки в любом месте значения атрибута.</li>
32
<li>[data-nm-section*="catalog"] - вхождение подстроки в любом месте значения атрибута.</li>
33
</ul><p>Выражение "вхождение подстроки в строку" стоит понимать следующим образом: строка b является частью строки a. Например, возьмем фразу "Съешь еще этих мягких французских булок, да выпей чаю" и фразу "французских булок". Фраза "французских булок" входит в предложение "Съешь еще этих мягких французских булок, да выпей чаю", поэтому говорится, что подстрока входит в строку.</p>
33
</ul><p>Выражение "вхождение подстроки в строку" стоит понимать следующим образом: строка b является частью строки a. Например, возьмем фразу "Съешь еще этих мягких французских булок, да выпей чаю" и фразу "французских булок". Фраза "французских булок" входит в предложение "Съешь еще этих мягких французских булок, да выпей чаю", поэтому говорится, что подстрока входит в строку.</p>