In CSS, selectors are patterns used to select the element(s) you want to style.
От автора: сегодня мы рассмотрим, как и для чего можно использовать селектор CSS root. Одним из элементов адаптивного дизайна, с которым бывает сложно определиться, это типографика. В идеале вам хочется получить максимально подходящий шрифт для всех областей просмотра. Обычно для этого нужно начать с базового размера шрифта и потом менять его для различных контрольных точек.
В этом примере шрифт не меняется по тех пор, пока не достигнута контрольная точка.
- Использование :root
- Единицы области просмотра
- Иные спецификации
- Практическое использование
- Пересечение спецификаций
- Практическое использование
- Псевдокласс :root в разных спецификациях
- Практическое использование :root
- :root и var()
- Пользовательские свойства CSS и переменные препроцессора
- Написание простой HTML-страницы
- Написание базового CSS для нашей HTML-страницы
- Добавление темной темы CSS
- Переключение тем с помощью JavaScript
- Изменение пользовательских свойств CSS с помощью JavaScript
- Заключение
Использование :root
Я предпочитаю такой подход к гибкой типографике, при котором нужно рассчитать размер шрифта, исходя из высоты и ширины области просмотра с помощью селектора :root:
Изучите Веб-вёрстку с нуля
Если вы мечтаете создавать сайты, но не знаете, с чего начать. Хотите глубоко погрузиться в основы веб-разработки, а не просто пройтись по верхам — этот курс для вас!
Подходит для новичков без опыта в программировании
Практика на вебинарах с разработчиками из крупных компаний
4 месяца обучения
24 практических работы
Теперь можно задействовать элемент em , основанный на значении, подсчитанном посредством :root:
Единицы области просмотра
Вы заметите, что функции calc() были переданы значения в единицах области просмотра. Давайте кратко рассмотрим их, чтобы понять, как рассчитывается размер шрифта в селекторе root.
1vw = 1% от ширины области просмотра
1vh = 1% от высоты области просмотра
1vmin = 1vw or 1vh, выбрать меньшее
1vmax = 1vw or 1vh, выбрать большее
Если мы применим это к размерам области просмотра iPhone 7 — 375×667, рассчитанное значение:root будет:
Подходы к гибкой типографике всегда будут отличаться друг от друга и нам стоит оценивать каждый подход по тому, для чего нам это нужно, рассматривая не только адаптивные свойства. Я узнал, что использование :root таким образом дает самые удобные решения.
Изучите Веб-вёрстку с нуля
Если вы мечтаете создавать сайты, но не знаете, с чего начать. Хотите глубоко погрузиться в основы веб-разработки, а не просто пройтись по верхам — этот курс для вас!
Подходит для новичков без опыта в программировании
Практика на вебинарах с разработчиками из крупных компаний
4 месяца обучения
24 практических работы
Редакция: Команда webformyself.
В CSS псевдокласс :root
нужен для выбора родительского элемента высшего уровня согласно действующей спецификации. Для HTML-документа :root
соответствует селектору html
.
В коде представленном ниже стили для :root
и html
имеют одинаковый смысл:
:root {
background-color: gray;
}
html {
background-color: gray;
}
Выше мы уже упомянули, что псевдокласс :root
по своей значимости эквивалентен селектору html
. Но, на самом деле, в CSS :root
более значим, чем html
, так как он является псевдоклассом (подобно :first-child
или :hover
). Селекторы псевдоклассов имеют больший вес и более высокую специфичность, чем селекторы тегов.
Например, в коде:
:root {
background-color: blue;
color: white;
}
html {
background-color: red;
color: white;
}
Несмотря на то, что селектор html
следует в документе последним, стили для :root
одерживают верх, благодаря более высокой специфичности.
Иные спецификации
В спецификации HTML :root
относится к родителю самого высокого уровня, которым является html
.
Так как CSS может использоваться для SVG и XML, в таких документах так же можно применять псевдокласс :root
, но он будет относиться уже к другим селекторам.
Например, в SVG родителем высшего порядка является тег svg
:
:root {
fill: gold;
}
svg {
fill: gold;
}
Как и в HTML, в примере, приведенном выше, стили для :root
и svg
будут выполнять одни и те же действия, :root
, при этом, будет обладать более высокой специфичностью.
Практическое использование
Так для чего же нужен :root
в повседневной работе. Как мы заметили ранее, этот псевдокласс является эквивалентом селектора html
. А это означает, что с помощью стилей для селектора :root
можно делать все, что мы делаем в отношении селектора html
:
:root {
margin: 0;
padding: 0;
color: #0000FF;
font-family: "Helvetica", "Arial", sans-serif;
line-height: 1.5;
}
При желании, Вы можете применить пользовательские свойства и создать глобальные переменные для CSS-кода своего проекта:
:root {
margin: 0;
padding: 0;
--primary-color: #0000FF;
--body-fonts: "Helvetica", "Arial", sans-serif;
--line-height: 1.5;
}
p {
color: var(--primary-color);
font-family: var(--body-fonts);
line-height: var(--line-height);
}
Возможность стилизовать SVG-графику — еще один плюс использования :root
вместо html
:
:root {
margin: 0;
padding: 0;
--primary-color: #0000FF;
--body-fonts: "Helvetica", "Arial", sans-serif;
--line-height: 1.5;
}
svg {
font-family: var(--body-fonts);
}
svg circle {
fill: var(--primary-color);
}
Дополнительную информациию о псевдоклассе :root
можно получить на сайте MDN.
Спасибо за внимание.
От автора: селектор псевдо-класса CSS :root используется для выбора родителя самого высокого уровня данной спецификации. В спецификации HTML, :root по сути, эквивалентен селектору html.
В сниппете CSS ниже стили :root и html будут делать то же самое:
Если вы заметили, я сказал, что :root по сути эквивалентно селектору html. На самом деле, селектор :root имеет больше полномочий, чем html. Это потому, что он на самом деле считается селектором псевдо-класса (как, например, :first-child или :hover).
Изучите Веб-вёрстку с нуля
Если вы мечтаете создавать сайты, но не знаете, с чего начать. Хотите глубоко погрузиться в основы веб-разработки, а не просто пройтись по верхам — этот курс для вас!
Подходит для новичков без опыта в программировании
Практика на вебинарах с разработчиками из крупных компаний
4 месяца обучения
24 практических работы
Как селектор псевдо-класса, он обладает большей специфичностью, чем селекторы тегов:
Несмотря на то, что селектор html следует за ним, :root все равно является приоритетным, благодаря более высокой специфичности!
Пересечение спецификаций
В спецификации HTML псевдо-класс :root указывает на родителя самого высокого уровня: html. Поскольку CSS также разработан для SVG и XML, вы можете использовать :root для них, и он будет просто соответствовать другому элементу. Например, в SVG родительским элементом высшего уровня является тег svg.
Подобно HTML, :root и svg выбирают один и тот же элемент, однако селектор :root будет иметь более высокую специфичность.
Практическое использование
Для чего практически применяется :root? Как мы уже было сказано, это безопасная замена для селектора html. Это означает, что вы можете делать все, что обычно делаете с селектором html:
Если хотите, вы можете изменить этот код, чтобы использовать Пользовательские свойства CSS для создания переменных на глобальном уровне!
Дополнительным преимуществом использования :root вместо html заключается в том, что вы можете стилизовать SVG-графику!
Подробную документацию по селектору псевдо-класса :root можно найти на Mozilla Developer Network.
Изучите Веб-вёрстку с нуля
Если вы мечтаете создавать сайты, но не знаете, с чего начать. Хотите глубоко погрузиться в основы веб-разработки, а не просто пройтись по верхам — этот курс для вас!
Подходит для новичков без опыта в программировании
Практика на вебинарах с разработчиками из крупных компаний
4 месяца обучения
24 практических работы
Редакция: Команда webformyself.
21 января, 2022 11:53 дп
В этом руководстве вы узнаете, что такое псевдокласс :root в CSS и как его можно использовать в проектах.
Псевдокласс :root используется в CSS для выбора родительского элемента самого высокого уровня внутри заданной спецификации. В спецификации HTML :root по сути равен селектору html.
Попробуем продемонстрировать это на примере. В приведенном ниже фрагменте CSS стили :root и html будут делать то же самое:
:root { background-color: gray; } html { background-color: gray; }
Если вы заметили, выше мы говорили, что :root по сути эквивалентен селектору html. Однако фактически, селектор :root имеет больше полномочий, чем html. Это происходит потому, что он считается селектором псевдокласса (как, например, :first-child или :hover).
Следовательно, как селектор псевдокласса он имеет больше полномочий, чем селекторы тегов:
:root { background-color: blue; color: white; } html { background-color: red; color: white; }
Благодаря своей более высокой специфичности селектор :root применяется несмотря на то, что после него идет селектор html.
Псевдокласс :root в разных спецификациях
В спецификации HTML псевдокласс :root нацелен на родительский элемент самого высокого уровня – html.
Поскольку CSS также разработан для SVG и XML, вы можете использовать :root, но он просто будет соответствовать другому элементу.
Например, в SVG родительским элементом самого высокого уровня является тег svg.
:root { fill: gold; } svg { fill: gold; }
Подобно HTML, теги :root и svg выбирают один и тот же элемент, однако селектор :root будет иметь более высокую специфичность.
Практическое использование :root
Итак, каково практическое использование: root? Как мы уже говорили ранее, это безопасная замена селектора html.
Проще говоря, вы можете делать все то, что обычно делаете с помощью селектора html:
:root { margin: 0; padding: 0; color: #0000FF; font-family: "Helvetica", "Arial", sans-serif; line-height: 1.5; }
При желании вы можете реорганизовать этот код и применить пользовательские CSS-свойства для создания переменных на глобальном уровне
:root { margin: 0; padding: 0; --primary-color: #0000FF; --body-fonts: "Helvetica", "Arial", sans-serif; --line-height: 1.5; } p { color: var(--primary-color); font-family: var(--body-fonts); line-height: var(--line-height); }
Дополнительным преимуществом :root по сравнению с html является возможность стилизовать графику SVG.
:root { margin: 0; padding: 0; --primary-color: #0000FF; --body-fonts: "Helvetica", "Arial", sans-serif; --line-height: 1.5; } svg { font-family: var(--body-fonts); } svg circle { fill: var(--primary-color); }
Если вы хотите узнать о псевдоклассе :root больше, обратитесь к Mozilla Developer Network.
Tags: CSS, HTML
От автора: в этом руководстве по тому, как создаются в CSS темы, мы будем использовать пользовательские свойства (также известные как переменные CSS) для реализации динамических тем простой HTML-страницы. Мы создадим темные и светлые варианты тем, затем напишем JavaScript, чтобы переключаться между ними, когда пользователь нажимает кнопку.
Как и в обычных языках программирования, переменные используются для хранения значений. В CSS они обычно используются для хранения цветов, названий шрифтов, размеров шрифтов, единиц и т. д. Затем на них можно ссылать и повторно использовать в нескольких местах в таблице стилей. Большинство разработчиков используют термин «переменные CSS», но официальное название — это пользовательские свойства.
Пользовательские свойства CSS позволяют изменять переменные, на которые можно ссылаться в таблице стилей. Раньше это было возможно только с помощью препроцессоров CSS, таких как Sass.
:root и var()
Прежде чем создать наш пример динамической темы, давайте разберемся с основами пользовательских свойств. Пользовательское свойство — это свойство, имя которого начинается с двух дефисов (—), например, —foo. Они определяют переменные, на которые можно ссылаться, используя var(). Рассмотрим этот пример:
Изучите Веб-вёрстку с нуля
Если вы мечтаете создавать сайты, но не знаете, с чего начать. Хотите глубоко погрузиться в основы веб-разработки, а не просто пройтись по верхам — этот курс для вас!
Подходит для новичков без опыта в программировании
Практика на вебинарах с разработчиками из крупных компаний
4 месяца обучения
24 практических работы
Определение пользовательских свойств в селекторе :root означает, что они доступны в глобальном пространстве документа для всех элементов. :root — это псевдо-класс CSS, который соответствует корневому элементу документа — элементу html. Это похоже на селектор html, но с более высокой специфичностью.
Вы можете получить доступ к значению пользовательского свойства :root в любом месте документа:
Вы также можете включить с переменной CSS резервное значение. Например:
Если пользовательское свойство не определено, вместо него используется резервное значение. Определение пользовательских свойств внутри селектора CSS, отличного от селектора :root или html, делает переменную доступной для соответствия элементам и их дочерним элементам.
Пользовательские свойства CSS и переменные препроцессора
Препроцессоры CSS, такие как Sass, часто используются для поддержки веб-разработки в интерфейсе. Среди других полезных функций препроцессоров они используют переменные. Но в чем разница между переменными Sass и пользовательскими свойствами CSS?
Пользовательские свойства CSS изначально анализируются в современных браузерах. Переменные препроцессора требуют компиляции в стандартный файл CSS, и все переменные преобразуются в значения.
Пользовательские свойства могут быть доступны и изменены через JavaScript. Переменные препроцессора компилируются один раз, и только конечное значение доступно в клиенте.
Написание простой HTML-страницы
Начнем с создания папки для нашего проекта:
Затем добавьте в папку проекта файл index.html:
Добавьте в него следующий код:
Мы добавляем с помощью тега nav панель навигации, футер, div контейнера, который содержит кнопку (она будет использоваться для переключения между светлой и темной темами) и некоторый условный текст Lorem Ipsum.
Написание базового CSS для нашей HTML-страницы
Теперь давайте создадим нашу страницу. В том же файле, используя в head встроенный тег style, добавьте следующие стили CSS:
Для определения цветов используется обозначение CSS3 HSL (оттенок, насыщенность, яркость). Оттенок — это угол в окружности цветов, в нашем примере используется 350 для красного цвета. Все цвета страницы используют разные вариации, в которых изменяются сочетания насыщенности (процентное соотношение цвета) и яркости (в процентах).
Использование HSL позволяет нам легко пробовать для темы различные базовые цвета, изменяя только значение оттенка. Мы могли бы также использовать переменную CSS для значения оттенка и переключать цвет темы, изменяя одно значение в таблице стилей или динамически изменяя его с помощью JavaScript. Это скриншот страницы:
Посмотрите соответствующую демо-версию:
Давайте используем переменную CSS для хранения значения оттенка всех цветов страницы. Добавьте глобальную переменную CSS в селектор :root в верхней части тега style:
Затем мы заменяем все жестко закодированные значения 350 в цветах hsl() на переменную —main-hue. Например, это селектор nav:
Теперь, если вы хотите указать любой цвет, отличный от красного, вы можете просто присвоить соответствующее значение —main-hue. Вот несколько примеров:
Мы определяем три пользовательских свойства для красного, синего и зеленого цветов, а затем присваиваем переменную —red-hue в качестве значения переменной —main-hue. Это скриншот страниц с разными значениями —main-hue:
Пользовательские свойства CSS дают нам несколько преимуществ:
Значение может быть определено в одном месте.
Это значение можно назвать соответствующим образом, чтобы облегчить поддержку кода.
Значение может быть динамически изменено с использованием JavaScript. Например, для —main-hue может быть установлено любое значение от 0 до 360.
Используя JavaScript для динамического задания значения —main-hue из набора предопределенных значений или пользовательского значения для оттенка (оно должно быть от 0 до 360), мы можем предоставить пользователю множество возможностей для настройки темы.
Следующая строка кода установит для —main-hue значение 240 (синий):
Посмотрите следующую демо-версию, в которой показан полный пример, в нем вы можете динамически переключаться между темами красного, синего и зеленого цветов:
Это скриншот страницы:
Добавление темной темы CSS
Теперь давайте создадим темную тему для этой страницы. Для большего контроля над цветами разных объектов нам нужно добавить больше переменных.
Просматривая стили страницы, мы можем заменить все цвета HSL в разных селекторах переменными после определения пользовательских свойств для соответствующих цветов в :root:
Здесь были использованы соответствующие имена для пользовательских свойств. Например, —nav-bg-color относится к цвету фона панели навигации, а —nav-text-color относится к цвету переднего плана / текста панели навигации. Теперь продублируйте селектор :root с его содержимым, но добавьте атрибут темы со значением dark:
Эта тема будет активирована, если к элементу html будет добавлен атрибут темы со значением dark.
Теперь мы можем играть со значениями этих переменных вручную, уменьшая значение яркости цветов HSL, чтобы создать темную тему, или мы можем использовать другие методы, такие как фильтры CSS, например, invert() и brightness(), которые обычно используются для настройки отображения изображений, но также могут использоваться с любым другим элементом.
Фильтр invert() инвертирует все цвета в выбранных элементах (каждый элемент в этом случае). Значение инверсии может быть указано в процентах или числом. Значение 100% или 1 полностью инвертирует значения оттенка, насыщенности и яркости элемента.
Фильтр brightness() делает элемент ярче или темнее. Значение 0 дает полностью темный элемент. Фильтр invert() делает некоторые элементы очень яркими. Они смягчаются установкой brightness(0.6). Темная тема с разной степенью затемнения:
Переключение тем с помощью JavaScript
Давайте теперь используем JavaScript для переключения между темными и светлыми темами, когда пользователь нажимает кнопку Dark/Light. В index.html добавьте встроенный script перед закрытием body со следующим кодом:
Document.documentElement относится к корневому элементу DOM документа, то есть html. Этот код проверяет наличие атрибута theme с помощью метода .hasAttribute() и добавляет атрибут со значением dark, если он не существует, что приводит к переключению на темную тему. В противном случае он удаляет атрибут, что приводит к переключению на светлую тему.
Изменение пользовательских свойств CSS с помощью JavaScript
Используя JavaScript, мы можем получить доступ к пользовательским свойствам и динамически изменять их значения. В нашем примере мы жестко закодировали значение яркости, но это можно изменить динамически. Сначала добавьте в HTML-страницу элемент ввода ползунок ниже кнопки dark/light:
Определите для фильтра brightness это пользовательское свойство вместо жестко заданного значения:
Наконец, добавьте следующий код, чтобы синхронизировать значение —theme-darkness со значением ползунка:
Мы прослушиваем событие изменения ползунка и устанавливаем значение —theme-darkness, используя метод setProperty(). Мы также можем применить фильтр brightness к светлой теме. Добавьте пользовательское свойство —theme-darkness в верхней части селектора :root:
Затем добавьте фильтр brightness в нижней части этого же селектора:
Код этого примера вы можете найти в следующей демо-версии:
Вот скриншот темной темы из последнего примера:
Вот скриншот светлой темы:
Заключение
В этой статье мы рассмотрели, как использовать пользовательские свойства CSS для создания тем и динамического переключения между ними. Мы использовали цветовую схему HSL, которая позволяет указывать цвета с оттенками, насыщенностью и яркостью, а также фильтры CSS (invert и brightness), чтобы создать темную версию светлой темы.
Изучите Веб-вёрстку с нуля
Если вы мечтаете создавать сайты, но не знаете, с чего начать. Хотите глубоко погрузиться в основы веб-разработки, а не просто пройтись по верхам — этот курс для вас!
Подходит для новичков без опыта в программировании
Практика на вебинарах с разработчиками из крупных компаний
4 месяца обучения
24 практических работы
Редакция: Команда webformyself.