Введение в каскадные таблицы стилей CSS (Cascading Style Sheets)

(часть 1)

image

Лыкошин Александр

2020-24

Cascading Style Sheets (CSS)

Это язык, используемый для описания представления документа, написанного на HTML или XML (включая такие диалекты XML, как SVG, MathML и XHTML). CSS описывает, как элементы должны представляться (render) на экране, бумаге, произноситься голосом или на другой медиа.

CSS входит в число основных языков открытого веба и стандартизирован в спецификациях W3C. На текущий момент официальным стандартом является версия CSS4.

Документация

Стандарты

Возможности "чистого" CSS

без программирования (без JavaScript)

"The Mine"

"Игра в 0 строк кода на чистом JS"

Подключение стилей к документу HTML

  • Внешние (External) стили
  • Внутренние (internal) стили
  • Inline стили

Внешние (External) стили

Внешний стиль содержит CSS в отдельном файле с расширением .css. Вероятно, это наиболее распространенный и удобный способ подключения стилей к документу. Такой файл можно подключать к нескольким HTML документам, применяя к ним общий стиль.

 <link rel="stylesheet" href="styles.css">

Внутренние (internal) стили

Внутренний стиль располагается внутри самого HTML документа, в элементе <style>.

 

Inline стили

Inline стили- это декларации CSS, которые влияют на один конкретный HTML элемент и содержатся в его атрибуте %lt;style%gt;.

 

Hello World!

This is my first CSS example

Базовый синтаксис правил CSS

Cинтаксис правила стиля

 style-rule ::=
 selectors-list {
  properties-list
 }
где
 selectors-list ::=
   selector[:pseudo-class] [::pseudo-element]
   [, selectors-list]

 properties-list ::=
   [property : value] [; properties-list]
Пример
 strong {
   color: red;
 }

 div.menu-bar li:hover > ul {
   display: block;
 }

@-правила (at-rules)

Начинаются с символа "@", за которым следует идентификатор, и включает в себя все до следующей ";" или следующего блока CSS.

 /* General structure */
 @IDENTIFIER (RULE);
 /* Example: tells browser to use UTF-8 character set */
 @charset "utf-8";

Селекторы CSS (введение)

Первая часть правила CSS, шаблон из элементов и других ключевых слов, определяющий, к каким элементам HTML необходимо применить данное правило.

 h1 {
   color: blue;
 }

 .special {
   color: blue;
 }
Основные элементы описаны в спецификации %a(href="https://www.w3.org/TR/selectors-3/") Level 3 Selectors specification

Списки селекторов

Если один и тот же стиль используется несколькими элементами, то отдельные селекторы могут объединятся в список селекторов, и данное правило будет применяться ко всем отдельным селекторам.

 h1, .special {
 color: blue;
 }

Типы селекторов

  • Селекторы типа, класса и идентификатора
  • Селекторы атрибутов
  • Селекторы псевдо-классов и псевдо-элементов
  • Комбинаторы

Селекторы типа, класса и идентификатора

В эту группу входят селекторы, указывающие на HTML элементы, такие как <h1>

 h1 { }

а также класс:

 .box { }

и идентификатор:

 .box { }

Селекторы атрибутов

Эти селекторы позволяют выбирать элементы на основе наличия определенного элемента

 a[title] { }

или его значения

 a[href="https://example.com"] { }

Селекторы псевдо-классов и псевдо-элементов

Эта группа селекторов включает псевдо-классы, которые характеризуют определенные состояния элемента. Например, псевдо-класс :hover выбирает элемент только если над ним находится указатель мыши

 a:hover { }

Также в эту группу входят псевдо-элементы, которым выделяют определенную часть элемента, а не сам элемент. Например, ::first-line выбирает первую строку текста внутри элемента, действуя как если бы элемент <span> содержал бы в себе первую строку текста, и затем был выбран селектором

 p::first-line { }

Комбинаторы (combinators)

Эта группа селекторов комбинирует другие селекторы для того, чтобы указывать элементы. Пример ниже выбирает параграфы, которые являются прямыми дочерними элементами <article>, используя комбинатор ">"

 article > p { }

Cелекторы CSS - подробнее

Обратите внимание - не существует селекторов, которые бы позволили выбрать родителя (содержащий контейнер) или соседа родителя или потомков соседа родителя.

Базовые селекторы

