<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 {
…
}