CSS-правила и селекторы
Теперь приступим к CSS, и начнём, пожалуй, с расшифровки аббревиатуры CSS. Это Cascading Style Sheets, дословно «каскадная таблица стилей», но:
— Почему же она называется каскадной? — этот вопрос я часто задаю на собеседованиях претендентам. Ответом же будет аналогия, ибо она незыблема как перпендикулярная лягушка: представьте себе каскад водопада, вот вы стоите на одной из ступенек каскада с чернильницей в руках, и выливаете её содержимое в воду — вся вода ниже по каскаду будет окрашиваться в цвет чернил. Так и в CSS: если вы задаёте стиль на определённом уровне, он распространяется вниз по "каскаду" к элементам веб-страницы, окрашивая их в "цвет" вашего стиля.
— Зачем мне всё это? — работая с jQuery, вы должны «на отлично» читать правила CSS, а также уметь составлять CSS-селекторы для поиска необходимых элементов на странице. Практически все задачи, которые вы будете решать с помощью jQuery, начинаются с поиска необходимого элемента на странице, так что знание CSS-селекторов обязательно.
Но давайте обо всём по порядку, возьмём следующий простенький пример вполне семантического HTML:
Это пример простого и правильного HTML с небольшим добавлением CSS. Давайте разберём селекторы в приведённом CSS-коде (я умышленно не выносил CSS в отдельный файл, ибо так наглядней):
body
— данные правила будут применены к тегу<body>
и всем его потомкам, запомните: настройки шрифтов распространяются вниз по иерархии элементовh1,h2,h3
— мы выбираем теги<h1>
,<h2>
и<h3>
, и устанавливаем цвет шрифта для данных тегов и их потомков#content
— выбираем элемент сid="content"
, настройки отступов не распространяются на потомков, они будут изменяться только для данного элемента.box
— выбираем элементы сclass="box"
, и изменяем внешний вид границ элементов с заданным классом
Теперь подробнее и с усложнёнными примерами:
селектор | |
---|---|
| ищем элементы по имени тега |
| ищем элемент по идентификатору |
| ищем |
| выбираем элементы по имени класса |
| все элементы |
| ищем все элементы с классом |
| выбираем элементы с двумя классами |
| перечисление селекторов, выберем всё перечисленное |
| выбираем элементы |
| будут выбраны все элементы |
| будут выбраны все элементы |
Это отнюдь не весь список, описание же всех CSS-селекторов можно найти на соответствующей страничке W3C: https://www.w3.org/TR/selectors-3/
Возвращаясь к нашей аналогии с водопадом, представьте, что на следующей ступеньке кто-то выльет чернила другого цвета, мы же в результате получим смешение цветов. Но это в жизни, а в CSS это изменение "перекрасит воду" на всех последующих ступенях, ведь в CSS важен порядок, порядок и приоритеты. Давайте перейдём к сути:
первая ступенька нашего каскада имеет самый низкий приоритет, это стили браузера по умолчанию
как бы не заявляли разработчики, но в разных браузерах эти стили могут отличаться, поэтому всё ещё существует такое явление как CSS Reset, такой себе уравнитель
на второй ступеньке стили, заданные пользователем в недрах настроек браузера; на практике встречаются редко
самые важные для нас — стили автора странички, но и тут всё идёт по порядку
самый низкий приоритет у стилей, что подключены как файл
<link rel="stylesheet" type="text/css" href="...">
или встроены внутрь HTML с помощью тега<style>
:и естественно, при равенстве приоритетов «тапки» у того, кто объявлен последним
потом те, что захардкодили плохие люди (не вы, вы так делать не будете) в
style=""
:и тут появляется метка
!important
, и всё нам ломает, т.к. правило с такой меткой становится важнее даже inline-стилей, и всё идёт вверх-дном:чтобы перебить такой стиль, остаётся только вариант прописывать inline-стили с меткой
!important
:
приключения с
!important
не закончились, если есть пользовательские стили с данной меткой, то теперь их выходи даже браузеры грешат с
!important
, и такие стили имеют практически максимальный приоритет
Есть ещё приоритеты у правил которые используются для CSS анимации и CSS переходов, но это уже совсем другая история
Если голова ещё не болит, то я также упомяну, что при расчёте, чьи же правила главней, анализируется специфичность селекторов, и тут считается следующим образом:
расчёт происходит по трём весовым позициям —
[0:0:0]
за каждый идентификатор элемента (
#id
) —[1:0:0]
за каждый класс (
.class
), либо псевдо-класс (:pseudo
) —[0:1:0]
за каждый тег (
<a>
,<div>
, и т.д.) —[0:0:1]
при этом
[1:0:0]
>[0:x:y]
>[0:0:x]
при равенстве счета — снова «тапки» у того, кто объявлен последним
Пример селекторов, выстроенных по возрастанию приоритета (соответствующий код HTML будет ниже):
селектор | приоритет |
---|---|
тег имеет наименьший приоритет |
|
| |
добавляем к тегу класс |
|
| |
добавляем ещё тег |
|
| |
... нам нужно больше классов |
|
| |
идентификатор |
|
| |
добавляем тег |
|
| |
добавляем ещё один идентификатор |
|
| |
используем | ¯\_(ツ)_/¯ |
|
Есть ещё правила расчёта специфичности которые относятся к использованию определенных псевдоселекторов типа :not()
и :where()
, сам по себе такой селектор не добавляет веса к специфичности, но правило которое находится в скобках имеет вес:
Да, расчёт специфичности может действительно стать нетривиальной задачей, поэтому вот вам пару калькуляторов на выбор:
Запомните, что первоначально при использовании правил CSS ключевым является уровень специфичности селектора. И только случае, когда специфичности совпадают, будет важен порядок подключения стилей:
Ну и повторюсь, метка !important
- страшная вещь, использовать следует лишь в крайнем случае, такое правило имеет наивысший приоритет, хотя и не имеет ничего общего со специфичностью.
Домашнее задание
Вот кусочек CSS для тренировки, напишите соответствующий ему HTML (это вопрос с собеседования ;):
И ещё один:
Last updated