Skip to content

Instantly share code, notes, and snippets.

@smaugfm
Created August 14, 2016 20:26
Show Gist options
  • Save smaugfm/a4141d4b5b661665454f8360665d15fd to your computer and use it in GitHub Desktop.
Save smaugfm/a4141d4b5b661665454f8360665d15fd to your computer and use it in GitHub Desktop.
CSS-selectors

CSS-селекторы

Синтаксис

selector = simple-selector (combinator simple-selector)*
simple-selector = (type | universal) (attribute | class | ID | pseudo-class | pseudo-elemenet)*
combinator = whitespace | > | + | ~

Селектор представляет собой правило которое описывает на какие элементы документа применить стиль соответствующий селектору.











Selector grouping

Селекторы можно группировать в разделенный запятыми список - такой селектор представляет собой обьединение всех селекторов в списке. Как логическое "И" для множеств.

Эти два определения эквивалентны:

h1 { font-family: sans-serif }
td.someClass span p { font-family: sans-serif }
tbody > tr th { font-family: sans-serif }
h1, td.someClass span p , tbody > tr th  { font-family: sans-serif }

А эти уже нет:

h1 { font-family: sans-serif }
someInvalidType { font-family: sans-serif }
h3 { font-family: sans-serif }
h1, someInvalidType, h3 { font-family: sans-serif }

В первом примере невалидный лишь один селектор, в то время как во втором - тоже один:) Потому что теперь это рассматривается как один селектор.











Simple selectors

Type selector

В упрощенном варианте - просто имя HTML элемента. Полный синтаксис, с поддержкой namespaces можно посмотреть по ссылке: CSS qualified names.

h1 { font-family: sans-serif }
span { color: red }
div { display: block }











Universal selector

/* да будет все красным! */
* { color: red } 

Селектор, который определяет любой элемент на странице. Его можно опускать. На самом деле правило, которое было вначале, выглядит так:

simple-selector = 
    (type | universal) (attribute | class | ID | pseudo-class)*
    | (attribute | class | ID | pseudo-class)+

Это как раз то, что позволяет писать привычные нам селекторы типа:

[href*=google] { color: red }
.warning { color: red }
#myid { color: red }

Однако опускать его рекомендуется не всегда. Иначе можно попастаться, например, на вот такое:

div :first-child 
div:first-child

Более правильным будет такой вид: div *:first-child











Attribute selector

/* Представляет собой любой элемент, у которого есть аттрибут att, независимо от его значения */
[att]

/* Представляет собой любой элемент, у которого есть аттрибут att который равен val */
[att=val]

/* Представляет собой любой элемент, у которого есть аттрибут att,
чье значение это разделенный пробелами список слов, одно из которых это val */
[att~=val]

/* Представляет собой любой элемент, у которого есть аттрибут att который равен val
или начинается с val с непосредственно идущим после этого знаком '-' */
[att|=val]

/* Представляет собой любой элемент, у которого есть аттрибут att,
чье значение начинается с val */
[att^=val]

/* Представляет собой любой элемент, у которого есть аттрибут att, 
чье значение заканчивается на val */
[att$=val]

/* Представляет собой любой элемент, у которого есть аттрибут att, чье значение содержит val */
[att*=val]

Синтаксис имен аттрибутов - как синтаксис идентефикаторов в языках программирования. Также поддерживаются имена в виде строк: "attribute" "another attribute"

'|=' в основном применяется для языковых штук типа en-US

Примеры

h1[title] { color: red }
div > span[hello="Cleveland"][goodbye="Columbus"] { color: red }

/* смэтчит например тэг <a rel="copyright copyleft copydown copyup copy cp obj.Clone()"> */
a[rel~="copyright"] { color: red }

/* смэтчит <a hreflang="en-US"> */
a[hreflang|="en"] { color: red }

/* картинки на странице*/
object[type^="image/"]

/* ссылки на html страницы */
a[href$=".html"]

/* аттрибут title просто должен содержать hello */
p[title*="hello"]











Class selector

Удобный способ нотации для аттрибута class. Такие селекторы эквивалентны:

<span class="victor fedorovich"></span>
span.victor { color: red} 
span[class~="victor"] { color: red} 











ID selector

Удобный способ нотации для аттрибута id.

h1#chapter1 { color: red }
#chapter1 { color: red }
div#top > span#level > p#warning { color : red }











Pseudo-classes and Pseudo-elements

Были введены для возможности выбора элементов, основываясь на информации, которая лежит за пределами дерева элементов и не может быть выражена другими простыми селекторами. Названия псевдо-классов не чувстсвительны к регистру. Некоторые псевдо-классы могут быть использованы одновременно, некоторые нет. Некоторые являются "динамическими" в том смысле, что элемент может приобретать или терять класс в ответ на действия пользователя. Псевдо-классы начинаются с двоеточия, псевдо-элементы начинаются с двух двоеточий. Некоторые псевдо-классы:

:link
:visited
:hover
:active
:nth-child()
:nth-of-type()
:not()

Некоторые псевдо-элементы:

::after (:after)
::before (:before)
::first-letter (:first-letter)
::first-line (:first-line)
::selection

Многие браузеры предоставляют вендорные псевдо-элементы:

::-webkit-slider-thumb
::-ms-track
::-moz-range-progress

Полный список хорошо представлен по этой ссылке: https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes











Combinators

Descendant combinator

Позволяет выразить отношение "предок-потомок" по отношению к элементам. Этот кобинатор - это whitespace, который отделяет двое простых селекторов.

h1.victor[attr=value] em.fedorovich { color: red }

Такой селектор выберет em только если он является потомком h1.











Child combinator

Позволяет выразить отношение "предок-непосредственный потомок" по отношению к элементам. Записывается символом '>'.

h1 > em { color: red }
h1 > * > em { color: red }











General sibling combinator

Выбирает элемент предшествующий другому элементу.

span ~ div { color: red }

Сдесь элемент div будет выбран если на одном с ним уровне вложенности находится элемент span который обьявлен где-то перед ним.

<div>
	<span></span>
    <p></p>
	<div></div>
</div>











Adjacent sibling combinator

Выбирает элемент непосредственно предшествующий другому элементу.

span ~ div { color: red }

Сдесь элемент div будет выбран если на одном с ним уровне вложенности находится элемент span который обьявлен непосредственно перед ним.

<div>
	<span></span>
	<div></div>
    <p></p>
</div>











Further reading

Спецификация CSS3 селекторов: https://www.w3.org/TR/selectors











Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment