.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
» (Крис Койер)