<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>
.content ul li {…}
Обычно справа налево!
القاعدة
.content ul li {…}
<ul>
.content ul li {…}
content
.content ul li {…}
Самые быстрые — такие селекторы, которые требуют меньшего количества проверок:
#intro {…}.content {…}
В порядке снижения производительности, обусловленного возрастанием количества или усложнением проверок:
div {…}* {…}[title] {…}:hover {…}
В порядке снижения производительности, обусловленного возрастанием количества проверок:
h1 + p {…}ul > li {…}pre code {…}
#intro * {…}

header#intro {…}
#intro {…}
Это почти полностью справедливо и для селекторов по классу
body ul.navigation li a {…}
.navigation a {…}
* справаGoogle Page Speed рекомендует:
ul li {color: blue;}ol li {color: red;}
.unordered-list-item {color: blue;}.ordered-list-item {color: red;}
Семантика?.. Объем HTML-кода?..
Странное, казалось бы, дело:
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.5;}
<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;}
| № | Вид теста | Время загрузки | Время обработки CSS |
|---|---|---|---|
| 00 | Без стилей | 100% | 100% |
| 01 | #foo |
108% | 116% |
| 02 | .foo |
108% | 121% |
| 03 | .foo > span |
129% | 641% |
| 04 | .foo span |
133% | 655% |
| 05 | .foo * |
164% | 1081% |
| № | Вид теста | Время загрузки | Время обработки CSS |
|---|---|---|---|
| 06 | .bar p:last-child |
116% | 541% |
| 07 | .bar p:nth-child(-11n+10) |
118% | 602% |
| 08 | .bar p:nth-of-type(-11n+10) |
117% | 546% |
| № | Вид теста | Время загрузки |
|---|---|---|
| 09 | body.page div section article[class*="number"] :last-child * |
238% |
| 10 | * * * [class*="number"] :last-child * |
307% |
| № | Вид теста | Opera 12 | FF 12 | FF 13 | Chrome 19 |
|---|---|---|---|---|---|
| 00 | Без стилей | 100% | 100% | 100% | 100% |
| 01 | #foo |
108% | 109% | 107% | 104% |
| 02 | .foo |
108% | 111% | 109% | 102% |
| 05 | .foo * |
164% | 271% | 116% | 112% |
| 09 | body.page div section article[class*="number"] :last-child * |
238% | 489% | 446% | 897% |
| 10 | * * * [class*="number"] :last-child * |
307% | 662% | 593% | 1135% |
id уникаленЧто именно использовать? Решайте сами в зависимости от задачи!
.content h1 {…}.content p {…}