Универсальный селектор
Выбирает все элементы. По желанию, он может быть ограничен определенным пространством имен или относиться ко всему пространству имён.
Синтаксис: * ns|* *|*
Пример: * будет соответствовать всем элементам на странице.
Селекторы по типу элемента
Этот базовый селектор выбирает тип элементов, к которым будет применяться правило.
Синтаксис: элемент
Пример: селектор input выберет все элементы <input>.
Селекторы по классу
Этот базовый селектор выбирает элементы, основываясь на значении их атрибута class.
Синтаксис: .имяКласса
Пример: селектор .index выберет все элементы с соответствующим классом (который был определен в атрибуте class="index").
Селекторы по идентификатору
Этот базовый селектор выбирает элементы, основываясь на значении их id атрибута. Не забывайте, что идентификатор должен быть уникальным, т. е. использоваться только для одного элемента в HTML-документе.
Синтаксис: #имяИдентификатора
Пример: селектор #toc выберет элемент с идентификатором toc (который был определен в атрибуте id="toc").
Селекторы по атрибуту
Этот селектор выбирает все элементы, имеющие данный атрибут или атрибут с определённым значением.
Синтаксис: [attr] [attr=value] [attr~=value] [attr|=value] [attr^=value] [attr$=value] [attr*=value]
Пример: селектор [autoplay] выберет все элементы, у которых есть атрибут autoplay (независимо от его значения).
Ещё пример: a[href$=".jpg"] выберет все ссылки, у которых адрес заканчивается на ".jpg".
Ещё пример: a[href^="https"] выберет все ссылки, у которых адрес начинается на "https".

Комбинаторы

Комбинатор запятая
Комбинатор , это способ группировки, он выбирает все совпадающие узлы.
Синтаксис: A, B
Пример: div, span выберет оба элемента - и <div> и <span>.
Комбинатор потомков
Комбинатор ' ' (пробел) выбирает элементы, которые находятся внутри указанного элемента (вне зависимости от уровня вложенности).
Синтаксис: A B
Пример: селектор div span выберет все элементы <span>, которые находятся внутри элемента <div>.
Дочерние селекторы
Комбинатор '>' в отличие от пробела выбирает только те элементы, которые являются дочерними непосредственно по отношению к указанному элементу.
Синтаксис: A > B
Пример: селектор ul > li выберет только дочерние элементы <li>, которые находятся внутри, на первом уровне вложенности по отношению к элементу <ul>.
Комбинатор всех соседних элементов
Комбинатор '~' выбирает элементы, которые находятся на этом же уровне вложенности, после указанного элемента, с тем же родителем.
Синтаксис: A ~ B
Пример: p ~ span выберет все элементы <span>, которые находятся после элемента <p> внутри одного родителя.
Комбинатор следующего соседнего элемента
Комбинатор '+' выбирает элемент, который находится непосредственно после указанного элемента, если у них общий родитель.
Синтаксис: A + B
Пример: селектор ul + li выберет любой <li> элемент, который находится непосредственно после элемента <ul>.

Псевдоклассы и псевдоэлементы

Псевдоклассы
Знак : позволяет выбрать элементы, основываясь на информации, которой нет в дереве элементов.
Пример: a:visited соответствует всем элементам <a> которые имеют статус "посещённые".
Ещё пример: div:hover соответствует элементу, над которым проходит указатель мыши.
Ещё пример: input:focus соответствует полю ввода, которое получило фокус.
Псевдоэлементы
Знак :: представляет сущности, которых нет в HTML.
Пример: p::first-line соответствует первой линии абзаца <p>.

Сброс CSS (CSS Reset) и нормализация CSS (CSS Normalize)

Проблема

Chrome:

no-css-chrome

Firefox:

no-css-ff

Необходимо уменьшить различия между браузерами (например, высота строки по умолчанию, отступы, размеры шрифтов заголовков и т.д.)

Сброс CSS (CSS Reset) и нормализация CSS (CSS Normalize):

Два подхода

Онлайн валидатор СSS

Перевести дыхание и потренироваться

CSS Diner - интерактивная игра на селекторы CSS

css-diner

Введение в каскадирование стилей (CSS Cascade)

Каскадирование - алгоритм, определяющий, как объединять значения свойств стилей, полученных из разных источников.

Основные источники (origin) стилей: Стили пользовательские, авторские и пользовательского агента (user-agent)

  • Стили пользовательского агента (браузера, user-agent stylesheets) - встроены в браузер и задают стиль по умолчанию для всех документов. *
  • Авторские стили (Author stylesheets) - наиболее распространенный тип стилей. Определяют стили как часть дизайна конкретной веб страницы или сайта (на сервере).
  • Пользовательские стили (User stylesheets) позволяют пользователю браузеру переопределить авторские стили (в самом браузере).
* Не все браузеры позволяют изменять стили пользовательского агента. Аналогичный результат можно получить с использованием расширения Stylish и подобных ему.

Каскадирование - какие правила участвуют в каскадировании

В каскадировании участвуют только те объявления CSS, которые представляют собой пары свойство-значение.

Это значит, что @-правила (at-rules), в которых содержатся сущности, отличные от деклараций, например, @font-face, содержащее дескрипторы, не участвуют в каскадировании. В этом случае только само правило целиком участвует в каскадировании, т.е. @font-face, идентифицируемый его дескриптором font-family. В случае, если объявлено несколько правил @font-face с одним и тем же дескриптором, в учет принимаются только наиболее подходящие @font-face.

Аналогичным образом декларации, содержащиеся в @keyframes, не участвуют в каскадировании - только правило целиком.

