.content h1 {font-size: 1.5em;…}
Селекторы — это конструкции CSS-кода, сопоставляемые с элементами дерева HTML- или XML-документа с целью избирательного выделения в нем тех или иных узлов.
expression ∗ element → boolean
CSS2:
E:hover {…}E:before {…}
CSS3:
E:hover {…}E::before {…}
Пример: div, *, [foo="bar"], .content, #intro, :hover
Пример: div.content:hover
Примеры: div p, .menu > a:hover, h1 + p
Пример: h1, h2, h3
Можно понаблюдать за процессом отрисовки страницы по мере ее загрузки в замедленном режиме
<body><div id="page"><header id="intro"><h1>…</h1><p>…</p></header>…</div></body>
<body><body><div id="page"><header id="intro"><h1>…</h1><p>…</p></header>…</div></body>
<div><body><div id="page"><header id="intro"><h1>…</h1><p>…</p></header>…</div></body>
<header><body><div id="page"><header id="intro"><h1>…</h1><p>…</p></header>…</div></body>
<h1>, перерисовали требуемое<body><div id="page"><header id="intro"><h1>…</h1><p>…</p></header>…</div></body>
<p>, вновь перерисовали требуемое<body><div id="page"><header id="intro"><h1>…</h1><p>…</p></header>…</div></body>
body section.content h1 {…}
Всегда справа налево!
القاعدة
body section.content h1 {…}
<section> с классом content
body section.content h1 {…}
<body>
body section.content h1 {…}
Очевидно, те, которые требуют меньше проверок:
#intro {…}.content {…}
id
#intro * {…}

#intro h1 {…}
Здесь выше специфичность крайней справа части комбинированного селектора
#intro > h1 {…}
В данном случае придется обрабатывать меньшее число узлов DOM
header#intro {…}
#intro {…}
Это почти полностью справедливо и для селекторов по классу
body ul.navigation li a {…}
.navigation a {…}
* справаСтранное, казалось бы, дело:
E:first-child — определен в CSS2E:last-child — описан только в CSS3 и реализован в браузерах намного позжеВторой при «честной» реализации требует больше ресурсов
E:last-child не везде реализован «честно»Можно сравнить отрисовку меню навигации в замедленном режиме в различных браузерах
Давно и успешно реализованы:
div p — селектор потомкаdiv > p — селектор дочернего элемента, то есть прямого потомкаРассчитывать ли нам на селектор предка или селектор родителя?
div:has(p) — существует в jQuery<section class="content"><h1>Заголовок</h1><p>Текст первого абзаца.</p>…<p>Текст еще какого-то абзаца с <code>фрагментом кода</code>.</p>…</section>
.content:has(code) {line-height: 1.5em;}
<code><section><code>, потребуется перерисовать <section><section>По умолчанию subjects определяются крайней справа частью селектора:
.content pre code {…}
ol > li:only-child {…}
ol! > li:only-child {…}
Одна и та же структура DOM-дерева, но различные целевые объекты
<p><div id="d1" class="d1"><section id="s1" class="s1"><article id="a1" class="a1"><p id="p1" class="p1"><span>Текст абзаца 1.</span></p>… еще 9</article>… еще 9</section>… еще 5</div>… еще 4
Перед таблицей стилей, внутри <head>…</head>:
var $startTime = (new Date()).getTime();
Перед закрывающим тегом </body>:
window.onload = function() {var $processDuration = (new Date()).getTime() - $startTime;}
body {font-size: 16px;}.content h1 {font-size: 1.5em;}
Детально описывается в CSS2.1
abbr {border-bottom: dotted .1em;}h1 abbr {border-bottom: none;}
Детально описывается в CSS2.1
a — количество селекторов по идентификаторамb — количество селекторов по классам, по атрибутам, по псевдоклассамс — количество селекторов по типу элемента («по тегу»), по псевдоэлементам«Звездочка» игнорируется, :not сам по себе не рассматривается как псевдокласс
Прямая цитата из спецификации Selectors Level 3:
* /* a=0 b=0 c=0 -> specificity = 0 */li /* a=0 b=0 c=1 -> specificity = 1 */ul li /* a=0 b=0 c=2 -> specificity = 2 */ul ol + li /* a=0 b=0 c=3 -> specificity = 3 */h1 + *[rel=up] /* a=0 b=1 c=1 -> specificity = 11 */ul ol li.red /* a=0 b=1 c=3 -> specificity = 13 */li.red.level /* a=0 b=2 c=1 -> specificity = 21 */#x34y /* a=1 b=0 c=0 -> specificity = 100 */#s12:not(foo) /* a=1 b=0 c=1 -> specificity = 101 */
Google Page Speed рекомендует:
ul li {color: blue;}ol li {color: red;}
.unordered-list-item {color: blue;}.ordered-list-item {color: red;}
Семантика?.. Объем HTML-кода?..
.content h1 {…}.content p {…}
Переопределить объявления, соответствующие селектору с высокой специфичностью:
.content p {margin-bottom: 1em;}
…можно только за счет еще более высокой специфичности:
.content .special {margin-bottom: 0;}
#intro {…}
id уникаленЧто именно использовать? Решайте сами в зависимости от задачи!
nth-…Выбираем нечетные элементы:
E:nth-child(odd) {…}
Четные:
E:nth-child(even) {…}
E:nth-child(2n)E:nth-child(5)E:nth-child(3n+5)E:nth-child(3n-5)E:nth-child(-4n+9)Ну и хватит. Хорошего понемножку. :-)
Аргумент — последовательность c(n) = an + b, где n — неотрицательное целое, a и b — целые
E:nth-child(2n) {…} /* 0-й, 2-й, 4-й, 6-й, … */E:nth-child(5) {…} /* только 5-й */E:nth-child(3n+5) {…} /* 5-й, 8-й, 11-й, … */E:nth-child(3n-5) {…} /* -5-й, -2-й, 1-й, 4-й, 7-й, … */E:nth-child(-4n+9) {…} /* 9-й, 5-й, 1-й, -3-й, … */
CSS:
.content p:nth-child(even) {…}
HTML:
<section class="content"><h1>Заголовок</h1><p>Текст первого абзаца.</p><pre><code>Образец кода</code></pre><p>Текст второго абзаца.</p></section>
CSS:
.content p:nth-of-type(even) {…}
HTML:
<section class="content"><h1>Заголовок</h1><p>Текст первого абзаца.</p><pre><code>Образец кода</code></pre><p>Текст второго абзаца.</p></section>
target
<section class="chapter" id="some-chapter-name">…</section>
.chapter:target {…}
http://some-site/some-page#some-chapter-name
Интересная штука, реализовал у себя
nth-child» (Крис Койер)