Лыкошин Александр
2020-24
Это язык, используемый для описания представления документа, написанного на HTML или XML (включая такие диалекты XML, как SVG, MathML и XHTML). CSS описывает, как элементы должны представляться (render) на экране, бумаге, произноситься голосом или на другой медиа.
CSS входит в число основных языков открытого веба и стандартизирован в спецификациях W3C. На текущий момент официальным стандартом является версия CSS4.
Документация
Стандарты
без программирования (без JavaScript)
Внешний стиль содержит CSS в отдельном файле с расширением .css. Вероятно, это наиболее распространенный и удобный способ подключения стилей к документу. Такой файл можно подключать к нескольким HTML документам, применяя к ним общий стиль.
<link rel="stylesheet" href="styles.css">
Внутренний стиль располагается внутри самого HTML документа, в элементе <style>.
Inline стили- это декларации CSS, которые влияют на один конкретный HTML элемент и содержатся в его атрибуте %lt;style%gt;.
Hello World!
This is my first CSS example
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;
}
Начинаются с символа "@", за которым следует идентификатор, и включает в себя все до следующей ";" или следующего блока CSS.
/* General structure */
@IDENTIFIER (RULE);
/* Example: tells browser to use UTF-8 character set */
@charset "utf-8";
Первая часть правила 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 { }
Эта группа селекторов комбинирует другие селекторы для того, чтобы указывать элементы. Пример ниже выбирает параграфы, которые являются прямыми дочерними элементами <article>, используя комбинатор ">"
article > p { }
*
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, 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>
.
Chrome:
Firefox:
Необходимо уменьшить различия между браузерами (например, высота строки по умолчанию, отступы, размеры шрифтов заголовков и т.д.)
reset.css
Normalize.css
reset.css
all
- MDN
Каскадирование - алгоритм, определяющий, как объединять значения свойств стилей, полученных из разных источников.
В каскадировании участвуют только те объявления CSS, которые представляют собой пары свойство-значение.
Это значит, что @-правила (at-rules), в которых содержатся сущности, отличные от деклараций,
например, @font-face
, содержащее дескрипторы, не участвуют в каскадировании. В
этом случае только само правило целиком участвует в каскадировании, т.е. @font-face
,
идентифицируемый его дескриптором font-family
. В случае, если объявлено несколько
правил @font-face
с одним и тем же дескриптором, в учет принимаются только наиболее
подходящие @font-face
.
Аналогичным образом декларации, содержащиеся в @keyframes
, не участвуют в каскадировании
- только правило целиком.
Обработка %import
и charset
подчиняется другим алгоритмам и не участвует в
каскадировании.
@media
.
!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 |
Обратите внимание, что порядок для правил, отмеченных !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>
Результат:
Дополнительная информация:
CSS наследование определяет, что происходит, когда значение свойства для элемента не указано.
Свойства 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.
p { border: medium solid; }
HTML
This paragraph has emphasized text in it.
У слов "emphasized text" не будет границы, начальное значение border-style
-
none
.
Результат:
This paragraph has emphasized text in it.
Дополнительная информация:
Типы селекторов по возрастанию специфичности
h1
) псевдо-элементов (::before
).example
) ([type="radio"]) и псевдо-классов
(:hover
)
#example
);Универсальные селекторы (*
), комбинаторы (+
, >
,
~
, ' '
, ||
) и псевдо-класс отрицания (:not()
не
влияют на специфичность. (Но селекторы, объявленные внутри :not()
- влияют)
!important
!important
, такая декларация имеет больший приоритет чем
любая другая декларация.
Актуальные технологии: Опрос разработчиков " State of CSS" Survey и его результаты за 2019 год
Постер с элементами HTML5 https://www.hsrtech.com/wp-content/uploads/2011/07/HTML5-Reference-Poster.pdf