Обработка %import и charset подчиняется другим алгоритмам и не участвует в каскадировании.

Порядок каскадирования

  1. Сначала отфильтровываются правила из различных источников для выделения только тех правил, которые применяются к данному элементу, то есть тех правил, селекторы которых соответствуют данныму элементу и которые являются частью соответствующего @-правила (at-rule) @media.
  2. Затем правила сортируются в соответствии с их важностью (т.е. флагом !important) и их источником (origin)
    Origin Importance
    1 Пользовательского агента (user agent) normal
    2 Пользовательсие (user) normal
    3 Авторские (author) normal
    4 CSS Animations see below
    5 Авторские (author) !important
    6 Пользовательские (user) !important
    7 Пользовательского агента (user agent) * !important
  3. В случае совпадения, для выбора правила определяется его специфичность.

Обратите внимание, что порядок для правил, отмеченных !important, противоположен.

Порядок каскадирования - пример

User-agent CSS:

li { margin-left: 10px }
Author CSS 1:
 li { margin-left: 0 } /* This is a reset */
Author CSS 2:
 @media screen {
   li { margin-left: 3px }
 }

 @media print {
   li { margin-left: 1px }
 }
User CSS:
{ margin-left: 1em }
HTML:
 
  • 1st
  • 2nd

Порядок каскадирования - пример

В примере выше, должны применяться объявления внутри правил li and .specific. Ни одно из них не объявлено как !important, поэтому у авторских стилей (author style sheets) более высокий приоритет, чем у пользовательских (user style sheets) или пользовательского агента (user-agent stylesheet). Таким образом, выбор осуществляется среди следующих деклараций:

margin-left: 0
margin-left: 3px
margin-left: 1px
Последнее игнорируется (на экране - @media screen), и у двух первых одинаковый селектор, поэтому у них одинаковая специфичность (см.далее), и будет выбран последний из них:
margin-left: 3px
Обратите внимание, что декларации, объявленные в пользовательском CSS, хотя и обладают большей специфичностью (см.далее), не были выбраны, так как каскадный алгоритм применяется до алгоритма специфичности.

Вопрос:

При таких классах:
 .red { color: red; }
 .blue { color: blue; }
Какого цвета будут эти элементы?
<div class="red blue">red blue</div>
<div class="blue red">blue red</div>

Результат:

red blue
blue red

Дополнительная информация:

Наследование (inheritance)

CSS наследование определяет, что происходит, когда значение свойства для элемента не указано.

Свойства CSS могут быть разделены на две категории:

  • унаследованные (inherited) свойства, которые по умолчанию равны вычисленному значению родительского элемента
  • неунаследованные (non-inherited) свойства, которые по умолчанию равны начальному (initial) значению свойства
Тип зависит от конкретного свойства.

Унаследованные свойства (Inherited properties)

CSS
p { color: green; }
HTML

This paragraph has emphasized text in it.

Слова "emphasized text" будут отображены зеленым шрифтом, так как элемент em унаследует значение свойства color от элемента p. Он не принимает начальное (initial) значение этого свойства (которое является color, используемый для корневого root элемента, когда для страницы цвет не указана).

Результат:

This paragraph has emphasized text in it.

Неунаследованные свойства (Non-inherited properties)

CSS
p { border: medium solid; }
HTML

This paragraph has emphasized text in it.

У слов "emphasized text" не будет границы, начальное значение border-style - none.

Результат:

This paragraph has emphasized text in it.

Дополнительная информация:

Специфичность (Specificity)

  • Специфичность используется для определения, какие значения свойств CSS наиболее подходят данному элементу и таким образом будут применены к нему.
  • Это вес, который определяется для данной декларации CSS на основе числа, связанного с каждым из типов селекторов в селекторе.
  • Если у нескольких деклараций одна и та же специфичность, применяется последняя.
  • Специфичность применяется только если один и тот же элемент подходит под несколько деклараций.

Типы селекторов по возрастанию специфичности

  1. Селекторы типов (h1) псевдо-элементов (::before)
  2. Селекторы классов (.example) ([type="radio"]) и псевдо-классов (:hover)
  3. Селекторы идентификаторов (#example);

Универсальные селекторы (*), комбинаторы (+, >, ~, ' ', ||) и псевдо-класс отрицания (:not() не влияют на специфичность. (Но селекторы, объявленные внутри :not() - влияют)

Специфичность (Specificity) и !important

  • Если правило отмечено как !important, такая декларация имеет больший приоритет чем любая другая декларация.
  • Рекомендуется только ограниченное использование.

Подробнее о специфичности

Стилизация текста

Единицы измерения

Веб-шрифты

Best fonts for mobile app design

Дополнительные источники

Актуальные технологии: Опрос разработчиков " State of CSS" Survey и его результаты за 2019 год

Постер с элементами HTML5 https://www.hsrtech.com/wp-content/uploads/2011/07/HTML5-Reference-Poster.pdf