All CSS Pseudo Classes
Selector | Example | Example description |
---|---|---|
:active | a:active | Selects the active link |
:checked | input:checked | Selects every checked <input> element |
:disabled | input:disabled | Selects every disabled <input> element |
:empty | p:empty | Selects every <p> element that has no children |
:enabled | input:enabled | Selects every enabled <input> element |
:first-child | p:first-child | Selects every <p> elements that is the first child of its parent |
:first-of-type | p:first-of-type | Selects every <p> element that is the first <p> element of its parent |
:focus | input:focus | Selects the <input> element that has focus |
:hover | a:hover | Selects links on mouse over |
:in-range | input:in-range | Selects <input> elements with a value within a specified range |
:invalid | input:invalid | Selects all <input> elements with an invalid value |
:lang(language) | p:lang(it) | Selects every <p> element with a lang attribute value starting with «it» |
:last-child | p:last-child | Selects every <p> elements that is the last child of its parent |
:last-of-type | p:last-of-type | Selects every <p> element that is the last <p> element of its parent |
:link | a:link | Selects all unvisited links |
:not(selector) | :not(p) | Selects every element that is not a <p> element |
:nth-child(n) | p:nth-child(2) | Selects every <p> element that is the second child of its parent |
:nth-last-child(n) | p:nth-last-child(2) | Selects every <p> element that is the second child of its parent, counting from the last child |
:nth-last-of-type(n) | p:nth-last-of-type(2) | Selects every <p> element that is the second <p> element of its parent, counting from the last child |
:nth-of-type(n) | p:nth-of-type(2) | Selects every <p> element that is the second <p> element of its parent |
:only-of-type | p:only-of-type | Selects every <p> element that is the only <p> element of its parent |
:only-child | p:only-child | Selects every <p> element that is the only child of its parent |
:optional | input:optional | Selects <input> elements with no «required» attribute |
:out-of-range | input:out-of-range | Selects <input> elements with a value outside a specified range |
:read-only | input:read-only | Selects <input> elements with a «readonly» attribute specified |
:read-write | input:read-write | Selects <input> elements with no «readonly» attribute |
:required | input:required | Selects <input> elements with a «required» attribute specified |
:root | root | Selects the document’s root element |
:target | #news:target | Selects the current active #news element (clicked on a URL containing that anchor name) |
:valid | input:valid | Selects all <input> elements with a valid value |
:visited | a:visited | Selects all visited links |
❮ Previous
Next ❯
Предотвращение выделения текста
CSS можно использовать ещё и для того, чтобы сделать текст в элементе недоступным для выбора, т.е. запретить выделение текста.
Это плохая идея для основного текста, но будет полезно для элементов управления, которые можно быстро переключать или «гневно щелкать» в настольных браузерах, поскольку двойной щелчок вызывает выбор текста и подсветку его выделения – выглядеть немного странно и дико.
Проверить можно в следующей демонстрации
Обратите внимание, как переключатель слева становится подсвеченным при быстром нажатии, а переключатель справа – нет
See this code Preventing Text Highlights from Rage Clicking on x.xhtml.ru.
Этот метод также работает с виджетами раскрытия содержимого (HTML-элемент ) или фальшивыми кнопками – например, с обработчиком кликов на нём. Правда, использование настоящего элемента предпочтительнее не только с точки зрения семантики и доступности, но и потому, что текст в такой кнопке по умолчанию не может быть выделен, а это позволяет избежать проблемы с самого начала.
Что такое псевдоэлементы в CSS?
Сочетание двух слов – псевдо и элементы – часто может привести к недопониманию, поэтому давайте разберемся, что именно представляют собой псевдоэлементы в CSS (Каскадная таблица стилей).
При использовании CSS для любого веб-элемента мы обычно применяем к нему стиль. Но что, если мы хотим применить стиль только к определенной его части, а не к полному элементу. Я знаю, о чем ты думаешь.
И ответ – ДА. Это возможно с помощью псевдоэлементов. Псевдоэлементы – это компонент CSS, используемый для стилизации определенных частей веб-элемента. Эти псевдоэлементы можно использовать для применения CSS к части или определенной части веб-элемента, например:
- Применение CSS к первой букве элемента
- Применение CSS в первой строке элемента
- Вставка некоторого текста перед текстом элемента
- Вставка некоторого текста после текста элемента
Псевдоэлементы определяются с помощью двойного двоеточия (::), как показано в приведенном ниже синтаксисе:
selector::pseudo-element { property: value; }
Распространенные типы псевдоэлементов в CSS
Прежде чем приступить к работе с псевдоэлементами в Selenium, давайте сначала рассмотрим некоторые часто используемые типы псевдоэлементов в CSS.
Псевдоэлемент::первой строки
Как следует из названия, псевдоэлемент::первой строки в CSS используется для добавления специального стиля CSS только в первую строку текста и может применяться только к элементам уровня блока.
Синтаксис:
selector::first-line { property: value; }
Псевдоэлемент в примере CSS:::псевдоэлемент первой строки
Рассмотрим приведенный ниже HTML-код:
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
{«mode»:»full»,»isActive»:false}
Если вы попытаетесь запустить приведенный выше HTML-файл, вывод будет:
Как вы можете видеть, желаемый зеленый цвет (#00ff00) применяется только к первой строке элемента , и это возможно только с помощью::псевдоэлемента первой строки.
Псевдоэлемент::из первой буквы
Как следует из названия, псевдоэлемент::первая буква в CSS используется для добавления специального стиля CSS только к первой букве текста и может применяться только к элементам уровня блока.
Синтаксис:
selector::first-letter { property: value; }
Псевдоэлемент в примере CSS:::псевдоэлемент из первой буквы
Рассмотрим приведенный ниже HTML-код:
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
Если вы попытаетесь запустить приведенный выше HTML-файл, вывод будет:
Как вы можете видеть, желаемый зеленый цвет (#00ff00) применяется только к первой букве элемента и это возможно только с помощью::псевдоэлемента с первой буквой. и это возможно только с помощью::псевдоэлемента с первой буквой.
::перед псевдо-элементом
Как следует из названия, псевдоэлемент::before в CSS используется для добавления специального стиля CSS перед содержимым любого элемента.
Синтаксис:
selector::before { property: value; }
Псевдоэлемент в примере CSS:::перед псевдоэлементом
Рассмотрим приведенный ниже HTML-код:
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
{«mode»:»full»,»isActive»:false}
Если вы попытаетесь запустить приведенный выше HTML-файл, вывод будет:
Как вы можете видеть, желаемый символ поэтому (∴) применяется перед элементом , и это возможно только с помощью::перед псевдо-элементом.
::после псевдоэлемента
Как следует из названия, псевдоэлемент::after в CSS используется для добавления специального стиля CSS после содержимого любого элемента.
Синтаксис:
selector::after { property: value; }
Псевдоэлемент в примере CSS:::после псевдоэлемента
Рассмотрим приведенный ниже HTML-код:
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
{«mode»:»full»,»isActive»:false}
Если вы попытаетесь запустить приведенный выше HTML-файл, вывод будет:
Как вы можете видеть, желаемый символ поэтому (∴) применяется после элемента , и это возможно только с помощью::после псевдоэлемента.
Аналогично, в CSS доступно гораздо больше псевдоэлементов, таких как:
Псевдоэлемент::маркер
Псевдоэлемент::marker в CSS используется для добавления специального стиля CSS к маркерам списка, таким как неупорядоченные маркеры списка, упорядоченные номера списка и т.д.
Синтаксис:
selector::marker { property: value; }
Псевдоэлемент::выбор
Псевдоэлемент::selection в CSS используется для добавления специального стиля CSS к выбранной пользователем части или контенту.
Синтаксис:
selector::selection { property: value; }
Conclusion
Congrats on making it to the end. As you have seen, the and pseudo-elements can be used in several ways to produce interesting animated effects that give life to our designs.
You can explore these further to create even more complex designs and animations, as there’s so much more that can be done using the and CSS pseudo-elements, and we have only just scratched the surface.
Is your frontend hogging your users’ CPU?
As web frontends get increasingly complex, resource-greedy features demand more and more from the browser. If you’re interested in monitoring and tracking client-side CPU usage, memory usage, and more for all of your users in production, try LogRocket.https://logrocket.com/signup/
LogRocket is like a DVR for web and mobile apps, recording everything that happens in your web app, mobile app, or website. Instead of guessing why problems happen, you can aggregate and report on key frontend performance metrics, replay user sessions along with application state, log network requests, and automatically surface all errors.
Modernize how you debug web and mobile apps — Start monitoring for free.
CSS искусство
Под «CSS-искусством» я подразумеваю простые иконки, созданные с помощью CSS, а не иконки или шрифты. Это работает не для всех значков, которые могут быть в дизайне, но для шевронов, гамбургеров и значков поиска вы можете сохранить активы и передачу файлов и получить возможность изменять цвет, макет, размер или стиль значок на взаимодействиях или пользовательских триггеров.
Вы могли бы также сделать эти эффекты с SVG, но у этого есть больше проблем совместимости (в настоящее время) и может означать больше данных для загрузки пользователем, чтобы произвести тот же самый эффект.
Я создал несколько из них в Codepen и повторно использовал и настраивал их в нескольких проектах.
- Анимированные иконки гамбургеров: codepen.io/wesruv/pen/pEOAJz
- Кнопка закрытия codepen.io/wesruv/pen/pEOAJz
- Иконка RSS- канала codepen.io/wesruv/pen/yOxEYj
- Перетащите значок: codepen.io/wesruv/pen/oxVZmw
- Кнопка поиска: codepen.io/wesruv/pen/ZBvvVK
Я также недавно делал довольно витиеватую инфографику, используя эти методы, хотя это достаточно трудоемко, содержание в них должно быть доступно и оптимизировано для SEO, и, поскольку текст может измениться, мне нужно, чтобы контейнеры были гибкими и на основании копии.
СТЕК ИСКУССТВЕННОГО ИНТЕЛЛЕКТА
Интерактивная графика предназначена для объяснения различных технологий и планирования, которые должны входить в искусственный интеллект.
ДИАГРАММА ДРУЗЕЙ
Графика использовалась для объяснения информации, которая была основной для страницы, к сожалению, в итоге она не выглядела как правильная визуальная метафора.
СВЯЗАННЫЕ КРУГИ
То, что в итоге заменило диаграмму Венна, объясняет, каким образом компания или частное лицо может стать партнером Школы компьютерных наук Карнеги-Меллона.
Небольшой трюк, который я выучил — на более богато украшенном CSS Art, в котором есть небольшие части, которые нужно встретить, — я обычно добавляю div, чтобы содержать элемент. Я сделаю иконку намного больше, чем мне нужно, и использую в div, чтобы уменьшить ее до соответствующего размера. Это позволяет избежать проблем округления субпикселей, из-за которых значок выглядит не так.
Например, на маленьком значке с увеличительным стеклом может быть очень трудно выровнять ручку (диагональная линия) с линзой (кольцом), если значок широкий. Округление пикселей может привести к тому, что ручка прокалывает круг, или может не совпадать с кругом в правильном положении. Работая больше, шире, а затем сжимаясь, масштабируя до , мы избегаем этой проблемы.
Селекторы по псевдо-классам
Псевдоклассы позволяют выбирать элементы на основе их состояния, а не наличия в документе. Они определяются с помощью одинарного двоеточия, за которым следует имя псевдокласса.
Если псевдокласс следует сразу за другим селектором (например, a:link), он будет применен только к целевому селектору. Если между селектором и псевдоклассом есть пробел (a :link), то это два селектора, разделенных комбинатором потомства.
Ниже приведен список наиболее распространенных псевдоклассов и их краткое описание:
- – стилизует непосещенные ссылки.
- – стилизует посещенные ссылки, с некоторыми ограничениями из-за конфиденциальности.
- – стилизует часть документа на основе фрагмента документа в URL, подобно тому, как это делается на Википедии со сносками.
- – стилизует корневой элемент документа, обычно элемент <html>.
- – позволяет выбирать конкретные элементы с помощью математических обозначений или ключевых слов (odd и even), часто используется для создания зебровых полос с помощью CSS.
- – выбирает первый дочерний элемент родительского элемента.
- – выбирает последний дочерний элемент родительского элемента.
- – позволяет выбирать конкретные элементы с помощью математических обозначений и ключевых слов (odd и even) среди группы.
- – стилизует элементы, на которые наведен курсор мыши.
- – выбирает элемент, который в настоящее время “активирован”, обычно посредством щелчка мыши.
- – соответствует элементу, который в данный момент имеет фокус, обычно посредством клавиатуры или щелчка мыши.
- – выбирает любые отключенные элементы (например, элементы формы, радиокнопки и т.д.).
- – выбирает переключатели и флажки в состоянии “выбран” или “отмечен”.
- – выбирает элементы формы, для которых установлен атрибут “required”.
Что такое псевдоэлемент и его назначение
Псевдоэлемент — это дополнение к селектору, с помощью которого можно стилизовать элемент, не определённый в структуре HTML документа. Добавляется он к селектору c помощью символов , т.е. так .
Но нотация с двумя двоеточиями появилась только в CSS3. Это было сделано для того, чтобы в CSS коде можно было очень просто отличить псевдоэлементы от псевдоклассов. До CSS3 псевдоэлементы определялись так же, как и псевдоклассы, т.е. с помощью одного двоеточия. Все современные браузеры принимают для определения псевдоэлементов как одно двоеточие, так и два.
Но если проект не требует поддержку браузера Internet Explorer 8, то рекомендуется в CSS коде для определения псевдоэлементов писать два двоеточия. В противном случае необходимо использовать одно двоеточие, т.к. Internet Explorer 8 не поддерживает запись с .
Обратите внимание, что псевдоэлементы не добавляются в DOM. Поэтому получить псевдоэлемент с помощью JavaScript и с использованием библиотеки jQuery нельзя. Псевдоэлементы применяются на сайте только в оформительских целях, т.е
для добавления к элементам определённых дизайнерских решений. С помощью них не рекомендуется добавлять на сайт важную информацию. Если этих элементов нет в DOM, то к ним нельзя добавить обработчики событий или каким-то другим образом взаимодействовать с ними через JavaScript
Псевдоэлементы применяются на сайте только в оформительских целях, т.е. для добавления к элементам определённых дизайнерских решений. С помощью них не рекомендуется добавлять на сайт важную информацию. Если этих элементов нет в DOM, то к ним нельзя добавить обработчики событий или каким-то другим образом взаимодействовать с ними через JavaScript.
Список псевдоэлементов:
Accessibility
It’s worth talking about how is conveyed by screen readers. According to the W3C spec, is .
Alright, sounds good. But let’s take a closer look at what happens in various cases.
If you’re using or for decorative purposes and have set to (empty string), then screen readers won’t announce them. This is fine!
Screen readers will read text put into . This wasn’t always the case, but it is now… unless you’re still supporting IE11 (sorry). Other folks have shared their results of testing various browser + screen reader combinations here, here, and here. That last one looks bad at first, until you realize all the failures come from IE11 and Firefox 29 (released 2014).
Remember that emojis and symbols count as text. Screen readers will announce them, which can be fine, but can also be awkward if you’re using them as decoration.
Screen readers can recognize images in . In my testing, VoiceOver would announce “image” in Firefox and Safari, and “unlabelled image” in Chrome.
If the image is not decorative, then we’re in a bad spot. We have a meaningful image that is only conveyed as “image”.
If the image is decorative, then someone using a screen reader may not be missing anything important, but they don’t know that! They’ll hear “image” and wonder what they’re missing out on.
The good news is that you can specify alternative text for . This gives us a way to tell screen readers what to announce, similar to setting the attribute on .
It also works with text, so we can tell screen readers how to announce decorative emojis and symbols.
The bad news is that Firefox and Safari do not support alternative text for . In fact, the will invalidate entirely in these browsers. You can work around this by declaring twice. Order is important!
You should also know that text in is unselectable and unsearchable, and images in cannot be right-clicked to get the image context menu. Not a big deal for trivial or decorative things, but I would reconsider before putting lengthy text or important images in .
Creating an animated button using CSS pseudo-elements
For our first project, we’ll start by creating a simple animated button to get a feel for using pseudo-elements to animate. Then, we’ll move on to the more complicated project.
Here is a Codepen of what we will be going through:
See the Pen
animated button by David Herbert (@davehert)
on CodePen.
We’ll start by creating an anchor tag in our HTML mockup that we’ll later style to a button:
<a href="#" class="btn">Hover Me</a>
Here’s our output:
Let’s jump to our CSS file and style this link to look like a typical button:
.btn { text-decoration: none; border: 2px solid #764abc; color: #764abc; padding: 10px 20px; border-radius: 25px; transition: all 1s; position: relative; }
The code should be self-explanatory. We’ve removed the default underline decoration, added a solid border of , and made the color of the button the same as the text. We also added padding to put some space between the text and the border and added a border radius to curve the edges of the button.
Lastly, we added a transition for all properties for a duration of second. For example, any change that occurs to this button should occur smoothly and animate within a second — and set the position to because we intend to put a pseudo-element inside this button.
Remember when I mentioned that to position a child element with absolute position, the parent container has to be set to ? Well, this button will be the parent container. Below is our output:
Now, we are going to create a pseudo-element of this button:
.btn::before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: #764abc; transition: all 1s; }
You must specify the property for a pseudo-element. Otherwise, it will not be shown. We’ve set to an empty string to satisfy this; we do not want any text for our pseudo-element. We set its position to , which removes it from its normal flow (making it overlap the button), and then set the coordinates for and to . This pins the empty pseudo-element to the button at those exact locations.
Afterward, we set the width and height to be exactly 100 percent of the parent, making it the same size as the button itself.
Lastly, we made the pseudo-element’s background the same color as the button and added a transition of second. Below is the output:
As you can see, the pseudo-element overlaps the button because we’ve used an position.
To resolve this, we have to use the property to change their stacking context by pulling the pseudo-element behind the button using a negative value. Then, we use the transform function to position the pseudo-element along the horizontal axis. Providing a value of positions the pseudo-element adjacent to the element, exactly flush on the left-hand side:
.btn::before { /*...previous code */ z-index: -1; transform: translateX(-100%); }
Et voilà:
.btn:hover::before { transform: translateX(0); }
In the code above, we are basically saying that when someone hovers over this button, this pseudo-element should move back to its initial absolute position. Here’s our output:
However, the text is still hidden because the text and the pseudo-element are both the same color. Let’s change the color of the text to display in white when the button is hovered over:
.btn:hover { color: #fff; }
Because we added a property to the button itself, this change will occur smoothly.
For the last step, we will apply an property to the button to hide any element that overflows from the container. When applied to the button, it will hide the translated pseudo-element and only show it when it moves back to position:
.btn { /*...previous code. */ overflow: hidden; }
Finally, we center the button on the page by making the body a CSS grid container and using the property:
body { /* other styles */ display: grid; place-items: center; }
Final output:
There you have it! We’ve successfully created a beautifully animated button using CSS pseudo-elements.
Немного особенностей
Есть еще одна декларация , которая должна ограничивать выделение текста внутри элемента, как это работает с . Однако, IE11 был последним браузером, который поддерживал это. В настоящее время значение не поддерживают все современные браузеры.
Тем не менее, все редактируемые элементы (такие как ) обрабатываются, как если бы они имели . Псевдоэлементы и нельзя выбрать, как если бы у них было установлено . Изменить такое поведение не получится.
Всё вышенаписанное было про CSS, но всё-таки стоит упомянуть JavaScript в контексте выделения текста и копипасты.
Если нужен полный контроль над выделением текста, пригодится JavaScript Selection API. Если конечной целью является копирование/вставка текста, то JavaScript позволяет взаимодействовать с буфером обмена.
Pseudo-Elements vs. Pseudo-Classes
There are besides and that are used to style parts of existing elements. We talked about earlier, for styling list item markers. Another example is , which is used to .
There are also pseudo-classes, which are different than pseudo-elements. Pseudo-classes apply styles based on state. For example, we used in an earlier demo to apply a style only when a checkbox was checked.
Pseudo-elements are prefixed with double colons () while pseudo-classes are prefixed with a single colon (). Older versions of the W3C spec used single colons for pseudo-elements, so you might see and occasionally. They still work, but it is recommended to use instead.
Псевдоклассы и псевдоэлементы
И псевдоклассы, и псевдоэлементы были с самого начала CSS, с CSS1 (в этом году !). И там же было такое пояснение различия между ними:
Потом пришел CSS2, а за ним и CSS2.1. В июне 2011-го он с горем пополам стал стандартом, а в сентябре того же 2011-го стандартом стал модуль селекторов 3 уровня (и формально по сей день стандарт). Именно в нем у псевдоэлементов появилось двойное двоеточие. За это время приходили и уходили другие спецификации, от «вечного кандидата в рекомендации» до совсем чернового предложения от Adobe, и все они норовили прибавить что-то своё. А еще HTML5 со своими интерактивными новинками…
Но то отличие в главном по-прежнему актуально.
Любой псевдокласс соответствует какому-то элементу. Или в каком-то определенном состоянии, после каких-то действий пользователя (под фокусом, при наведении), или в каком-то определенном месте DOM-дерева (пятый в ряду, третий с конца…), или отвечает каким-то дополнительным условиям (напр. не является заголовком) — если некий элемент вдруг оказался в этом состоянии/в этом месте/с такими параметрами, к нему применится соответствующий псевдокласс. Само название указывает, что они — некое подобие классов. Как и классы, псевдоклассы можно комбинировать в каких угодно сочетаниях. У одного элемента их может быть сколько угодно (например, , причем в любом порядке.
Действующий стандарт выделяет , по не всегда понятной логике (чем :target не динамический?). В идущем ему на смену черновике CSS Selectors 4 классификацию чуть обновили:
- языковые (, )
- псевдоклассы места (все ссылочные и )
- действия пользователя (, , …)
- временные (в теории, помогут подсветить элементы по мере озвучки их скринридером, показать субтитры для видео в нужный для них момент и т.п.)
- состояния ввода (, …)
- структурные (, , …)
- новые псевдоклассы для выбора элементов по колонке таблицы или грида.
- функциональные псевдоклассы для комбинации других селекторов (, и — только б не спугнуть! — долгожданный ).
А вот псевдоэлементы — судя по названию же, лишь отдаленное подобие элементов. Они выбирают что угодно: букву, фрагмент текста с другими элементами внутри, кнопку в составном поле ввода или вообще что-то, чего и близко не было в исходном документе — только не реальный DOM-элемент. Но это непонятное что-то получит визуальное представление и займет достойное место в , а затем и на экране, наравне с настоящими элементами.
У элемента, которого нет, по идее, не может быть и соседей, тем более потомков. Поэтому в действующем стандарте (в вольном переводе):
Именно поэтому мы привыкли видеть псевдоэлементы в селекторах последними. Правда, в том же стандарте прячется осторожная оговорка, что это, возможно, не навсегда… но не будем забегать вперед.
Какие есть псевдоэлементы? Само собой, и . Чуть менее известны (хотя еще старше и работали даже в IE5!) и . Эти 4 псевдоэлемента были в CSS2 (что дает им почетное право писаться с одним двоеточием). Удивительно, но в действующем стандарте и описаны! Лишь еще вскользь упомянут. Всё пёстрое богатство разнобраузерной «псевдофауны», что мы знаем по подборкам наподобие этой, стандарт словно игнорирует.
Относительно недавно обновился черновик нового отдельного модуля псевдоэлементов 4 уровня, в котором их чуть больше и вдобавок они логически сгруппированы:
- текстовые эффекты ()
- генерируемый контент (, , ::placeholder и ::marker)
- средства для выделения и подсветки — и его друзья.
Но здесь самое время остановиться и перейти от истории и теории к практике главной темы этой статьи — отношений псевдоэлементов с псевдоклассами и друг с другом:). Начнем с самого простого!
Заключение. Селекторы CSS.
В заключении, мы рассмотрели различные типы селекторов CSS и их применение. От простых селекторов, включающих один элемент, до сложных селекторов, использующих комбинаторы для сочетания нескольких селекторов. Мы также узнали о псевдоэлементах, которые могут использоваться для создания виртуальных элементов на странице.
Комбинирование разных типов селекторов позволяет создавать множество возможностей для таргетирования элементов на странице. Используя селекторные списки с помощью запятых, можно избежать повторения одних и тех же CSS правил для нескольких селекторов.
Знание разных типов селекторов и их сочетаний позволит вам стать более продвинутым разработчиком, а также создавать более гибкие и эффективные CSS стили для ваших веб-страниц.
css html