<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Веб-стандарты &#187; Статьи</title>
	<atom:link href="http://web-standards.ru/category/articles/feed/" rel="self" type="application/rss+xml" />
	<link>http://web-standards.ru</link>
	<description>Российское сообщество разработчиков</description>
	<lastBuildDate>Tue, 15 May 2012 22:32:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Элементы figure и figcaption</title>
		<link>http://web-standards.ru/articles/figure-figcaption/</link>
		<comments>http://web-standards.ru/articles/figure-figcaption/#comments</comments>
		<pubDate>Mon, 12 Mar 2012 15:20:09 +0000</pubDate>
		<dc:creator>Ричард Кларк</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5doctor]]></category>
		<category><![CDATA[семантика]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/figure-figcaption/</guid>
		<description><![CDATA[<p>В обычных печатных изданиях, таких как книги и журналы, изображения, таблицы или примеры кода обычно сопровождаются подписью. До сих пор у нас не было возможности семантически выделять такой тип содержимого напрямую в HTML, вместо того чтобы прибегать к именам классов СSS. HTML5 надеется исправить эту проблему с помощью новых элементов: <code>&lt;figure&gt;</code> и <code>&lt;figcaption&gt;</code>. Давайте разберемся!</p>

<h2>Элемент <code>&lt;figure&gt;</code></h2>

<p>Предполагается, что элемент <code>&lt;figure&gt;</code> будет использоваться в сочетании с элементом <code>&lt;figcaption&gt;</code> для того, чтобы выделять диаграммы, иллюстрации, фотографии и примеры кода (помимо прочего). Вот что говорится о <code>&lt;figure&gt;</code> в спецификации:</p>

<blockquote>
	<p>Элемент <code>&lt;figure&gt;</code> представляет собой фрагмент независимого содержимого, совсем необязательно с подписью, который как правило относится к отдельному элементу из основного содержимого документа, и может быть удалён из документа без ущерба его смыслу.</p>
	<p>— <a href="http://dev.w3.org/html5/markup/figure.html">Спецификация W3C</a></p>
</blockquote>

<h2>Элемент <code>&lt;figcaption&gt;</code></h2>

<p>Этот элемент стал <a href="http://adactio.com/journal/1604/">поводом</a> <a href="http://remysharp.com/2009/08/12/saving-figure-detail/">серьезных</a> <a href="http://html5doctor.com/legend-not-such-a-legend-anymore/">споров</a>. Спецификация изначально предлагала приспособить для этих целей элемент <code>&lt;legend&gt;</code>, вместо того, чтобы придумывать новый элемент. Были и другие предложения, включавшие <code>&lt;label&gt;</code>, <code>&lt;caption&gt;</code>, <code>&lt;p&gt;</code> и даже заголовки <code>&lt;h1&gt;</code>—<code>&lt;h6&gt;</code>. Семантика элемента <code>&lt;legend&gt;</code> <a href="http://html5doctor.com/legend-not-such-a-legend-anymore/">изменилась</a>, и поэтому мы начали использовать комбинацию <code>&lt;dt&gt;</code> и <code>&lt;dd&gt;</code> внутри <code>&lt;figure&gt;</code> по предложению <a href="http://twitter.com/adactio">Джереми</a>. Но большинство этих идей были отклонены из-за отсутствия обратной совместимости для CSS-оформления.</p>

<p>Наши постоянные читатели знают, что недавно <a href="http://html5doctor.com/summary-figcaption-element/">был представлен новый элемент</a> <code>&lt;figcaption&gt;</code>. Кто знает, приживется ли он, а пока давайте узнаем, что о нём говорит спецификация:</p>

<blockquote>
	<p>Элемент <code>&lt;figcaption&gt;</code> представляет собой заголовок или описание для &lt;figure&gt;.</p>
	<p>— <a href="http://dev.w3.org/html5/markup/figcaption.html">Спецификация W3C</a></p>
</blockquote>

<p>Элемент <code>&lt;figcaption&gt;</code> является необязательным и может появляться до <em>или</em> после содержимого внутри <code>&lt;figure&gt;</code>. Только один элемент <code>&lt;figcaption&gt;</code> может быть помещен в <code>&lt;figure&gt;</code>, хотя сам элемент <code>&lt;figure&gt;</code> может содержать несколько дочерних элементов (например, <code>&lt;img&gt;</code> или <code>&lt;code&gt;</code>).</p>

<h2>Использование <code>&lt;figure&gt;</code> и <code>&lt;figcaption&gt;</code></h2>

<p>Итак, мы узнали, что об этих элементах говорится в спецификации. Как же их использовать? Давайте рассмотрим это на примерах.</p>

<h3><code>&lt;figure&gt;</code> для изображения</h3>

<p>Изображение в элементе <code>&lt;figure&gt;</code> без подписи:</p>

<figure>
	<img src="http://static.web-standards.ru/articles/figure-figcaption/orang-utan.jpg" alt="Малыш орангутанга свисает с каната">
</figure>

<p>Вот код для этого:</p>

<pre>
	<code>&lt;figure&gt;</code>
	<code>    &lt;img src="orang-utan.jpg"</code>
	<code>         alt="Малыш орангутанга свисает с каната"&gt;</code>
	<code>&lt;/figure&gt;</code>
</pre>

<h3><code>&lt;figure&gt;</code> с изображением и подписью</h3>

<p>Изображение внутри элемента <code>&lt;figure&gt;</code> с поясняющей подписью:</p>

<figure>
	<img src="http://static.web-standards.ru/articles/figure-figcaption/macaque.jpg" alt="Макака на дереве">
	<figcaption>Наглая макака из Борнео. Фото <a href="http://www.flickr.com/photos/rclark/102352241/in/set-72057594082373448/">Ричарда Кларка</a></figcaption>
</figure>

<p>И код, который мы использовали:</p>

<pre>
	<code>&lt;figure&gt;</code>
	<code>    &lt;img src="macaque.jpg" alt="Макака на дереве"&gt;</code>
	<code>    &lt;figcaption&gt;</code>
	<code>        Наглая макака из Борнео.</code>
	<code>        Фото &lt;a href="…"&gt;Ричарда Кларка&lt;/a&gt;</code>
	<code>    &lt;/figcaption&gt;</code>
	<code>&lt;/figure&gt;</code>
</pre>

<h3><code>&lt;figure&gt;</code> с несколькими изображениями</h3>

<p>Размещение нескольких изображений внутри одного элемента <code>&lt;figure&gt;</code> с общей подписью:</p>

<figure>
	<img src="http://static.web-standards.ru/articles/figure-figcaption/kookaburra.jpg" alt="Кукабара">
	<img src="http://static.web-standards.ru/articles/figure-figcaption/pelican.jpg" alt="Пеликан на пляже">
	<img src="http://static.web-standards.ru/articles/figure-figcaption/lorikeet.jpg" alt="Наглый многоцветный лорикет">
	<figcaption>Слева направо: кукабара, пеликан и многоцветный лорикет. Фотографии <a href="http://www.flickr.com/photos/rclark/">Ричарда Кларка</a></figcaption>
</figure>

<p>И сам код:</p>

<pre>
	<code>&lt;figure&gt;</code>
	<code>    &lt;img src="kookaburra.jpg" alt="Кукабара"&gt;</code>
	<code>    &lt;img src="pelican.jpg" alt="Пеликан на пляже"&gt;</code>
	<code>    &lt;img src="lorikeet.jpg" alt="Наглый многоцветный лорикет"&gt;</code>
	<code>    &lt;figcaption&gt;</code>
	<code>        Слева направо: кукабара, пеликан и многоцветный лорикет.</code>
	<code>        Фотографии &lt;a href="…"&gt;Ричарда Кларка&lt;/a&gt;</code>
	<code>    &lt;/figcaption&gt;</code>
	<code>&lt;/figure&gt;</code>
</pre>

<h3><code>&lt;figure&gt;</code> с блоком кода</h3>

<p>Элемент <code>&lt;figure&gt;</code> может быть также использован для примеров кода:</p>

<figure>
<blockquote>
	<p><code>&lt;small&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution Share-alike license&lt;/a&gt;&lt;/small&gt;</code></p>
</blockquote>
	<figcaption>Использование элемента <code>&lt;small&gt;</code> вокруг ссылки на лицензию Creative Commons с <code>rel="license"</code>.</figcaption>
</figure>

<p>Ниже приведен код для этого:</p>

<pre>
	<code>&lt;figure&gt;</code>
	<code>    &lt;blockquote&gt;</code>
	<code>        &lt;p&gt;&lt;code&gt;&lt;small&gt;</code>
	<code>            &lt;a rel="license" href="…"&gt;</code>
	<code>                Creative Commons Attribution Share-alike license</code>
	<code>            &lt;/a&gt;</code>
	<code>        &lt;/small&gt;&lt;/code&gt;&lt;/p&gt;</code>
	<code>    &lt;/blockquote&gt;</code>
	<code>    &lt;figcaption&gt;</code>
	<code>        Использование элемента &lt;code&gt;&amp;lt;small&amp;gt;&lt;/code&gt;</code>
	<code>        вокруг ссылки на лицензию Creative Commons</code>
	<code>        с &lt;code&gt;rel="license"&lt;/code&gt;.</code>
	<code>    &lt;/figcaption&gt;</code>
	<code>&lt;/figure&gt;</code>
</pre>

<h3>Различия между <code>&lt;figure&gt;</code> и <code>&lt;aside&gt;</code></h3>

<p>Мы уже говорили об элементе <code>&lt;aside&gt;</code> <a href="http://html5doctor.com/aside-revisited/">в предыдущей статье</a>, но важно отметить разницу между ними. При выборе между <code>&lt;aside&gt;</code> или <code>&lt;figure&gt;</code>, стоит спросить себя, имеет ли содержимое элемента важное значение для понимания содержимого:</p>

<ul>
	<li>Если содержимое просто имеет отношение и не является существенным, то используйте <code>&lt;aside&gt;</code>.</li>
	<li>Если содержимое является важным, но его положение в потоке общего содержимого не так важно, используется элемент <code>&lt;figure&gt;</code>.</li>
</ul>

<p>Обратите внимание, что если положение содержимого в тексте тесно связано с предыдущим и последующим содержимым, следует использовать более подходящие элементы — например, <code>&lt;div&gt;</code>, старый добрый <code>&lt;img&gt;</code>, <code>&lt;blockquote&gt;</code>, или даже <code>&lt;canvas&gt;</code>, в зависимости от типа содержимого.</p>

<h2>Не останавливайтесь на достигнутом!</h2>

<p>Не стоит ограничивать использование <code>&lt;figure&gt;</code> изображениями и примерами кода. Другим содержимым, подходящим по смыслу для использования в элементе <code>&lt;figure&gt;</code> может быть аудио, видео, графики (возможно, с использованием <code>&lt;canvas&gt;</code> или <code>&lt;svg&gt;</code>), стихи или таблицы со статистикой.</p>

<p>Однако использование элемента <code>&lt;figure&gt;</code> не всегда целесообразно. Например, графический баннер не стоит размечать в <code>&lt;figure&gt;</code>. Используйте для этого просто <code>&lt;img&gt;</code>.</p>

<h2>Вывод</h2>

<p>Как мы продемонстрировали в этой статье, элемент <code>&lt;figure&gt;</code> открывает много возможностей. Только не забудьте убедиться, что он подходходит для конкретного случая. Хотя вряд ли вы бездумно относитесь к разметке, так ведь?</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/the-figure-figcaption-elements/">The figure &amp; figcaption elements</a>» <a href="http://richclarkdesign.com/">Ричарда Кларка</a> (Richard Clark), опубликованной на сайте <a href="http://html5doctor.com/">HTML5Doctor.com</a>.</p>
<p class="note">Перевод выполнила Екатерина Мордвина.</p>]]></description>
			<content:encoded><![CDATA[<p>В обычных печатных изданиях, таких как книги и журналы, изображения, таблицы или примеры кода обычно сопровождаются подписью. До сих пор у нас не было возможности семантически выделять такой тип содержимого напрямую в HTML, вместо того чтобы прибегать к именам классов СSS. HTML5 надеется исправить эту проблему с помощью новых элементов: <code>&lt;figure&gt;</code> и <code>&lt;figcaption&gt;</code>. Давайте разберемся!</p>

<h2>Элемент <code>&lt;figure&gt;</code></h2>

<p>Предполагается, что элемент <code>&lt;figure&gt;</code> будет использоваться в сочетании с элементом <code>&lt;figcaption&gt;</code> для того, чтобы выделять диаграммы, иллюстрации, фотографии и примеры кода (помимо прочего). Вот что говорится о <code>&lt;figure&gt;</code> в спецификации:</p>

<blockquote>
	<p>Элемент <code>&lt;figure&gt;</code> представляет собой фрагмент независимого содержимого, совсем необязательно с подписью, который как правило относится к отдельному элементу из основного содержимого документа, и может быть удалён из документа без ущерба его смыслу.</p>
	<p>— <a href="http://dev.w3.org/html5/markup/figure.html">Спецификация W3C</a></p>
</blockquote>

<h2>Элемент <code>&lt;figcaption&gt;</code></h2>

<p>Этот элемент стал <a href="http://adactio.com/journal/1604/">поводом</a> <a href="http://remysharp.com/2009/08/12/saving-figure-detail/">серьезных</a> <a href="http://html5doctor.com/legend-not-such-a-legend-anymore/">споров</a>. Спецификация изначально предлагала приспособить для этих целей элемент <code>&lt;legend&gt;</code>, вместо того, чтобы придумывать новый элемент. Были и другие предложения, включавшие <code>&lt;label&gt;</code>, <code>&lt;caption&gt;</code>, <code>&lt;p&gt;</code> и даже заголовки <code>&lt;h1&gt;</code>—<code>&lt;h6&gt;</code>. Семантика элемента <code>&lt;legend&gt;</code> <a href="http://html5doctor.com/legend-not-such-a-legend-anymore/">изменилась</a>, и поэтому мы начали использовать комбинацию <code>&lt;dt&gt;</code> и <code>&lt;dd&gt;</code> внутри <code>&lt;figure&gt;</code> по предложению <a href="http://twitter.com/adactio">Джереми</a>. Но большинство этих идей были отклонены из-за отсутствия обратной совместимости для CSS-оформления.</p>

<p>Наши постоянные читатели знают, что недавно <a href="http://html5doctor.com/summary-figcaption-element/">был представлен новый элемент</a> <code>&lt;figcaption&gt;</code>. Кто знает, приживется ли он, а пока давайте узнаем, что о нём говорит спецификация:</p>

<blockquote>
	<p>Элемент <code>&lt;figcaption&gt;</code> представляет собой заголовок или описание для &lt;figure&gt;.</p>
	<p>— <a href="http://dev.w3.org/html5/markup/figcaption.html">Спецификация W3C</a></p>
</blockquote>

<p>Элемент <code>&lt;figcaption&gt;</code> является необязательным и может появляться до <em>или</em> после содержимого внутри <code>&lt;figure&gt;</code>. Только один элемент <code>&lt;figcaption&gt;</code> может быть помещен в <code>&lt;figure&gt;</code>, хотя сам элемент <code>&lt;figure&gt;</code> может содержать несколько дочерних элементов (например, <code>&lt;img&gt;</code> или <code>&lt;code&gt;</code>).</p>

<h2>Использование <code>&lt;figure&gt;</code> и <code>&lt;figcaption&gt;</code></h2>

<p>Итак, мы узнали, что об этих элементах говорится в спецификации. Как же их использовать? Давайте рассмотрим это на примерах.</p>

<h3><code>&lt;figure&gt;</code> для изображения</h3>

<p>Изображение в элементе <code>&lt;figure&gt;</code> без подписи:</p>

<figure>
	<img src="http://static.web-standards.ru/articles/figure-figcaption/orang-utan.jpg" alt="Малыш орангутанга свисает с каната">
</figure>

<p>Вот код для этого:</p>

<pre>
	<code>&lt;figure&gt;</code>
	<code>    &lt;img src="orang-utan.jpg"</code>
	<code>         alt="Малыш орангутанга свисает с каната"&gt;</code>
	<code>&lt;/figure&gt;</code>
</pre>

<h3><code>&lt;figure&gt;</code> с изображением и подписью</h3>

<p>Изображение внутри элемента <code>&lt;figure&gt;</code> с поясняющей подписью:</p>

<figure>
	<img src="http://static.web-standards.ru/articles/figure-figcaption/macaque.jpg" alt="Макака на дереве">
	<figcaption>Наглая макака из Борнео. Фото <a href="http://www.flickr.com/photos/rclark/102352241/in/set-72057594082373448/">Ричарда Кларка</a></figcaption>
</figure>

<p>И код, который мы использовали:</p>

<pre>
	<code>&lt;figure&gt;</code>
	<code>    &lt;img src="macaque.jpg" alt="Макака на дереве"&gt;</code>
	<code>    &lt;figcaption&gt;</code>
	<code>        Наглая макака из Борнео.</code>
	<code>        Фото &lt;a href="…"&gt;Ричарда Кларка&lt;/a&gt;</code>
	<code>    &lt;/figcaption&gt;</code>
	<code>&lt;/figure&gt;</code>
</pre>

<h3><code>&lt;figure&gt;</code> с несколькими изображениями</h3>

<p>Размещение нескольких изображений внутри одного элемента <code>&lt;figure&gt;</code> с общей подписью:</p>

<figure>
	<img src="http://static.web-standards.ru/articles/figure-figcaption/kookaburra.jpg" alt="Кукабара">
	<img src="http://static.web-standards.ru/articles/figure-figcaption/pelican.jpg" alt="Пеликан на пляже">
	<img src="http://static.web-standards.ru/articles/figure-figcaption/lorikeet.jpg" alt="Наглый многоцветный лорикет">
	<figcaption>Слева направо: кукабара, пеликан и многоцветный лорикет. Фотографии <a href="http://www.flickr.com/photos/rclark/">Ричарда Кларка</a></figcaption>
</figure>

<p>И сам код:</p>

<pre>
	<code>&lt;figure&gt;</code>
	<code>    &lt;img src="kookaburra.jpg" alt="Кукабара"&gt;</code>
	<code>    &lt;img src="pelican.jpg" alt="Пеликан на пляже"&gt;</code>
	<code>    &lt;img src="lorikeet.jpg" alt="Наглый многоцветный лорикет"&gt;</code>
	<code>    &lt;figcaption&gt;</code>
	<code>        Слева направо: кукабара, пеликан и многоцветный лорикет.</code>
	<code>        Фотографии &lt;a href="…"&gt;Ричарда Кларка&lt;/a&gt;</code>
	<code>    &lt;/figcaption&gt;</code>
	<code>&lt;/figure&gt;</code>
</pre>

<h3><code>&lt;figure&gt;</code> с блоком кода</h3>

<p>Элемент <code>&lt;figure&gt;</code> может быть также использован для примеров кода:</p>

<figure>
<blockquote>
	<p><code>&lt;small&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution Share-alike license&lt;/a&gt;&lt;/small&gt;</code></p>
</blockquote>
	<figcaption>Использование элемента <code>&lt;small&gt;</code> вокруг ссылки на лицензию Creative Commons с <code>rel="license"</code>.</figcaption>
</figure>

<p>Ниже приведен код для этого:</p>

<pre>
	<code>&lt;figure&gt;</code>
	<code>    &lt;blockquote&gt;</code>
	<code>        &lt;p&gt;&lt;code&gt;&lt;small&gt;</code>
	<code>            &lt;a rel="license" href="…"&gt;</code>
	<code>                Creative Commons Attribution Share-alike license</code>
	<code>            &lt;/a&gt;</code>
	<code>        &lt;/small&gt;&lt;/code&gt;&lt;/p&gt;</code>
	<code>    &lt;/blockquote&gt;</code>
	<code>    &lt;figcaption&gt;</code>
	<code>        Использование элемента &lt;code&gt;&amp;lt;small&amp;gt;&lt;/code&gt;</code>
	<code>        вокруг ссылки на лицензию Creative Commons</code>
	<code>        с &lt;code&gt;rel="license"&lt;/code&gt;.</code>
	<code>    &lt;/figcaption&gt;</code>
	<code>&lt;/figure&gt;</code>
</pre>

<h3>Различия между <code>&lt;figure&gt;</code> и <code>&lt;aside&gt;</code></h3>

<p>Мы уже говорили об элементе <code>&lt;aside&gt;</code> <a href="http://html5doctor.com/aside-revisited/">в предыдущей статье</a>, но важно отметить разницу между ними. При выборе между <code>&lt;aside&gt;</code> или <code>&lt;figure&gt;</code>, стоит спросить себя, имеет ли содержимое элемента важное значение для понимания содержимого:</p>

<ul>
	<li>Если содержимое просто имеет отношение и не является существенным, то используйте <code>&lt;aside&gt;</code>.</li>
	<li>Если содержимое является важным, но его положение в потоке общего содержимого не так важно, используется элемент <code>&lt;figure&gt;</code>.</li>
</ul>

<p>Обратите внимание, что если положение содержимого в тексте тесно связано с предыдущим и последующим содержимым, следует использовать более подходящие элементы — например, <code>&lt;div&gt;</code>, старый добрый <code>&lt;img&gt;</code>, <code>&lt;blockquote&gt;</code>, или даже <code>&lt;canvas&gt;</code>, в зависимости от типа содержимого.</p>

<h2>Не останавливайтесь на достигнутом!</h2>

<p>Не стоит ограничивать использование <code>&lt;figure&gt;</code> изображениями и примерами кода. Другим содержимым, подходящим по смыслу для использования в элементе <code>&lt;figure&gt;</code> может быть аудио, видео, графики (возможно, с использованием <code>&lt;canvas&gt;</code> или <code>&lt;svg&gt;</code>), стихи или таблицы со статистикой.</p>

<p>Однако использование элемента <code>&lt;figure&gt;</code> не всегда целесообразно. Например, графический баннер не стоит размечать в <code>&lt;figure&gt;</code>. Используйте для этого просто <code>&lt;img&gt;</code>.</p>

<h2>Вывод</h2>

<p>Как мы продемонстрировали в этой статье, элемент <code>&lt;figure&gt;</code> открывает много возможностей. Только не забудьте убедиться, что он подходходит для конкретного случая. Хотя вряд ли вы бездумно относитесь к разметке, так ведь?</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/the-figure-figcaption-elements/">The figure &amp; figcaption elements</a>» <a href="http://richclarkdesign.com/">Ричарда Кларка</a> (Richard Clark), опубликованной на сайте <a href="http://html5doctor.com/">HTML5Doctor.com</a>.</p>
<p class="note">Перевод выполнила Екатерина Мордвина.</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/figure-figcaption/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Разбираемся с vertical-align</title>
		<link>http://web-standards.ru/articles/vertical-align/</link>
		<comments>http://web-standards.ru/articles/vertical-align/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 11:07:02 +0000</pubDate>
		<dc:creator>Луис Лазарис </dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/vertical-align/</guid>
		<description><![CDATA[<p>«Опять <code>vertical-align</code> не работает!» — вздохнёт веб-разработчик.</p>
<p>CSS-свойство <code>vertical-align</code> — одно из тех, которые с виду очень просты, но могут вызвать вопросы у начинающих разработчиков. Я думаю, что даже у многих ветеранов CSS когда-то были проблемы с тем, чтобы его до конца понять.</p>
<p>В этой статье я постараюсь в понятной форме рассказать про это свойство.</p>

<h2>Чего оно не делает</h2>
<p>Распространенное заблуждение о <code>vertical-align</code> состоит в том, что применяясь к одному элементу, оно заставляет все элементы внутри него изменить свою вертикальную позицию. Например, когда элементу задан <code>vertical-align:top</code>, это подразумевает, что его содержимое поднимется к его же верхней границе.</p>
<p>Вспоминаются времена, когда мы делали раскладки на основе таблиц:</p>

<pre>
<code>&lt;td valign="top"&gt;</code>
<code>    Что-нибудь…</code>
<code>&lt;/td&gt;</code>
</pre>

<p>В данном примере с ячейкой таблицы использование свойства <code>valign</code> (в настоящее время <a href="http://www.w3.org/TR/html5/obsolete.html#non-conforming-features">исключенного из HTML5</a>) приведёт к тому, что элементы внутри ячейки прижмутся к её верху. И естественно, когда верстальщики начинают использовать <code>vertical-align</code>, они думают, что получится то же самое, и содержимое элемента выровняется в соответствии со значением свойства.</p>
<p>Но <code>vertical-align</code> работает не так.</p>

<h2>Чем оно является на самом деле</h2>
<p>Использование свойства <code>vertical-align</code> может быть разбито на три простых для понимания правила:</p>

<ol>
<li>Оно применяется только к строчным элементам <code>inline</code> или строчным блокам <code>inline-block</code>.</li>
<li>Оно влияет на выравнивание самого элемента, а не его содержимого (кроме случаев, когда применяется к ячейкам таблицы).</li>
<li>Когда оно применяется к ячейке таблицы, выравнивание влияет на содержимое ячейки, а не на неё саму.</li>
</ol>

<p>Иными словами, следующий код не даст никакого эффекта:</p>

<pre>
<code>div {</code>
<code>    vertical-align:middle; /* эта строка бесполезна */</code>
<code>    }</code>
</pre>

<p>Почему? Потому что <code>&lt;div&gt;</code> — это не строчный элемент и даже не строчный блок. Конечно, если вы сделаете его строчным или строчным блоком, то применение <code>vertical-align</code> даст желаемый эффект.</p>

<p>С другой стороны, при правильном применении (к строчному элементу или строчному блоку), свойство <code>vertical-align</code> заставит текущий элемент выровняться относительно других строчных элементов.</p>

<p>Выше или ниже расположится элемент, будет зависеть от высоты строчных элементов на этой же строке или от свойства <code>line-height</code>, заданного для неё.</p>

<h2>Несколько картинок</h2>

<p>Вот картинка с пояснительным текстом, которая поможет вам понять, что происходит при вертикальном выравнивании строчных элементов:</p>

<img src="http://static.web-standards.ru/articles/vertical-align/vertical-align.png" class="pic" alt="">

<p><a href="http://jsbin.com/isuvob/edit#html,live">А вот пример</a>, в котором есть несколько строчных элементов, один из которых прижат к верху.</p>

<h2>Ключевые слова</h2>

<p>Несколько ключевых слов, которые можно задавать в качестве значений для свойства <code>vertical-align</code>:</p>

<ul>
<li><code>baseline</code>, значение по умолчанию или «изначальное»</li>
<li><code>bottom</code></li>
<li><code>middle</code></li>
<li><code>sub</code></li>
<li><code>super</code></li>
<li><code>text-bottom</code></li>
<li><code>text-top</code></li>
<li><code>top</code></li>
</ul>

<p>Возможно, многие из них вы не будете использовать, но было бы неплохо знать все имеющиеся варианты. Например, <a href="http://jsbin.com/isuvob/edit#html,live">на демо-странице</a>, из-за того что значение <code>vertical-align</code> для <code>&lt;input&gt;</code> установлено как <code>top</code>, он выровнен по самому высокому элементу в строке (большой картинке).</p>

<p>Однако если вы не хотите выравнивать элемент относительно картинок или других строчных элементов, обладающих блочными свойствами, вы можете выбрать значение <code>text-top</code> или <code>text-bottom</code>, тогда элементы будут выравниваться относительно текста в строке.</p>

<h2>О ключевом слове <code>middle</code></h2>

<p>К сожалению, правило <code>vertical-align:middle</code> не выровняет строчный элемент по середине самого высокого элемента в строке (как вы, возможно, ожидали). Вместо этого значение <code>middle</code> заставит элемент выровняться по середине высоты гипотетической строчной буквы <strong>«x»</strong> (так же называемой <i>x-height</i>). Потому, мне кажется, что это значение на самом деле должно называться <code>text-middle</code>, чтобы стало понятно, какой будет результат.</p>

<p>Взгляните <a href="http://jsbin.com/apiqog/edit#html,live">на пример</a>, где я увеличил размер шрифта так, чтобы размер <i>x-height</i> стал гораздо больше. После этого станет понятно, что значение <code>middle</code> не получится использовать очень часто.</p>

<h2>Числовые значения</h2>

<p>Возможно, вы не знали о том, что <code>vertical-align</code> принимает числовые и процентные значения. Однако это так, и вот примеры их использования:</p>

<pre>
<code>input {</code>
<code>    vertical-align:100px;</code>
<code>    }</code>
<code>span {</code>
<code>    vertical-align:50%;</code>
<code>    }</code>
<code>img {</code>
<code>    vertical-align:-300px;</code>
<code>    }</code>
</pre>

<p>Несмотря на то, что вы можете прочитать <a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align">в спецификации</a> раздел, описывающий, какие есть ключевые слова и значения, я думаю, гораздо полезней будет самостоятельно <a href="http://jsbin.com/isuvob/edit#html,live">поиграть с ними</a> и сравнить результаты.</p>

<h2>Заключение</h2>

<p>Если в одной фразе подводить итог о том, как использовать это традиционно неправильно понимаемое свойство, я бы сказал:</p>

<p>Свойство <code>vertical-align</code> работает только со строчными элементами или строчными блоками и ячейками таблицы. В случае применения не к ячейкам таблицы, оно действует на сам элемент, а не на его содержимое.</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://www.impressivewebs.com/css-vertical-align/">Understanding CSS’s vertical-align Property</a>» <a href="http://www.impressivewebs.com/about/">Луиса Лазариса</a> (Louis Lazaris), опубликованной на сайте «<a href="http://www.impressivewebs.com/">Impressive Webs</a>».</p>
<p class="note">Перевод выполнил <a href="http://htmlhero.ru/">Андрей Мотошин</a>.</p>]]></description>
			<content:encoded><![CDATA[<p>«Опять <code>vertical-align</code> не работает!» — вздохнёт веб-разработчик.</p>
<p>CSS-свойство <code>vertical-align</code> — одно из тех, которые с виду очень просты, но могут вызвать вопросы у начинающих разработчиков. Я думаю, что даже у многих ветеранов CSS когда-то были проблемы с тем, чтобы его до конца понять.</p>
<p>В этой статье я постараюсь в понятной форме рассказать про это свойство.</p>

<h2>Чего оно не делает</h2>
<p>Распространенное заблуждение о <code>vertical-align</code> состоит в том, что применяясь к одному элементу, оно заставляет все элементы внутри него изменить свою вертикальную позицию. Например, когда элементу задан <code>vertical-align:top</code>, это подразумевает, что его содержимое поднимется к его же верхней границе.</p>
<p>Вспоминаются времена, когда мы делали раскладки на основе таблиц:</p>

<pre>
<code>&lt;td valign="top"&gt;</code>
<code>    Что-нибудь…</code>
<code>&lt;/td&gt;</code>
</pre>

<p>В данном примере с ячейкой таблицы использование свойства <code>valign</code> (в настоящее время <a href="http://www.w3.org/TR/html5/obsolete.html#non-conforming-features">исключенного из HTML5</a>) приведёт к тому, что элементы внутри ячейки прижмутся к её верху. И естественно, когда верстальщики начинают использовать <code>vertical-align</code>, они думают, что получится то же самое, и содержимое элемента выровняется в соответствии со значением свойства.</p>
<p>Но <code>vertical-align</code> работает не так.</p>

<h2>Чем оно является на самом деле</h2>
<p>Использование свойства <code>vertical-align</code> может быть разбито на три простых для понимания правила:</p>

<ol>
<li>Оно применяется только к строчным элементам <code>inline</code> или строчным блокам <code>inline-block</code>.</li>
<li>Оно влияет на выравнивание самого элемента, а не его содержимого (кроме случаев, когда применяется к ячейкам таблицы).</li>
<li>Когда оно применяется к ячейке таблицы, выравнивание влияет на содержимое ячейки, а не на неё саму.</li>
</ol>

<p>Иными словами, следующий код не даст никакого эффекта:</p>

<pre>
<code>div {</code>
<code>    vertical-align:middle; /* эта строка бесполезна */</code>
<code>    }</code>
</pre>

<p>Почему? Потому что <code>&lt;div&gt;</code> — это не строчный элемент и даже не строчный блок. Конечно, если вы сделаете его строчным или строчным блоком, то применение <code>vertical-align</code> даст желаемый эффект.</p>

<p>С другой стороны, при правильном применении (к строчному элементу или строчному блоку), свойство <code>vertical-align</code> заставит текущий элемент выровняться относительно других строчных элементов.</p>

<p>Выше или ниже расположится элемент, будет зависеть от высоты строчных элементов на этой же строке или от свойства <code>line-height</code>, заданного для неё.</p>

<h2>Несколько картинок</h2>

<p>Вот картинка с пояснительным текстом, которая поможет вам понять, что происходит при вертикальном выравнивании строчных элементов:</p>

<img src="http://static.web-standards.ru/articles/vertical-align/vertical-align.png" class="pic" alt="">

<p><a href="http://jsbin.com/isuvob/edit#html,live">А вот пример</a>, в котором есть несколько строчных элементов, один из которых прижат к верху.</p>

<h2>Ключевые слова</h2>

<p>Несколько ключевых слов, которые можно задавать в качестве значений для свойства <code>vertical-align</code>:</p>

<ul>
<li><code>baseline</code>, значение по умолчанию или «изначальное»</li>
<li><code>bottom</code></li>
<li><code>middle</code></li>
<li><code>sub</code></li>
<li><code>super</code></li>
<li><code>text-bottom</code></li>
<li><code>text-top</code></li>
<li><code>top</code></li>
</ul>

<p>Возможно, многие из них вы не будете использовать, но было бы неплохо знать все имеющиеся варианты. Например, <a href="http://jsbin.com/isuvob/edit#html,live">на демо-странице</a>, из-за того что значение <code>vertical-align</code> для <code>&lt;input&gt;</code> установлено как <code>top</code>, он выровнен по самому высокому элементу в строке (большой картинке).</p>

<p>Однако если вы не хотите выравнивать элемент относительно картинок или других строчных элементов, обладающих блочными свойствами, вы можете выбрать значение <code>text-top</code> или <code>text-bottom</code>, тогда элементы будут выравниваться относительно текста в строке.</p>

<h2>О ключевом слове <code>middle</code></h2>

<p>К сожалению, правило <code>vertical-align:middle</code> не выровняет строчный элемент по середине самого высокого элемента в строке (как вы, возможно, ожидали). Вместо этого значение <code>middle</code> заставит элемент выровняться по середине высоты гипотетической строчной буквы <strong>«x»</strong> (так же называемой <i>x-height</i>). Потому, мне кажется, что это значение на самом деле должно называться <code>text-middle</code>, чтобы стало понятно, какой будет результат.</p>

<p>Взгляните <a href="http://jsbin.com/apiqog/edit#html,live">на пример</a>, где я увеличил размер шрифта так, чтобы размер <i>x-height</i> стал гораздо больше. После этого станет понятно, что значение <code>middle</code> не получится использовать очень часто.</p>

<h2>Числовые значения</h2>

<p>Возможно, вы не знали о том, что <code>vertical-align</code> принимает числовые и процентные значения. Однако это так, и вот примеры их использования:</p>

<pre>
<code>input {</code>
<code>    vertical-align:100px;</code>
<code>    }</code>
<code>span {</code>
<code>    vertical-align:50%;</code>
<code>    }</code>
<code>img {</code>
<code>    vertical-align:-300px;</code>
<code>    }</code>
</pre>

<p>Несмотря на то, что вы можете прочитать <a href="http://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align">в спецификации</a> раздел, описывающий, какие есть ключевые слова и значения, я думаю, гораздо полезней будет самостоятельно <a href="http://jsbin.com/isuvob/edit#html,live">поиграть с ними</a> и сравнить результаты.</p>

<h2>Заключение</h2>

<p>Если в одной фразе подводить итог о том, как использовать это традиционно неправильно понимаемое свойство, я бы сказал:</p>

<p>Свойство <code>vertical-align</code> работает только со строчными элементами или строчными блоками и ячейками таблицы. В случае применения не к ячейкам таблицы, оно действует на сам элемент, а не на его содержимое.</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://www.impressivewebs.com/css-vertical-align/">Understanding CSS’s vertical-align Property</a>» <a href="http://www.impressivewebs.com/about/">Луиса Лазариса</a> (Louis Lazaris), опубликованной на сайте «<a href="http://www.impressivewebs.com/">Impressive Webs</a>».</p>
<p class="note">Перевод выполнил <a href="http://htmlhero.ru/">Андрей Мотошин</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/vertical-align/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Атрибут contenteditable</title>
		<link>http://web-standards.ru/articles/contenteditable/</link>
		<comments>http://web-standards.ru/articles/contenteditable/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 10:48:44 +0000</pubDate>
		<dc:creator>Джек Осборн</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[contenteditable]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5doctor]]></category>
		<category><![CDATA[wysiwyg]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/contenteditable/</guid>
		<description><![CDATA[<p>Мы уже давно используем различные технологии для редактирования и хранения текста в браузере. С атрибутом <code>contenteditable</code> это становится намного проще. В этой статье я расскажу для чего этот атрибут, как он работает и куда нам двигаться дальше.</p>

<h2>Основы</h2>

<p>Давайте обратимся к спецификации:</p>

<blockquote>
	<p>Атрибут <code>contenteditable</code> обладает фиксированным набором значений, он может быть пустой строкой, <code>true</code> или <code>false</code>. Пустая строка или <code>true</code> обозначают, что элемент доступен для редактирования. <code>false</code> обозначает, что элемент недоступен для редактирования. Есть еще третье состояние — <code>inherit</code>, это значение атрибута по умолчанию и оно означает, что значение наследуется от родительского элемента.</p>
	<p>— <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#contenteditable">WHATWG</a></p>
</blockquote>

<p>В основном, атрибут <code>contenteditable</code> должен был обеспечивать работу WYSIWYG-редакторов. Скорее всего, вы встречали его в инструментах подобных Symphony или на cайтах вроде Flickr, где вы начинаете редактировать материалы, просто кликнув в определенную область.</p>

<p>Как упоминалось выше, <code>contenteditable</code> может быть в трёх возможных состояниях:</p>

<ol>
	<li><code>contenteditable=""</code> или <code>contenteditable="true"</code> означает, что элемент доступен для редактирования</li>
	<li><code>contenteditable="false"</code> означает, что элемент недоступен для редактирования</li>
	<li><code>contenteditable="inherit"</code> означает, что элемент доступен для редактирования в случае, если его непосредственный родитель доступен для редактирования. Это значение атрибута по умолчанию.</li>
</ol>

<p>Когда вы добавляете элементу атрибут <code>contenteditable</code>, браузер делает его доступным для редактирования. Кроме того, все потомки этого элемента также становятся доступны для редактирования, если атрибут <code>contenteditable</code> у них явно не установлен в <code>false</code>.</p>

<h2>Пример кода</h2>

<pre>
<code>&lt;div id="example-one" contenteditable="true"&gt;</code>
<code>    &lt;style scoped&gt;</code>
<code>        #example-one {</code>
<code>            margin:12px 0;</code>
<code>            }</code>
<code>        #example-one[contenteditable="true"] {</code>
<code>            padding:10px;</code>
<code>            outline:3px dashed #CCC;</code>
<code>            }</code>
<code>        #example-one[contenteditable="true"]:hover {</code>
<code>            outline:3px dashed #2B8BAD;</code>
<code>            }</code>
<code>    &lt;/style&gt;</code>
<code>    &lt;p&gt;Всё что находится в этом блоке, доступно для редактирования в браузерах, поддерживающих &lt;code&gt;HTML5&lt;/code&gt;. Давайте, попробуйте: кликните для начала редактирования.&lt;/p&gt;</code>
<code>&lt;/div&gt;</code>
</pre>

<h2>Демонстрация</h2>
<p>Вот два простых примера, показывающие работу <code>contenteditable</code>:</p>

<h3>Пример №1</h3>

<div id="example-one" contenteditable="true">
	<style scoped>
		#example-one { margin:12px 0; font-family:Consolas, Monaco, monospace; }
		#example-one[contenteditable="true"] { padding:10px; outline:3px dashed #CCC; }
		#example-one[contenteditable="true"]:hover { background:#E4F3F9; outline:3px dashed #2B8BAD; }
	</style>
	<p>Всё, что находится в этом блоке, доступно для редактирования в браузерах, поддерживающих <code>HTML5</code>. Давайте, попробуйте: кликните для начала редактирования.</p>
</div>
<p class="note">Редактирование текста</p>

<p>Я использовал CSS для создания оформления, показывающего, что текст доступен для редактирования. Обратите внимание на ориентированное на будущее использование <code>&lt;style scoped&gt;</code>, которое описано в моей <a href="http://html5doctor.com/the-scoped-attribute/"> предыдущей статье</a>.</p>

<h3>Пример №2</h3>

<p><a href="http://twitter.com/chriscoyier">Крис Койер</a> рассказывал на CSS-Tricks, что вы можете позволить вашим пользователям <a href="http://css-tricks.com/show-and-edit-style-element/">редактировать CSS в реальном времени</a>, так как <code>&lt;style&gt;</code> элемент имеет <code>display:none</code> по умолчанию, но ведь значение можно изменить на <code>block</code>.</p>

<p>Попробуйте отредактировать CSS, приведенный ниже:</p>

<div id="example-two" contenteditable="true">
	<style contenteditable="">#example-two {
    margin:12px 0;
    font-family:Consolas, Monaco, monospace;
    }
#example-two style {
    display:block;
    white-space:pre;
    }
#example-two[contenteditable="true"]{
    padding:10px;
    outline:3px dashed #CCC;
    }
#example-two[contenteditable="true"]:hover{
    background:#E4F3F9;
    outline:3px dashed #2B8BAD;
    }</style>
</div>
<p class="note">Редактирование таблицы стилей</p>

<h2>Поддержка браузерами</h2>

<p>Поддержка атрибута <code>contenteditable</code> браузерами на удивление хороша:</p>

<table>
<tr>
	<th>Браузер</th>
	<th>Версия</th>
</tr>
<tr>
	<td>Chrome</td>
	<td>4.0+</td>
</tr>
<tr>
	<td>Safari</td>
	<td>3.1+</td>
</tr>
<tr>
	<td>Mobile Safari</td>
	<td>5.0+</td>
</tr>
<tr>
	<td>Firefox</td>
	<td>3.5+</td>
</tr>
<tr>
	<td>Opera</td>
	<td>9.0+</td>
</tr>
<tr>
	<td>Opera Mini/Mobile</td>
	<td>Нет</td>
</tr>
<tr>
	<td>Internet Explorer</td>
	<td>5.5+</td>
</tr>
<tr>
	<td>Android</td>
	<td>3.0+</td>
</tr>
</table>
<p class="note">Поддержка браузерами свойства <code>contenteditable</code></p>

<p>Должен отметить, что появлением и отличной поддержкой атрибута мы обязаны IE 5.5, хотя на самом деле ранний вариант <code>contenteditable</code> был <a href="http://msdn.microsoft.com/en-us/library/ms537837(VS.85).aspx">разработан и внедрен Microsoft в июле 2000 года</a>.</p>

<p>Более подробную таблицу совместимости можно увидеть тут: <a href="http://caniuse.com/contenteditable">When Can I Use</a>.</p>

<h2>Сохранение изменений</h2>

<p>Для написания этого раздела я обратился за помощью к доктору Реми, так как он гораздо более сведущ во всём, что касается хранения <del>данных</del> всего на свете.</p>

<blockquote>
<p>В зависимости от сложности блока ваш код может отлавливать нажатие <kbd>Enter</kbd> (код 13) для сохранения изменения и <kbd>Esc</kbd> (код 27) для их отмены.</p>
<p>Когда пользователь нажимает <kbd>Enter</kbd> (предполагаем, что редактируем однострочные данные), получаем <code>innerHTML</code> редактируемого блока и посылаем AJAX-запрос с изменениями на сервер.</p>
<p>Простой пример можно увидеть тут: <a href="http://jsbin.com/owavu3">Сохранение данных из элемента с <code>сontenteditable</code> при помощи AJAX</a>.</p>
<p>— <a href="http://remysharp.com/">Реми Шарп</a></p>
</blockquote>

<h2>Заключение</h2>

<p>В своих статьях я неоднократно упоминал этот подход: спецификация наконец-то сделала официальным то, что внедрено в браузерах много лет назад.</p>

<p>Атрибут <code>contenteditable</code> — один из самых малоизвестных, но могу поспорить, что вы будете использовать его чаще, чем думаете.</p>

<p>Представьте себе возможность редактирования блока текста после простого клика на него: делать быстрые правки в статьях, редактировать комментарии или даже создавать не завязанные на серверную часть таблицы в веб-приложениях.</p>

<p>Если у вас есть идеи, как использовать этот атрибут — расскажите нам об этом в комментариях.</p>

<h2>Читать дальше</h2>

<ul>
	<li><a href="http://blog.whatwg.org/the-road-to-html-5-contenteditable#what">Что такое contenteditable?</a></li>
	<li><a href="http://css-tricks.com/expanding-images-html5/">Разворачиваем изображения с помощью HTML5 contenteditable</a></li>
</ul>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/the-contenteditable-attribute/">The contenteditable attribute</a>» <a href="http://jackosborne.co.uk/">Джека Осборна</a> (Jack Osborne), опубликованной на сайте «<a href="http://html5doctor.com/">HTML5 Doctor</a>».</p>
<p class="note">Перевод выполнил <a href="http://twitter.com/silentimp">Антон Немцев</a> (SilentImp).</p>]]></description>
			<content:encoded><![CDATA[<p>Мы уже давно используем различные технологии для редактирования и хранения текста в браузере. С атрибутом <code>contenteditable</code> это становится намного проще. В этой статье я расскажу для чего этот атрибут, как он работает и куда нам двигаться дальше.</p>

<h2>Основы</h2>

<p>Давайте обратимся к спецификации:</p>

<blockquote>
	<p>Атрибут <code>contenteditable</code> обладает фиксированным набором значений, он может быть пустой строкой, <code>true</code> или <code>false</code>. Пустая строка или <code>true</code> обозначают, что элемент доступен для редактирования. <code>false</code> обозначает, что элемент недоступен для редактирования. Есть еще третье состояние — <code>inherit</code>, это значение атрибута по умолчанию и оно означает, что значение наследуется от родительского элемента.</p>
	<p>— <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#contenteditable">WHATWG</a></p>
</blockquote>

<p>В основном, атрибут <code>contenteditable</code> должен был обеспечивать работу WYSIWYG-редакторов. Скорее всего, вы встречали его в инструментах подобных Symphony или на cайтах вроде Flickr, где вы начинаете редактировать материалы, просто кликнув в определенную область.</p>

<p>Как упоминалось выше, <code>contenteditable</code> может быть в трёх возможных состояниях:</p>

<ol>
	<li><code>contenteditable=""</code> или <code>contenteditable="true"</code> означает, что элемент доступен для редактирования</li>
	<li><code>contenteditable="false"</code> означает, что элемент недоступен для редактирования</li>
	<li><code>contenteditable="inherit"</code> означает, что элемент доступен для редактирования в случае, если его непосредственный родитель доступен для редактирования. Это значение атрибута по умолчанию.</li>
</ol>

<p>Когда вы добавляете элементу атрибут <code>contenteditable</code>, браузер делает его доступным для редактирования. Кроме того, все потомки этого элемента также становятся доступны для редактирования, если атрибут <code>contenteditable</code> у них явно не установлен в <code>false</code>.</p>

<h2>Пример кода</h2>

<pre>
<code>&lt;div id="example-one" contenteditable="true"&gt;</code>
<code>    &lt;style scoped&gt;</code>
<code>        #example-one {</code>
<code>            margin:12px 0;</code>
<code>            }</code>
<code>        #example-one[contenteditable="true"] {</code>
<code>            padding:10px;</code>
<code>            outline:3px dashed #CCC;</code>
<code>            }</code>
<code>        #example-one[contenteditable="true"]:hover {</code>
<code>            outline:3px dashed #2B8BAD;</code>
<code>            }</code>
<code>    &lt;/style&gt;</code>
<code>    &lt;p&gt;Всё что находится в этом блоке, доступно для редактирования в браузерах, поддерживающих &lt;code&gt;HTML5&lt;/code&gt;. Давайте, попробуйте: кликните для начала редактирования.&lt;/p&gt;</code>
<code>&lt;/div&gt;</code>
</pre>

<h2>Демонстрация</h2>
<p>Вот два простых примера, показывающие работу <code>contenteditable</code>:</p>

<h3>Пример №1</h3>

<div id="example-one" contenteditable="true">
	<style scoped>
		#example-one { margin:12px 0; font-family:Consolas, Monaco, monospace; }
		#example-one[contenteditable="true"] { padding:10px; outline:3px dashed #CCC; }
		#example-one[contenteditable="true"]:hover { background:#E4F3F9; outline:3px dashed #2B8BAD; }
	</style>
	<p>Всё, что находится в этом блоке, доступно для редактирования в браузерах, поддерживающих <code>HTML5</code>. Давайте, попробуйте: кликните для начала редактирования.</p>
</div>
<p class="note">Редактирование текста</p>

<p>Я использовал CSS для создания оформления, показывающего, что текст доступен для редактирования. Обратите внимание на ориентированное на будущее использование <code>&lt;style scoped&gt;</code>, которое описано в моей <a href="http://html5doctor.com/the-scoped-attribute/"> предыдущей статье</a>.</p>

<h3>Пример №2</h3>

<p><a href="http://twitter.com/chriscoyier">Крис Койер</a> рассказывал на CSS-Tricks, что вы можете позволить вашим пользователям <a href="http://css-tricks.com/show-and-edit-style-element/">редактировать CSS в реальном времени</a>, так как <code>&lt;style&gt;</code> элемент имеет <code>display:none</code> по умолчанию, но ведь значение можно изменить на <code>block</code>.</p>

<p>Попробуйте отредактировать CSS, приведенный ниже:</p>

<div id="example-two" contenteditable="true">
	<style contenteditable="">#example-two {
    margin:12px 0;
    font-family:Consolas, Monaco, monospace;
    }
#example-two style {
    display:block;
    white-space:pre;
    }
#example-two[contenteditable="true"]{
    padding:10px;
    outline:3px dashed #CCC;
    }
#example-two[contenteditable="true"]:hover{
    background:#E4F3F9;
    outline:3px dashed #2B8BAD;
    }</style>
</div>
<p class="note">Редактирование таблицы стилей</p>

<h2>Поддержка браузерами</h2>

<p>Поддержка атрибута <code>contenteditable</code> браузерами на удивление хороша:</p>

<table>
<tr>
	<th>Браузер</th>
	<th>Версия</th>
</tr>
<tr>
	<td>Chrome</td>
	<td>4.0+</td>
</tr>
<tr>
	<td>Safari</td>
	<td>3.1+</td>
</tr>
<tr>
	<td>Mobile Safari</td>
	<td>5.0+</td>
</tr>
<tr>
	<td>Firefox</td>
	<td>3.5+</td>
</tr>
<tr>
	<td>Opera</td>
	<td>9.0+</td>
</tr>
<tr>
	<td>Opera Mini/Mobile</td>
	<td>Нет</td>
</tr>
<tr>
	<td>Internet Explorer</td>
	<td>5.5+</td>
</tr>
<tr>
	<td>Android</td>
	<td>3.0+</td>
</tr>
</table>
<p class="note">Поддержка браузерами свойства <code>contenteditable</code></p>

<p>Должен отметить, что появлением и отличной поддержкой атрибута мы обязаны IE 5.5, хотя на самом деле ранний вариант <code>contenteditable</code> был <a href="http://msdn.microsoft.com/en-us/library/ms537837(VS.85).aspx">разработан и внедрен Microsoft в июле 2000 года</a>.</p>

<p>Более подробную таблицу совместимости можно увидеть тут: <a href="http://caniuse.com/contenteditable">When Can I Use</a>.</p>

<h2>Сохранение изменений</h2>

<p>Для написания этого раздела я обратился за помощью к доктору Реми, так как он гораздо более сведущ во всём, что касается хранения <del>данных</del> всего на свете.</p>

<blockquote>
<p>В зависимости от сложности блока ваш код может отлавливать нажатие <kbd>Enter</kbd> (код 13) для сохранения изменения и <kbd>Esc</kbd> (код 27) для их отмены.</p>
<p>Когда пользователь нажимает <kbd>Enter</kbd> (предполагаем, что редактируем однострочные данные), получаем <code>innerHTML</code> редактируемого блока и посылаем AJAX-запрос с изменениями на сервер.</p>
<p>Простой пример можно увидеть тут: <a href="http://jsbin.com/owavu3">Сохранение данных из элемента с <code>сontenteditable</code> при помощи AJAX</a>.</p>
<p>— <a href="http://remysharp.com/">Реми Шарп</a></p>
</blockquote>

<h2>Заключение</h2>

<p>В своих статьях я неоднократно упоминал этот подход: спецификация наконец-то сделала официальным то, что внедрено в браузерах много лет назад.</p>

<p>Атрибут <code>contenteditable</code> — один из самых малоизвестных, но могу поспорить, что вы будете использовать его чаще, чем думаете.</p>

<p>Представьте себе возможность редактирования блока текста после простого клика на него: делать быстрые правки в статьях, редактировать комментарии или даже создавать не завязанные на серверную часть таблицы в веб-приложениях.</p>

<p>Если у вас есть идеи, как использовать этот атрибут — расскажите нам об этом в комментариях.</p>

<h2>Читать дальше</h2>

<ul>
	<li><a href="http://blog.whatwg.org/the-road-to-html-5-contenteditable#what">Что такое contenteditable?</a></li>
	<li><a href="http://css-tricks.com/expanding-images-html5/">Разворачиваем изображения с помощью HTML5 contenteditable</a></li>
</ul>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/the-contenteditable-attribute/">The contenteditable attribute</a>» <a href="http://jackosborne.co.uk/">Джека Осборна</a> (Jack Osborne), опубликованной на сайте «<a href="http://html5doctor.com/">HTML5 Doctor</a>».</p>
<p class="note">Перевод выполнил <a href="http://twitter.com/silentimp">Антон Немцев</a> (SilentImp).</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/contenteditable/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Как работает nth-child</title>
		<link>http://web-standards.ru/articles/nth-child/</link>
		<comments>http://web-standards.ru/articles/nth-child/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 12:55:20 +0000</pubDate>
		<dc:creator>Крис Койер</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[вёрстка]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/nth-child/</guid>
		<description><![CDATA[<p>Существует такой селектор, точнее псевдокласс, называемый <code>:nth-child</code>. Вот пример его использования:</p>

<pre>
	<code>UL LI:nth-child(3n+3) {</code>
	<code>    color:#CCC;</code>
	<code>    }</code>
</pre>

<p>Что делает CSS-код, приведенный выше? Он выбирает каждый третий элемент внутри маркированного списка: это 3-й, 6-й, 9-й, 12-й и т.д. Давайте посмотрим, как именно работает это выражение и что еще можно сделать с помощью <code>:nth-child</code>.</p>

<p>Всё зависит от того, что находится между скобками. Селектор <code>:nth-child</code> принимает два ключевых слова: <code>even</code> и <code>odd</code>. Тут всё просто: <code>even</code> выбирает чётные элементы, такие как 2-ой, 4-ый, 6-ой и т.д., а <code>odd</code> выбирает нечётные элементы, такие как 1-й, 3-й, 5-й и т.д.</p>

<p>Как видно из первого примера, <code>:nth-child</code> также принимает в качестве параметра выражения. В том числе и простейшие уравнения, иначе говоря, просто числа. Если поставить их в скобки, будет выбран только один элемент с соответствующим номером. Например, вот как выбрать только пятый элемент:</p>

<pre>
	<code>UL LI:nth-child(5) {</code>
	<code>    color:#CCC;</code>
	<code>    }</code>
</pre>

<p>Однако давайте вернемся к <code>3n+3</code> из первого примера. Как он работает и почему выбирается каждый третий элемент? Весь фокус в понимании переменной <code>n</code> и приведенного алгебраического уравнения. Подумайте об <code>n</code>, как о начинающемся с нуля множестве целых чисел. Потом дополните уравнение. Так <code>3n</code> это <code>3×n</code>, а все уравнение вместе это <code>(3×n)+3</code>. Теперь, подставляя вместо <code>n</code> числа больше или равные нулю, мы получим:</p>

<ul>
	<li>(3 × 0) + 3 = 3 = 3-й элемент</li>
	<li>(3 × 1) + 3 = 6 = 6-й элемент</li>
	<li>(3 × 2) + 3 = 9 = 9-й элемент и т.д.</li>
</ul>

<p>А как насчёт <code>:nth-child(2n+1)</code>?</p>

<ul>
	<li>(2 × 0) + 1 = 1 = 1-й элемент</li>
	<li>(2 × 1) + 1 = 3 = 3-й элемент</li>
	<li>(2 × 2) + 1 = 5 = 5-й элемент и т.д.</li>
</ul>

<p>Так, стоп! Это ведь то же самое, что и <code>odd</code>. Тогда, возможно, не стоит использовать это выражение? Но разве в этом случае мы не подвергаем наш первый пример излишнему усложнению? Что, если вместо <code>3n+3</code> мы запишем <code>3n+0</code> или ещё проще <code>3n</code>?</p>

<ul>
	<li>(3 × 0) = 0 = ничего нет</li>
	<li>(3 × 1) = 3 = 3-й элемент</li>
	<li>(3 × 2) = 6 = 6-й элемент</li>
	<li>(3 × 3) = 9 = 9-й элемент и т.д.</li>
</ul>

<p>Итак, как вы можете видеть, результат получится такой же, а значит, нет необходимости в <code>+3</code>. Мы можем использовать и отрицательные значения <code>n</code>, с таким же успехом, как и вычитание в уравнениях. Например, <code>4n-1</code>:</p>

<ul>
	<li>(4 × 0) – 1 = –1 = ничего нет</li>
	<li>(4 × 1) – 1 = 3 = 3-й элемент</li>
	<li>(4 × 2) – 1 = 7 = 7-й элемент и т.д.</li>
</ul>

<p>Использование <code>-n</code> может показаться странным — ведь если конечный результат отрицательный, то никакие элементы в выборку не попадут. Но если дополнить уравнение и снова сделать результат положительным, то выборка окажется довольно интересной: при помощи неё можно будет получить первые <code>n</code> элементов, например так: <code>-n+3</code>:</p>

<ul>
	<li>–0 + 3 = 3 = 3-й элемент</li>
	<li>–1 + 3 = 2 = 2-й элемент</li>
	<li>–2 + 3 = 1 = 1-й элемент</li>
	<li>–3 + 3 = 0 = ничего нет и т.д.</li>
</ul>

<p>На SitePoint есть хороший справочник <a href="http://reference.sitepoint.com/css/understandingnthchildexpressions">с милой табличкой</a>, которую я бесстыдно опубликую здесь:</p>

<table>
<tr>
	<th>n</th>
	<th>2n+1</th>
	<th>4n+1</th>
	<th>4n+4</th>
	<th>4n</th>
	<th>5n-2</th>
	<th>-n+3</th>
</tr>
<tr>
	<td>0</td>
	<td>1</td>
	<td>1</td>
	<td>4</td>
	<td>–</td>
	<td>–</td>
	<td>3</td>
</tr>
<tr>
	<td>1</td>
	<td>3</td>
	<td>5</td>
	<td>8</td>
	<td>4</td>
	<td>3</td>
	<td>2</td>
</tr>
<tr>
	<td>2</td>
	<td>5</td>
	<td>9</td>
	<td>12</td>
	<td>8</td>
	<td>8</td>
	<td>1</td>
</tr>
<tr>
	<td>3</td>
	<td>7</td>
	<td>13</td>
	<td>16</td>
	<td>12</td>
	<td>13</td>
	<td>–</td>
</tr>
<tr>
	<td>4</td>
	<td>9</td>
	<td>17</td>
	<td>20</td>
	<td>16</td>
	<td>18</td>
	<td>–</td>
</tr>
<tr>
	<td>5</td>
	<td>11</td>
	<td>21</td>
	<td>24</td>
	<td>20</td>
	<td>23</td>
	<td>–</td>
</tr>
</table>

<h2>Поддержка браузерами</h2>

<p>Селектор <code>:nth-child</code> — один из немногих CSS-селекторов, который почти полностью поддерживается в современных браузерах и абсолютно не поддерживается в IE, даже в IE8. Поэтому когда дело доходит до его использования, и конечный результат сделан по технологии прогрессивного улучшения — вы можете смело использовать его для некоторых оформительских элементов, вроде расцветки строк таблицы. Однако не стоит применять его в более серьезных случаях. Например, полагаться на него в раскладке сайта или удалять правое поле из каждого третьего блока в сетке три на три, чтобы они вошли в ряд.</p>

<p>Спасением здесь может послужить библиотека <a href="http://jquery.com/">jQuery</a>, которая реализует поддержку всех CSS-селекторов, включая <code>:nth-child</code>, даже в Internet Explorer.</p>

<h2>Всё равно неясно?</h2>

<p>Я не большой поклонник фразы <q>я лучше воспринимаю визуальную информацию</q>. И вы, конечно, тоже. Но примеры являются чрезвычайно полезными именно в таких ситуациях. Чтобы облегчить понимание, я сделал <a href="http://css-tricks.com/examples/nth-child-tester/">небольшую тестовую страничку</a>. На ней вы сможете написать свои уравнения и ниже увидеть то, что попадет в выборку.</p>

<p>Также загляните на страничку <a href="http://css-tricks.com/9657-useful-nth-child-recipies/">полезных рецептов <code>:nth-child</code></a>, там вы сможете найти код для наиболее распространенных случаев.</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://css-tricks.com/5452-how-nth-child-works/">How nth-child Works</a>» <a href="http://snook.ca/about/">Криса Койера</a> (Chris Coyier), опубликованной на сайте «<a href="http://css-tricks.com/">CSS-Tricks</a>».</p>]]></description>
			<content:encoded><![CDATA[<p>Существует такой селектор, точнее псевдокласс, называемый <code>:nth-child</code>. Вот пример его использования:</p>

<pre>
	<code>UL LI:nth-child(3n+3) {</code>
	<code>    color:#CCC;</code>
	<code>    }</code>
</pre>

<p>Что делает CSS-код, приведенный выше? Он выбирает каждый третий элемент внутри маркированного списка: это 3-й, 6-й, 9-й, 12-й и т.д. Давайте посмотрим, как именно работает это выражение и что еще можно сделать с помощью <code>:nth-child</code>.</p>

<p>Всё зависит от того, что находится между скобками. Селектор <code>:nth-child</code> принимает два ключевых слова: <code>even</code> и <code>odd</code>. Тут всё просто: <code>even</code> выбирает чётные элементы, такие как 2-ой, 4-ый, 6-ой и т.д., а <code>odd</code> выбирает нечётные элементы, такие как 1-й, 3-й, 5-й и т.д.</p>

<p>Как видно из первого примера, <code>:nth-child</code> также принимает в качестве параметра выражения. В том числе и простейшие уравнения, иначе говоря, просто числа. Если поставить их в скобки, будет выбран только один элемент с соответствующим номером. Например, вот как выбрать только пятый элемент:</p>

<pre>
	<code>UL LI:nth-child(5) {</code>
	<code>    color:#CCC;</code>
	<code>    }</code>
</pre>

<p>Однако давайте вернемся к <code>3n+3</code> из первого примера. Как он работает и почему выбирается каждый третий элемент? Весь фокус в понимании переменной <code>n</code> и приведенного алгебраического уравнения. Подумайте об <code>n</code>, как о начинающемся с нуля множестве целых чисел. Потом дополните уравнение. Так <code>3n</code> это <code>3×n</code>, а все уравнение вместе это <code>(3×n)+3</code>. Теперь, подставляя вместо <code>n</code> числа больше или равные нулю, мы получим:</p>

<ul>
	<li>(3 × 0) + 3 = 3 = 3-й элемент</li>
	<li>(3 × 1) + 3 = 6 = 6-й элемент</li>
	<li>(3 × 2) + 3 = 9 = 9-й элемент и т.д.</li>
</ul>

<p>А как насчёт <code>:nth-child(2n+1)</code>?</p>

<ul>
	<li>(2 × 0) + 1 = 1 = 1-й элемент</li>
	<li>(2 × 1) + 1 = 3 = 3-й элемент</li>
	<li>(2 × 2) + 1 = 5 = 5-й элемент и т.д.</li>
</ul>

<p>Так, стоп! Это ведь то же самое, что и <code>odd</code>. Тогда, возможно, не стоит использовать это выражение? Но разве в этом случае мы не подвергаем наш первый пример излишнему усложнению? Что, если вместо <code>3n+3</code> мы запишем <code>3n+0</code> или ещё проще <code>3n</code>?</p>

<ul>
	<li>(3 × 0) = 0 = ничего нет</li>
	<li>(3 × 1) = 3 = 3-й элемент</li>
	<li>(3 × 2) = 6 = 6-й элемент</li>
	<li>(3 × 3) = 9 = 9-й элемент и т.д.</li>
</ul>

<p>Итак, как вы можете видеть, результат получится такой же, а значит, нет необходимости в <code>+3</code>. Мы можем использовать и отрицательные значения <code>n</code>, с таким же успехом, как и вычитание в уравнениях. Например, <code>4n-1</code>:</p>

<ul>
	<li>(4 × 0) – 1 = –1 = ничего нет</li>
	<li>(4 × 1) – 1 = 3 = 3-й элемент</li>
	<li>(4 × 2) – 1 = 7 = 7-й элемент и т.д.</li>
</ul>

<p>Использование <code>-n</code> может показаться странным — ведь если конечный результат отрицательный, то никакие элементы в выборку не попадут. Но если дополнить уравнение и снова сделать результат положительным, то выборка окажется довольно интересной: при помощи неё можно будет получить первые <code>n</code> элементов, например так: <code>-n+3</code>:</p>

<ul>
	<li>–0 + 3 = 3 = 3-й элемент</li>
	<li>–1 + 3 = 2 = 2-й элемент</li>
	<li>–2 + 3 = 1 = 1-й элемент</li>
	<li>–3 + 3 = 0 = ничего нет и т.д.</li>
</ul>

<p>На SitePoint есть хороший справочник <a href="http://reference.sitepoint.com/css/understandingnthchildexpressions">с милой табличкой</a>, которую я бесстыдно опубликую здесь:</p>

<table>
<tr>
	<th>n</th>
	<th>2n+1</th>
	<th>4n+1</th>
	<th>4n+4</th>
	<th>4n</th>
	<th>5n-2</th>
	<th>-n+3</th>
</tr>
<tr>
	<td>0</td>
	<td>1</td>
	<td>1</td>
	<td>4</td>
	<td>–</td>
	<td>–</td>
	<td>3</td>
</tr>
<tr>
	<td>1</td>
	<td>3</td>
	<td>5</td>
	<td>8</td>
	<td>4</td>
	<td>3</td>
	<td>2</td>
</tr>
<tr>
	<td>2</td>
	<td>5</td>
	<td>9</td>
	<td>12</td>
	<td>8</td>
	<td>8</td>
	<td>1</td>
</tr>
<tr>
	<td>3</td>
	<td>7</td>
	<td>13</td>
	<td>16</td>
	<td>12</td>
	<td>13</td>
	<td>–</td>
</tr>
<tr>
	<td>4</td>
	<td>9</td>
	<td>17</td>
	<td>20</td>
	<td>16</td>
	<td>18</td>
	<td>–</td>
</tr>
<tr>
	<td>5</td>
	<td>11</td>
	<td>21</td>
	<td>24</td>
	<td>20</td>
	<td>23</td>
	<td>–</td>
</tr>
</table>

<h2>Поддержка браузерами</h2>

<p>Селектор <code>:nth-child</code> — один из немногих CSS-селекторов, который почти полностью поддерживается в современных браузерах и абсолютно не поддерживается в IE, даже в IE8. Поэтому когда дело доходит до его использования, и конечный результат сделан по технологии прогрессивного улучшения — вы можете смело использовать его для некоторых оформительских элементов, вроде расцветки строк таблицы. Однако не стоит применять его в более серьезных случаях. Например, полагаться на него в раскладке сайта или удалять правое поле из каждого третьего блока в сетке три на три, чтобы они вошли в ряд.</p>

<p>Спасением здесь может послужить библиотека <a href="http://jquery.com/">jQuery</a>, которая реализует поддержку всех CSS-селекторов, включая <code>:nth-child</code>, даже в Internet Explorer.</p>

<h2>Всё равно неясно?</h2>

<p>Я не большой поклонник фразы <q>я лучше воспринимаю визуальную информацию</q>. И вы, конечно, тоже. Но примеры являются чрезвычайно полезными именно в таких ситуациях. Чтобы облегчить понимание, я сделал <a href="http://css-tricks.com/examples/nth-child-tester/">небольшую тестовую страничку</a>. На ней вы сможете написать свои уравнения и ниже увидеть то, что попадет в выборку.</p>

<p>Также загляните на страничку <a href="http://css-tricks.com/9657-useful-nth-child-recipies/">полезных рецептов <code>:nth-child</code></a>, там вы сможете найти код для наиболее распространенных случаев.</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://css-tricks.com/5452-how-nth-child-works/">How nth-child Works</a>» <a href="http://snook.ca/about/">Криса Койера</a> (Chris Coyier), опубликованной на сайте «<a href="http://css-tricks.com/">CSS-Tricks</a>».</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/nth-child/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Почему у нас нет селектора по родителю</title>
		<link>http://web-standards.ru/articles/parent-selector/</link>
		<comments>http://web-standards.ru/articles/parent-selector/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 11:23:05 +0000</pubDate>
		<dc:creator>Джонатан Снук </dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[методика]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/parent-selector/</guid>
		<description><![CDATA[<p>Относительно регулярно я вижу дискуссии о том, должен ли CSS включать селектор по родителю и, пока я не выяснил, как работает движок браузера, сам строил предположения по этому поводу.</p>

<p>Вкратце: <em>производительность</em>.</p>

<h2>Как работает CSS</h2>

<p>В связи с моей работой я делаю много тестов производительности. Для определения «узких мест» мы используем массу приложений. Например, Google Page Speed, который дает рекомендации по улучшению производительности JavaScript и рендеринга. Прежде чем я перейду к рассмотрению этих рекомендаций, нам нужно разобраться как браузеры работают с CSS</p>

<h2>Стиль элемента применяется в момент его создания</h2>

<p>Мы часто рассматриваем веб-страницы как полноценные документы, наполненные элементами и содержимым. Между тем, браузеры разработаны так, чтобы обрабатывать документ потоково. Они начинают получать документ с сервера и могут начать его отображать до момента полной загрузки. Каждый узел анализируется и отображается в окне по мере получения.</p>

<p>Взгляните на этот документ:</p>

<pre>
	<code>&lt;body&gt;</code>
	<code>    &lt;div id="content"&gt;</code>
	<code>        &lt;div class="module intro"&gt;</code>
	<code>            &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>        &lt;/div&gt;</code>
	<code>        &lt;div class="module"&gt;</code>
	<code>            &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>            &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>            &lt;p&gt;Lorem Ipsum &lt;span&gt;Test&lt;/span&gt;&lt;/p&gt;</code>
	<code>        &lt;/div&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>&lt;/body&gt;</code>
</pre>

<p>Браузер начинает сначала и видит элемент <code>&lt;body&gt;</code>. В этот момент времени считается, что этот узел не имеет дочерних узлов. Ничего более не рассматривается. Браузер определяет соответствующий ему обобщенный набор стилей и применяет его к элементу. Какой шрифт, цвет, интерлиньяж? После того, как это все будет выяснено, элемент отображается на экране.</p>

<p>Далее браузер видит элемент <code>&lt;div&gt;</code> со значением атрибута ID <code>content</code>. И снова в этот момент времени браузер считает его пустым. Он не рассматривает другие элементы. Как только браузер рассчитает стиль, элемент отображается на экране. Затем браузер определяет нужно ли перерисовать <code>&lt;body&gt;</code> — стал ли элемент шире или выше? Я подозреваю, что там есть масса других проверок, но изменение ширины и высоты — самый распространенный способ повлиять на отображение родительского узла.</p>

<p>Процесс продолжается, пока браузер не достигнет корневого узла документа.</p>

<p>Вот как выглядит визуализация процессов перерисовки в Firefox:</p>

<iframe width="510" height="382" src="http://www.youtube.com/embed/ZTnIxIA5KGw" frameborder="0" class="video-player"></iframe>

<h2>CSS селекторы анализируется справа налево</h2>

<p>Чтобы определить, применяется ли CSS-правило к определенному элементу, браузер рассматривает селектор справа налево.</p>

<p>Если у вас есть селектор <code>body div#content p { color: #003366; }</code>, то, когда каждый элемент появляется на странице, браузер проверяет, является ли он параграфом. Если да, он начинает подниматься вверх по DOM и ищет <code>&lt;div&gt;</code> со значением атрибута ID равным <code>content</code>. Если он его находит, то продолжает подниматься по DOM пока не найдет <code>&lt;body&gt;</code>.</p>

<p>Таким образом, читая селектор справа налево, браузер значительно быстрее может определить применяется ли правило к элементу. Чтобы определить, какой из селекторов обладает большей производительностью, нужно выяснить, как много узлов придется рассмотреть, чтобы определить, можно ли применить правило к элементу.</p>

<h2>Правила</h2>

<p>Возвращаясь к Page Speed, давайте рассмотрим <a href="http://code.google.com/speed/page-speed/docs/rendering.html#UseEfficientCSSSelectors">несколько его рекомендаций</a>:</p>

<ul>
	<li>Избегайте селектора по потомку: <code>.content .sidebar</code>;</li>
	<li>Избегайте селектора по дочернему элементу: <code>.content &gt; .sidebar</code> и селектора по следующему элементу: <code>.content + .sidebar</code>.</li>
</ul>

<p>Конечно, селекторы по ID — самые быстрые. Проверить применимость селектора <code>#content</code> к рассматриваемому элементу можно очень быстро. Есть у него этот ID или нет? Селекторы по классу практически такие же быстрые, так как нет никаких связанных элементов, которые надо проверять.</p>

<p>Селекторы по потомкам, такие как <code>.content .sidebar</code> — более ресурсоемкие, так как, чтобы определить надо ли применять правило к <code>.sidebar</code>, браузер должен найти <code>.content</code>. Cелектор по дочернему элементу, например, <code>.content &gt; .sidebar</code>, лучше селектора по потомку, так как браузер должен проверить только один элемент вместо множества.</p>

<p class="note">К сожалению, селекторы <code>+</code> и <code>&gt;</code> не поддерживаются IE6. Так что если его поддержка актуальна для вас, то про них придется забыть. Примечание переводчика.</p>

<h2>Селектор по тегу и универсальный селектор</h2>

<p>В рамках рекомендации избегать селекторов по потомку, дочернему или следующему элементам, рекомендуется избегать универсального селектора и селектора по тегу.</p>

<p>Рассмотрим следующий пример:</p>

<pre><code>#content * { color: #039; }</code></pre>

<p>Так как в селекторе присутствует ID, то можно подумать, что этот селектор обрабатывается очень быстро. Проблема в том, что браузер обрабатывает селектор справа налево и сперва проверяется универсальный селектор. Для того чтобы браузер мог определить, должен ли цвет текста элемента быть тёмно-синим, надо проверить каждый предок элемента, пока не будет найден предок с атрибутом ID равным <code>content</code> или не будет достигнут корень документа.</p>

<p>И это должно быть сделано для каждого элемента на странице.</p>

<p>Теперь, когда мы понимаем, как элемент обрабатывается, как определяется применимость правил к элементу, давайте рассмотрим пример.</p>

<h2>Почему IE долго не поддерживал <code>:last-child</code></h2>

<p>Все жаловались: у всех браузеров, кроме IE, есть поддержка <code>:last-child</code> (она появилась только в IE9!) Некоторые могли подумать <q>насколько же сложнее сделать :last-child, если уже реализован :first-child?</q></p>

<p>Давайте представим, что мы — браузер и мы парсим документ-пример, который я приводил ранее.</p>

<pre>
	<code>.module &gt; p:first-child { color: red; } /* Первое правило */</code>
	<code>.module &gt; p:last-child { color: blue; } /* Второе правило */</code>
</pre>

<p>Когда мы рассматриваем внутренности первого <code>&lt;div&gt;</code>, мы видим, что там есть параграф. Браузер видит что-то вроде этого:</p>

<pre>
	<code>&lt;div class="module"&gt;</code>
	<code>    &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
</pre>

<p>Нужно ли применить первое правило к параграфу? Да, это параграф; да, это первый дочерний узел; и, да, это непосредственный потомок элемента с классом <code>module</code>.</p>

<p>Нужно ли применить к этому параграфу второе правило? На данный момент это последний элемент. Но мы могли ещё не загрузить все элементы и не можем быть уверены, что он останется последним.</p>

<p>Вне зависимости от того, как решать эту дилемму, у нас возникает необходимость повторного анализа стилей двух узлов для каждого нового узла, который мы добавляем в DOM. Если я добавлю ещё один параграф следом за первым, мы должны так же повторно перерассчитать стили, которые применяются к предыдущему параграфу.</p>

<h2>Как на самом деле это делает браузер?</h2>

<p>Я не мог сказать с абсолютной уверенностью, как браузеры парсят <code>:last-child</code>, так что я создал несколько тестов:</p>

<ul>
	<li><a href="http://testing.snook.ca/css-1.html">Статическая HTML-страница</a>;</li>
	<li><a href="http://testing.snook.ca/css-1.php">Рендеринг с паузами в одну секунду</a>.</li>
</ul>

<p>Первый пример весьма скучен. В любом браузере, включая IE9, всё отображается корректно. Внутри <code>&lt;div&gt;</code> первый элемент красный, а последний синий. Но посмотрите на второй пример, и вы увидите интересные отличия в поведении браузеров.</p>

<p>Второй пример приостанавливается перед добавлением каждого параграфа в <code>&lt;div&gt;</code>.</p>

<p>В Firefox первый параграф изначально отображается синим. Когда загружается второй параграф, первый становится красным и второй — синим. Когда загружается третий параграф, второй отображается цветом по умолчанию и третий отображается синим. Firefox рассматривает каждый элемент, который был загружен в качестве последнего элемента, пока не будет загружен ещё один.</p>

<p>В Safari, Chrome и Opera мы увидим другой подход. Первый параграф красный. Второй отображается чёрным. Последний параграф отображается чёрным, пока браузер не получит закрывающий тег <code>&lt;/div&gt;</code>. В этот момент последний параграф становится синим. Эти браузеры не рассматривают элемент как последний, пока не будет закрыт родительский.</p>

<p>В Internet Explorer 9 Beta я нашел интересный баг. В то время, как статическая страница отображается корректно, версия с паузами отрабатывает с любопытным побочным эффектом. Первый параграф синий, второй параграф синий и затем — третий. Когда закрывающий тег <code>&lt;/div&gt;</code> загружен, предпоследний параграф меняет цвет на чёрный. IE9 пытается обрабатывать селектор как Webkit и Opera, но… м-м… не выходит. Надо бы отправить багрепорт в Microsoft.</p>

<h2>Почему у нас нет селектора по родителю?</h2>

<p>Уже дано достаточно пояснений, чтобы можно было вернуться к оригинальному вопросу. Проблема не в том, что у нас не может быть селектора по родителю. Проблема в том, что мы столкнемся с проблемами быстродействия, когда дело дойдет до определения того, какие CSS-правила применимы к данному элементу. Если Google Page Speed не рекомендует использование универсальных селекторов, то можно гарантировать, что селектор по родителю будет первым в списке ресурсоемких селекторов, намного опережая все проблемы с производительностью, которые могут быть вызваны использованием универсального селектора.</p>

<p>Давайте посмотрим почему. Первым делом давайте приведём пример синтаксиса для селектора по родителю.</p>

<pre><code>div.module:has(span) { color: green; }</code></pre>

<p>Проблема в том, что мы не можем определить применимость правила до тех пор, либо пока мы не найдем соответствия, либо пока все элементы, дочерние по отношению к родителю данного, не будут загружены. Ввиду этого мы должны оценивать правило и все остальные (в случае наличия специфических особенностей), применяющиеся к элементу, для каждого дочернего элемента, который мы загружаем.</p>

<p>Посмотрите на часть нашего документа:</p>

<pre>
	<code>&lt;div class="module"&gt;</code>
	<code>    &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>    &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>    &lt;p&gt;Lorem Ipsum &lt;span&gt;Test&lt;/span&gt;&lt;/p&gt;</code>
	<code>&lt;/div&gt;</code>
</pre>

<p>Исходя из того, что мы видим, <code>.module</code> будет отображён без использования правила, применяемого селектором по родителю. Когда будет загружен первый элемент <code>&lt;p&gt;</code>, нужно повторно оценить применимость селектора по родителю к <code>&lt;div&gt;</code>. Нужно сделать это снова для следующего параграфа. И снова, для следующего. Наконец, когда <code>&lt;span&gt;</code> загружен, селектор по родителю будет применен к родительскому <code>&lt;div&gt;</code>, и элемент нужно будет повторно перерисовать.</p>

<p>И что теперь? Теперь, если изменится любое наследуемое CSS-свойство, каждый потомок должен будет повторно анализироваться и перерисовываться. Ох…</p>

<h2>Почему проблему можно решить с помощью JavaScript?</h2>

<p>Это только кажется, что JavaScript решает проблему. В общем случае JavaScript-заплатки (<em>заплатки — polyfills — части кода, обеспечивающие функциональность, которую должен обеспечивать браузер. Примечание переводчика</em>). Или регрессивное усовершенствование (или как там вы, молодежь, это сейчас называете) запускаются только один раз, после полной загрузки DOM.</p>

<p>Для того чтобы действительно имитировать поведение CSS, любой скрипт, решающий эту проблему, должен запускаться после отображения каждого элемента на странице, чтобы определить, нужно ли применить нашу «заплатку». Помните CSS-expressions в Internet Explorer? Именно по этой причине они вызывали такие проблемы с производительностью.</p>

<h2>Не невозможно</h2>

<p>Появится ли когда-нибудь селектор по родителю? Возможно. То, что я опиcал, не невозможно. На самом деле — наоборот. Это значит только то, что нам придётся иметь дело с ухудшением производительности из-за использования этого селектора.</p>

<p class="note note-last">Перевод оригинальной заметки «<a href="http://snook.ca/archives/html_and_css/css-parent-selectors/">Why we don't have a parent selector</a>» <a href="http://snook.ca/about/">Джонатана Снука</a> (Jonathan Snook), опубликованной в блоге «<a href="http://snook.ca/">Snook.ca</a>».</p>]]></description>
			<content:encoded><![CDATA[<p>Относительно регулярно я вижу дискуссии о том, должен ли CSS включать селектор по родителю и, пока я не выяснил, как работает движок браузера, сам строил предположения по этому поводу.</p>

<p>Вкратце: <em>производительность</em>.</p>

<h2>Как работает CSS</h2>

<p>В связи с моей работой я делаю много тестов производительности. Для определения «узких мест» мы используем массу приложений. Например, Google Page Speed, который дает рекомендации по улучшению производительности JavaScript и рендеринга. Прежде чем я перейду к рассмотрению этих рекомендаций, нам нужно разобраться как браузеры работают с CSS</p>

<h2>Стиль элемента применяется в момент его создания</h2>

<p>Мы часто рассматриваем веб-страницы как полноценные документы, наполненные элементами и содержимым. Между тем, браузеры разработаны так, чтобы обрабатывать документ потоково. Они начинают получать документ с сервера и могут начать его отображать до момента полной загрузки. Каждый узел анализируется и отображается в окне по мере получения.</p>

<p>Взгляните на этот документ:</p>

<pre>
	<code>&lt;body&gt;</code>
	<code>    &lt;div id="content"&gt;</code>
	<code>        &lt;div class="module intro"&gt;</code>
	<code>            &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>        &lt;/div&gt;</code>
	<code>        &lt;div class="module"&gt;</code>
	<code>            &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>            &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>            &lt;p&gt;Lorem Ipsum &lt;span&gt;Test&lt;/span&gt;&lt;/p&gt;</code>
	<code>        &lt;/div&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>&lt;/body&gt;</code>
</pre>

<p>Браузер начинает сначала и видит элемент <code>&lt;body&gt;</code>. В этот момент времени считается, что этот узел не имеет дочерних узлов. Ничего более не рассматривается. Браузер определяет соответствующий ему обобщенный набор стилей и применяет его к элементу. Какой шрифт, цвет, интерлиньяж? После того, как это все будет выяснено, элемент отображается на экране.</p>

<p>Далее браузер видит элемент <code>&lt;div&gt;</code> со значением атрибута ID <code>content</code>. И снова в этот момент времени браузер считает его пустым. Он не рассматривает другие элементы. Как только браузер рассчитает стиль, элемент отображается на экране. Затем браузер определяет нужно ли перерисовать <code>&lt;body&gt;</code> — стал ли элемент шире или выше? Я подозреваю, что там есть масса других проверок, но изменение ширины и высоты — самый распространенный способ повлиять на отображение родительского узла.</p>

<p>Процесс продолжается, пока браузер не достигнет корневого узла документа.</p>

<p>Вот как выглядит визуализация процессов перерисовки в Firefox:</p>

<iframe width="510" height="382" src="http://www.youtube.com/embed/ZTnIxIA5KGw" frameborder="0" class="video-player"></iframe>

<h2>CSS селекторы анализируется справа налево</h2>

<p>Чтобы определить, применяется ли CSS-правило к определенному элементу, браузер рассматривает селектор справа налево.</p>

<p>Если у вас есть селектор <code>body div#content p { color: #003366; }</code>, то, когда каждый элемент появляется на странице, браузер проверяет, является ли он параграфом. Если да, он начинает подниматься вверх по DOM и ищет <code>&lt;div&gt;</code> со значением атрибута ID равным <code>content</code>. Если он его находит, то продолжает подниматься по DOM пока не найдет <code>&lt;body&gt;</code>.</p>

<p>Таким образом, читая селектор справа налево, браузер значительно быстрее может определить применяется ли правило к элементу. Чтобы определить, какой из селекторов обладает большей производительностью, нужно выяснить, как много узлов придется рассмотреть, чтобы определить, можно ли применить правило к элементу.</p>

<h2>Правила</h2>

<p>Возвращаясь к Page Speed, давайте рассмотрим <a href="http://code.google.com/speed/page-speed/docs/rendering.html#UseEfficientCSSSelectors">несколько его рекомендаций</a>:</p>

<ul>
	<li>Избегайте селектора по потомку: <code>.content .sidebar</code>;</li>
	<li>Избегайте селектора по дочернему элементу: <code>.content &gt; .sidebar</code> и селектора по следующему элементу: <code>.content + .sidebar</code>.</li>
</ul>

<p>Конечно, селекторы по ID — самые быстрые. Проверить применимость селектора <code>#content</code> к рассматриваемому элементу можно очень быстро. Есть у него этот ID или нет? Селекторы по классу практически такие же быстрые, так как нет никаких связанных элементов, которые надо проверять.</p>

<p>Селекторы по потомкам, такие как <code>.content .sidebar</code> — более ресурсоемкие, так как, чтобы определить надо ли применять правило к <code>.sidebar</code>, браузер должен найти <code>.content</code>. Cелектор по дочернему элементу, например, <code>.content &gt; .sidebar</code>, лучше селектора по потомку, так как браузер должен проверить только один элемент вместо множества.</p>

<p class="note">К сожалению, селекторы <code>+</code> и <code>&gt;</code> не поддерживаются IE6. Так что если его поддержка актуальна для вас, то про них придется забыть. Примечание переводчика.</p>

<h2>Селектор по тегу и универсальный селектор</h2>

<p>В рамках рекомендации избегать селекторов по потомку, дочернему или следующему элементам, рекомендуется избегать универсального селектора и селектора по тегу.</p>

<p>Рассмотрим следующий пример:</p>

<pre><code>#content * { color: #039; }</code></pre>

<p>Так как в селекторе присутствует ID, то можно подумать, что этот селектор обрабатывается очень быстро. Проблема в том, что браузер обрабатывает селектор справа налево и сперва проверяется универсальный селектор. Для того чтобы браузер мог определить, должен ли цвет текста элемента быть тёмно-синим, надо проверить каждый предок элемента, пока не будет найден предок с атрибутом ID равным <code>content</code> или не будет достигнут корень документа.</p>

<p>И это должно быть сделано для каждого элемента на странице.</p>

<p>Теперь, когда мы понимаем, как элемент обрабатывается, как определяется применимость правил к элементу, давайте рассмотрим пример.</p>

<h2>Почему IE долго не поддерживал <code>:last-child</code></h2>

<p>Все жаловались: у всех браузеров, кроме IE, есть поддержка <code>:last-child</code> (она появилась только в IE9!) Некоторые могли подумать <q>насколько же сложнее сделать :last-child, если уже реализован :first-child?</q></p>

<p>Давайте представим, что мы — браузер и мы парсим документ-пример, который я приводил ранее.</p>

<pre>
	<code>.module &gt; p:first-child { color: red; } /* Первое правило */</code>
	<code>.module &gt; p:last-child { color: blue; } /* Второе правило */</code>
</pre>

<p>Когда мы рассматриваем внутренности первого <code>&lt;div&gt;</code>, мы видим, что там есть параграф. Браузер видит что-то вроде этого:</p>

<pre>
	<code>&lt;div class="module"&gt;</code>
	<code>    &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
</pre>

<p>Нужно ли применить первое правило к параграфу? Да, это параграф; да, это первый дочерний узел; и, да, это непосредственный потомок элемента с классом <code>module</code>.</p>

<p>Нужно ли применить к этому параграфу второе правило? На данный момент это последний элемент. Но мы могли ещё не загрузить все элементы и не можем быть уверены, что он останется последним.</p>

<p>Вне зависимости от того, как решать эту дилемму, у нас возникает необходимость повторного анализа стилей двух узлов для каждого нового узла, который мы добавляем в DOM. Если я добавлю ещё один параграф следом за первым, мы должны так же повторно перерассчитать стили, которые применяются к предыдущему параграфу.</p>

<h2>Как на самом деле это делает браузер?</h2>

<p>Я не мог сказать с абсолютной уверенностью, как браузеры парсят <code>:last-child</code>, так что я создал несколько тестов:</p>

<ul>
	<li><a href="http://testing.snook.ca/css-1.html">Статическая HTML-страница</a>;</li>
	<li><a href="http://testing.snook.ca/css-1.php">Рендеринг с паузами в одну секунду</a>.</li>
</ul>

<p>Первый пример весьма скучен. В любом браузере, включая IE9, всё отображается корректно. Внутри <code>&lt;div&gt;</code> первый элемент красный, а последний синий. Но посмотрите на второй пример, и вы увидите интересные отличия в поведении браузеров.</p>

<p>Второй пример приостанавливается перед добавлением каждого параграфа в <code>&lt;div&gt;</code>.</p>

<p>В Firefox первый параграф изначально отображается синим. Когда загружается второй параграф, первый становится красным и второй — синим. Когда загружается третий параграф, второй отображается цветом по умолчанию и третий отображается синим. Firefox рассматривает каждый элемент, который был загружен в качестве последнего элемента, пока не будет загружен ещё один.</p>

<p>В Safari, Chrome и Opera мы увидим другой подход. Первый параграф красный. Второй отображается чёрным. Последний параграф отображается чёрным, пока браузер не получит закрывающий тег <code>&lt;/div&gt;</code>. В этот момент последний параграф становится синим. Эти браузеры не рассматривают элемент как последний, пока не будет закрыт родительский.</p>

<p>В Internet Explorer 9 Beta я нашел интересный баг. В то время, как статическая страница отображается корректно, версия с паузами отрабатывает с любопытным побочным эффектом. Первый параграф синий, второй параграф синий и затем — третий. Когда закрывающий тег <code>&lt;/div&gt;</code> загружен, предпоследний параграф меняет цвет на чёрный. IE9 пытается обрабатывать селектор как Webkit и Opera, но… м-м… не выходит. Надо бы отправить багрепорт в Microsoft.</p>

<h2>Почему у нас нет селектора по родителю?</h2>

<p>Уже дано достаточно пояснений, чтобы можно было вернуться к оригинальному вопросу. Проблема не в том, что у нас не может быть селектора по родителю. Проблема в том, что мы столкнемся с проблемами быстродействия, когда дело дойдет до определения того, какие CSS-правила применимы к данному элементу. Если Google Page Speed не рекомендует использование универсальных селекторов, то можно гарантировать, что селектор по родителю будет первым в списке ресурсоемких селекторов, намного опережая все проблемы с производительностью, которые могут быть вызваны использованием универсального селектора.</p>

<p>Давайте посмотрим почему. Первым делом давайте приведём пример синтаксиса для селектора по родителю.</p>

<pre><code>div.module:has(span) { color: green; }</code></pre>

<p>Проблема в том, что мы не можем определить применимость правила до тех пор, либо пока мы не найдем соответствия, либо пока все элементы, дочерние по отношению к родителю данного, не будут загружены. Ввиду этого мы должны оценивать правило и все остальные (в случае наличия специфических особенностей), применяющиеся к элементу, для каждого дочернего элемента, который мы загружаем.</p>

<p>Посмотрите на часть нашего документа:</p>

<pre>
	<code>&lt;div class="module"&gt;</code>
	<code>    &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>    &lt;p&gt;Lorem Ipsum&lt;/p&gt;</code>
	<code>    &lt;p&gt;Lorem Ipsum &lt;span&gt;Test&lt;/span&gt;&lt;/p&gt;</code>
	<code>&lt;/div&gt;</code>
</pre>

<p>Исходя из того, что мы видим, <code>.module</code> будет отображён без использования правила, применяемого селектором по родителю. Когда будет загружен первый элемент <code>&lt;p&gt;</code>, нужно повторно оценить применимость селектора по родителю к <code>&lt;div&gt;</code>. Нужно сделать это снова для следующего параграфа. И снова, для следующего. Наконец, когда <code>&lt;span&gt;</code> загружен, селектор по родителю будет применен к родительскому <code>&lt;div&gt;</code>, и элемент нужно будет повторно перерисовать.</p>

<p>И что теперь? Теперь, если изменится любое наследуемое CSS-свойство, каждый потомок должен будет повторно анализироваться и перерисовываться. Ох…</p>

<h2>Почему проблему можно решить с помощью JavaScript?</h2>

<p>Это только кажется, что JavaScript решает проблему. В общем случае JavaScript-заплатки (<em>заплатки — polyfills — части кода, обеспечивающие функциональность, которую должен обеспечивать браузер. Примечание переводчика</em>). Или регрессивное усовершенствование (или как там вы, молодежь, это сейчас называете) запускаются только один раз, после полной загрузки DOM.</p>

<p>Для того чтобы действительно имитировать поведение CSS, любой скрипт, решающий эту проблему, должен запускаться после отображения каждого элемента на странице, чтобы определить, нужно ли применить нашу «заплатку». Помните CSS-expressions в Internet Explorer? Именно по этой причине они вызывали такие проблемы с производительностью.</p>

<h2>Не невозможно</h2>

<p>Появится ли когда-нибудь селектор по родителю? Возможно. То, что я опиcал, не невозможно. На самом деле — наоборот. Это значит только то, что нам придётся иметь дело с ухудшением производительности из-за использования этого селектора.</p>

<p class="note note-last">Перевод оригинальной заметки «<a href="http://snook.ca/archives/html_and_css/css-parent-selectors/">Why we don't have a parent selector</a>» <a href="http://snook.ca/about/">Джонатана Снука</a> (Jonathan Snook), опубликованной в блоге «<a href="http://snook.ca/">Snook.ca</a>».</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/parent-selector/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Элементы details и summary</title>
		<link>http://web-standards.ru/articles/details-summary-elements/</link>
		<comments>http://web-standards.ru/articles/details-summary-elements/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 09:51:30 +0000</pubDate>
		<dc:creator>Том Лидбеттер</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[вёрстка]]></category>
		<category><![CDATA[методика]]></category>
		<category><![CDATA[семантика]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/details-summary-elements/</guid>
		<description><![CDATA[<p>Вам часто приходилось использовать JavaScript для создания виджета, показывающего и скрывающего какое-то содержимое? Возможно, для этого вы даже скачивали целую JavaScript-библиотеку? Что ж, можете радоваться: HTML5 позволяет создавать подобное всего лишь парой строчек кода, без применения JavaScript. Зависит от браузера, конечно, но мы вернёмся к этому позже. Представляем вам элемент <code>&lt;details&gt;</code>.</p>

<p>Вот что о нём написано <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#the-details-element">в спецификации</a>:</p>

<blockquote>
	<p>Элемент <code>details</code> представляет собой раскрывающийся виджет, показывающий пользователю дополнительную информацию или элементы управления.</p>
	<p><a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#the-details-element">Спецификация WHATWG HTML5</a></p>
</blockquote>

<p>Мы можем использовать <code>&lt;details&gt;</code> для создания «виджетов-аккордеонов», которые пользователь может разворачивать и сворачивать. Внутри этого элемента можно разместить любое содержимое.</p>

<h2>Поддержка браузерами</h2>

<p>Прежде чем мы продолжим, вам нужно учесть, что сейчас только Chrome поддерживает элемент <code>&lt;details&gt;</code>. <a href="http://my.opera.com/ODIN/blog/implementing-html5-details">Скоро к нему присоединится и Opera</a>, но немного костылей нам все-таки понадобится. Что ж, запускайте Chrome, и давайте смотреть.</p>

<h2>Использование <code>&lt;details&gt;</code></h2>

<p>Имеются два элемента: <code>&lt;details&gt;</code> и необязательный <code>&lt;summary&gt;</code>. Элемент <code>&lt;details&gt;</code> — это обёртка для содержимого, которое мы хотим показать и скрыть, а <code>&lt;summary&gt;</code> содержит описание и заголовок этой группы. Формально <code>&lt;summary&gt;</code> нам не нужен. В его отсутствие браузер подставит текст по умолчанию, например «details» в Chrome. Давайте взглянем на код:</p>

<pre>
	<code>&lt;details&gt;</code>
	<code>    &lt;summary&gt;Покажи-скрой меня&lt;/summary&gt;</code>
	<code>    &lt;p&gt;Бурное развитие внутреннего туризма привело Томаса Кука.&lt;/p&gt;</code>
	<code>&lt;/details&gt;</code>
</pre>

<p>Вы можете <a href="http://jsbin.com/egefop#html,live">посмотреть это в действии на jsbin</a>. Даже этот простой пример прекрасно демонстрирует эффект переключения. Без JavaScript!</p>

<h3>Атрибут <code>open</code></h3>

<p>В вышеприведенном примере содержимое скрыто при загрузке страницы. Мы можем сделать его видимым по умолчанию, добавив одиночный атрибут <code>open</code> для <code>&lt;details&gt;</code>, <a href="http://jsbin.com/egefop/2#html,live">пример на jsbin</a>:</p>

<pre>
	<code>&lt;details open&gt;</code>
	<code>    &lt;summary&gt;Покажи-скрой меня&lt;/summary&gt;</code>
	<code>    &lt;p&gt;Бурное развитие внутреннего туризма привело Томаса Кука.&lt;/p&gt;</code>
	<code>&lt;/details&gt;</code>
</pre>

<p>Атрибута <code>closed</code> не существует. Поэтому, опуская <code>open</code>, вы по умолчанию подразумеваете <code>closed</code>.</p>

<h3>Элемент <code>&lt;summary&gt;</code></h3>

<p>Мы бегло взглянули на <code>&lt;summary&gt;</code> в действии, теперь остановимся на нём подробнее. Внутри <code>&lt;summary&gt;</code> могут использоваться строчные элементы, такие как <code>&lt;span&gt;</code> или <code>&lt;strong&gt;</code>. Для чего это может быть нужно? Например, для дополнительного оформления или, как предлагает спецификация, использования <code>&lt;label&gt;</code> для элемента формы. По крайней мере, <em>было бы</em> удобно, если бы <a href="http://jsbin.com/egefop/3#html">подобная конструкция</a> работала корректно:</p>

<pre>
	<code>&lt;details&gt;</code>
	<code>    &lt;summary&gt;&lt;label for="name"&gt;Имя:&lt;/label&gt;&lt;/summary&gt;</code>
	<code>    &lt;input type="text" id="name" name="name" /&gt;</code>
	<code>&lt;/details&gt;</code>
</pre>

<p>Теоретически, нажатие на <code>&lt;summary&gt;</code> должно раскрывать содержимое элемента <code>&lt;details&gt;</code>. Но в этом примере содержимое не будет развернуто, потому что вы, фактически, взаимодействуете с <code>&lt;label&gt;</code>, который переводит фокус на соответствующий <code>&lt;input&gt;</code> — даже если он скрыт с помощью <code>&lt;details&gt;</code>.</p>

<p>Честно говоря, этот момент еще требует прояснения. А что по вашему мнению должно происходить? Возможно, у разработчиков браузеров, читающих эту статью, есть какие-то идеи? :)</p>

<h3>Вложенность <code>&lt;details&gt;</code></h3>

<p>Вы можете помещать <code>&lt;details&gt;</code> друг в друга, если хотите, как это сделано в <a href="http://jsbin.com/egefop/14#html,live">следующем, вполне валидном примере</a>:</p>

<pre>
	<code>&lt;details&gt;</code>
	<code>    &lt;summary&gt;Вопрос 1&lt;/summary&gt;</code>
	<code>    &lt;p&gt;Население превышает широкий кристаллический фундамент.&lt;/p&gt;</code>
	<code>    &lt;details&gt;</code>
	<code>        &lt;summary&gt;Приложенные документы&lt;/summary&gt;</code>
	<code>        &lt;ul&gt;</code>
	<code>            &lt;li&gt;&lt;a href="#"&gt;Болгары очень дружелюбны;&lt;/a&gt;&lt;/li&gt;</code>
	<code>            &lt;li&gt;Скумбрия неумеренно перевозит вулканизм;&lt;/li&gt;</code>
	<code>            &lt;li&gt;Дождливая погода, куда входят Пик-Дистрикт;&lt;/li&gt;</code>
	<code>            &lt;li&gt;Белый саксаул дегустирует живописный утконос;&lt;/li&gt;</code>
	<code>        &lt;/ul&gt;</code>
	<code>    &lt;/details&gt;</code>
	<code>&lt;/details&gt;</code>
</pre>

<h2>Примеры использования</h2>

<p>Так в каких же случаях вы можете использовать <code>&lt;details&gt;</code>? Первое, что приходит в голову — FAQ. Разработчики часто используют для них «аккордеоны», поэтому <code>&lt;details&gt;</code> замечательно подходит.</p>

<p>Также не забывайте о навигации по странице. Это может быть закрепленный блок, передвигающаяся одновременно с прокруткой. <a href="http://jsbin.com/egefop/8#html,live">Возможно, что-то вроде этого?</a></p>

<p>Вы можете использовать <code>&lt;details&gt;</code> для сворачивания и разворачивания блока комментариев в блоге, для профиля пользователя, для описания загружаемого файла, для сложных форм или в веб-приложениях, как показано в этом примере из спецификации:</p>

<p><img src="http://static.web-standards.ru/articles/details-summary-elements/details-w3c.png" alt="Пример использования &lt;details&gt; из спецификации" class="pic pic-middle"></p>

<p class="note">Пример использования <code>&lt;details&gt;</code> из спецификации.</p>

<p>На самом деле, даже глядя сейчас на админку WordPress, я вижу множество возможностей использования <code>&lt;details&gt;</code>. Если у вас есть ещё какие-то идеи и предложения — расскажите о них в комментариях.</p>

<h2>Оформление</h2>

<p>Как же нам оформить эту штуку? Для элемента, раскрывающего содержимое, в WebKit вы можете использовать псевдо-элемент <code>::-webkit-details-marker</code>. <a href="http://jsbin.com/egefop/9#html,live">Небольшой пример</a>:</p>

<pre>
	<code>details summary::-webkit-details-marker {</code>
	<code>    background: red;</code>
	<code>    color: #fff;</code>
	<code>    font-size: 500%;</code>
	<code>}</code>
</pre>

<p>Мы также можем позиционировать этот элемент по отношению к родителю. <a href="http://jsbin.com/egefop/17#html,live">Здесь, например, он прижат к правому краю</a>. В общем-то, и все.</p>

<p>А как же заменить раскрывающий элемент своей иконкой? Используя выборку по атрибуту, вы можете определить, когда <code>&lt;details&gt;</code> раскрыт, а когда закрыт, и применить соответствующее фоновое изображение. Мы делаем примерно то же самое в <a href="http://jsbin.com/egefop/11#html,live">этом примере</a>, за исключением того, что вместо фонового изображения мы используем псевдо-элемент <code>:after</code>:</p>

<pre>
	<code>summary::-webkit-details-marker {</code>
	<code>    display: none</code>
	<code>}</code>
	<code>summary:after {</code>
	<code>    background: red;</code>
	<code>    border-radius: 5px;</code>
	<code>    content: "+";</code>
	<code>    color: #fff;</code>
	<code>    float: left;</code>
	<code>    font-size: 1.5em;</code>
	<code>    font-weight: bold;</code>
	<code>    margin: -5px 10px 0 0;</code>
	<code>    padding: 0;</code>
	<code>    text-align: center;</code>
	<code>    width: 20px;</code>
	<code>}</code>
	<code>details[open] summary:after {</code>
	<code>    content: "-";</code>
	<code>}</code>
</pre>

<p>В этом примере символы <code>+</code> и <code>-</code> используются в качестве раскрывающей ссылки. В зависимости от дизайна вы можете использовать <code>:before</code> вместо <code>:after</code>, но, в любом случае, оба псевдо-элемента позволяют использование изображения.</p>

<p>Выборка по атрибуту <code>details[open]</code> скрывает в себе некоторые интересные возможности. Как хорошие HTML5-доктора, мы создали <a href="http://jsbin.com/egefop/15#html,live">доработанный пример</a>, показанный на этом скриншоте:</p>

<p><img src="http://static.web-standards.ru/articles/details-summary-elements/nice-details.png" alt="Элемент &lt;details&gt; в Chrome" class="pic pic-middle"></p>

<p class="note">Оформленный <code>&lt;details&gt;</code> в Chrome.</p>

<p>Было бы интересно (хотя это и не всегда уместно), если бы мы могли использовать CSS-трансформации для анимации разворачивания и сворачивания <code>&lt;details&gt;</code>, но пока это невозможно.</p>

<h2>Доступность</h2>

<p>К сожалению, на момент написания статьи отсутствует возможность управления <code>&lt;details&gt;</code> с помощью клавиатуры. <a href="http://www.paciellogroup.com/blog/2011/08/accessibility-notes-2nd-august-2011/">Стив Фолкнер пишет</a>:</p>

<blockquote>
	<p>Проблема в том, что на данный момент отсутствует поддержки клавиатуры и нет никакой инофрмации для обеспечения доступности.</p>
</blockquote>

<p>Попробуйте сами. Если вы раскроете элемент <code>&lt;details&gt;</code> с помощью мыши, тогда вы сможете использовать клавиатуру для навигации по вложенным элементам, но вы также должны иметь возможность открывать и закрывать <code>&lt;details&gt;</code> с клавиатуры. Что ж, неидеально, но я уверен, что разработчики Chrome скоро с этим разберутся. Правда, ребята?</p>

<h2>Обратная совместимость</h2>

<p>Прежде чем кто-то начнет восклицать, что это не работает в IE6, хочу сказать: мы знаем. Тем не менее, благодаря некоторым умным людям, мы можем обеспечить изящную обратную совместимость. В этой <a href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills">очень полезной коллекции всевозможных кроссбраузерных костылей</a> я нашел два решения, оба они требуют jQuery:</p>

<ul>
	<li>Обратная совместимость для <a href="http://mathiasbynens.be/notes/html5-details-jquery"><code>&lt;details&gt;</code> с помощью jQuery</a> от Матиаса Байненса;</li>
	<li><a href="https://github.com/manuelbieh/details-Polyfill">Еще одна альтернатива <code>&lt;details&gt;</code>, также основанная на jQuery</a> от Мануэля Бье.</li>
</ul>

<p>Многие из вас захотят использовать <a href="http://modernizr.com/">Modernizr</a> для определения возможностей браузера, но на данный момент в Modernizr отсутствует проверка поддержки <code>&lt;details&gt;</code>. Матиас, автор приведенного выше решения для обратной совместимости, предлагает использовать <a href="https://github.com/Modernizr/Modernizr/blob/master/feature-detects/elem-details.js">этот Modernizr-сниппет</a>.</p>

<h2>Зачем вообще это использовать?</h2>

<p>Конечно, дарёному коню в зубы не смотрят, но все-таки — почему этот виджет существует в HTML5? Что ж, как и в случае с другими возможностями HTML5, он просто делает нашу жизнь легче. Реализация таких элементов, как календарь, слайдер, прогресс-бар, а теперь ещё и «аккордеон», становится гораздо проще и не требует использования JavaScript. Кто знает, что будет следующим? Нативные табы? Было бы здорово :)</p>

<h2>В заключение</h2>

<p>В этой статье мы продемонстрировали, как использовать элементы <code>&lt;details&gt;</code> и <code>&lt;summary&gt;</code>. Элемент <code>&lt;details&gt;</code> при помощи <code>&lt;summary&gt;</code> создаёт естественный для браузера интерактивный раскрывающийся виджет.</p>

<p>На текущий момент <code>&lt;details&gt;</code> работает только в Chrome, но, надеюсь, эта ситуация в скором времени изменится. Пока что мы можем использовать в CSS только <code>::-webkit-details-marker</code>, но есть и множество других CSS-техник. Если у вас есть какой-либо опыт или идеи для использования элемента <code>&lt;details&gt;</code>, расскажите об этом в комментариях.</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/the-details-and-summary-elements/">The details and summary elements</a>» <a href="http://html5doctor.com/author/toml/">Тома Лидбеттера</a> (Tom Leadbetter), опубликованной на сайте <a href="http://html5doctor.com/">HTML5Doctor.com</a>.</p>]]></description>
			<content:encoded><![CDATA[<p>Вам часто приходилось использовать JavaScript для создания виджета, показывающего и скрывающего какое-то содержимое? Возможно, для этого вы даже скачивали целую JavaScript-библиотеку? Что ж, можете радоваться: HTML5 позволяет создавать подобное всего лишь парой строчек кода, без применения JavaScript. Зависит от браузера, конечно, но мы вернёмся к этому позже. Представляем вам элемент <code>&lt;details&gt;</code>.</p>

<p>Вот что о нём написано <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#the-details-element">в спецификации</a>:</p>

<blockquote>
	<p>Элемент <code>details</code> представляет собой раскрывающийся виджет, показывающий пользователю дополнительную информацию или элементы управления.</p>
	<p><a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/interactive-elements.html#the-details-element">Спецификация WHATWG HTML5</a></p>
</blockquote>

<p>Мы можем использовать <code>&lt;details&gt;</code> для создания «виджетов-аккордеонов», которые пользователь может разворачивать и сворачивать. Внутри этого элемента можно разместить любое содержимое.</p>

<h2>Поддержка браузерами</h2>

<p>Прежде чем мы продолжим, вам нужно учесть, что сейчас только Chrome поддерживает элемент <code>&lt;details&gt;</code>. <a href="http://my.opera.com/ODIN/blog/implementing-html5-details">Скоро к нему присоединится и Opera</a>, но немного костылей нам все-таки понадобится. Что ж, запускайте Chrome, и давайте смотреть.</p>

<h2>Использование <code>&lt;details&gt;</code></h2>

<p>Имеются два элемента: <code>&lt;details&gt;</code> и необязательный <code>&lt;summary&gt;</code>. Элемент <code>&lt;details&gt;</code> — это обёртка для содержимого, которое мы хотим показать и скрыть, а <code>&lt;summary&gt;</code> содержит описание и заголовок этой группы. Формально <code>&lt;summary&gt;</code> нам не нужен. В его отсутствие браузер подставит текст по умолчанию, например «details» в Chrome. Давайте взглянем на код:</p>

<pre>
	<code>&lt;details&gt;</code>
	<code>    &lt;summary&gt;Покажи-скрой меня&lt;/summary&gt;</code>
	<code>    &lt;p&gt;Бурное развитие внутреннего туризма привело Томаса Кука.&lt;/p&gt;</code>
	<code>&lt;/details&gt;</code>
</pre>

<p>Вы можете <a href="http://jsbin.com/egefop#html,live">посмотреть это в действии на jsbin</a>. Даже этот простой пример прекрасно демонстрирует эффект переключения. Без JavaScript!</p>

<h3>Атрибут <code>open</code></h3>

<p>В вышеприведенном примере содержимое скрыто при загрузке страницы. Мы можем сделать его видимым по умолчанию, добавив одиночный атрибут <code>open</code> для <code>&lt;details&gt;</code>, <a href="http://jsbin.com/egefop/2#html,live">пример на jsbin</a>:</p>

<pre>
	<code>&lt;details open&gt;</code>
	<code>    &lt;summary&gt;Покажи-скрой меня&lt;/summary&gt;</code>
	<code>    &lt;p&gt;Бурное развитие внутреннего туризма привело Томаса Кука.&lt;/p&gt;</code>
	<code>&lt;/details&gt;</code>
</pre>

<p>Атрибута <code>closed</code> не существует. Поэтому, опуская <code>open</code>, вы по умолчанию подразумеваете <code>closed</code>.</p>

<h3>Элемент <code>&lt;summary&gt;</code></h3>

<p>Мы бегло взглянули на <code>&lt;summary&gt;</code> в действии, теперь остановимся на нём подробнее. Внутри <code>&lt;summary&gt;</code> могут использоваться строчные элементы, такие как <code>&lt;span&gt;</code> или <code>&lt;strong&gt;</code>. Для чего это может быть нужно? Например, для дополнительного оформления или, как предлагает спецификация, использования <code>&lt;label&gt;</code> для элемента формы. По крайней мере, <em>было бы</em> удобно, если бы <a href="http://jsbin.com/egefop/3#html">подобная конструкция</a> работала корректно:</p>

<pre>
	<code>&lt;details&gt;</code>
	<code>    &lt;summary&gt;&lt;label for="name"&gt;Имя:&lt;/label&gt;&lt;/summary&gt;</code>
	<code>    &lt;input type="text" id="name" name="name" /&gt;</code>
	<code>&lt;/details&gt;</code>
</pre>

<p>Теоретически, нажатие на <code>&lt;summary&gt;</code> должно раскрывать содержимое элемента <code>&lt;details&gt;</code>. Но в этом примере содержимое не будет развернуто, потому что вы, фактически, взаимодействуете с <code>&lt;label&gt;</code>, который переводит фокус на соответствующий <code>&lt;input&gt;</code> — даже если он скрыт с помощью <code>&lt;details&gt;</code>.</p>

<p>Честно говоря, этот момент еще требует прояснения. А что по вашему мнению должно происходить? Возможно, у разработчиков браузеров, читающих эту статью, есть какие-то идеи? :)</p>

<h3>Вложенность <code>&lt;details&gt;</code></h3>

<p>Вы можете помещать <code>&lt;details&gt;</code> друг в друга, если хотите, как это сделано в <a href="http://jsbin.com/egefop/14#html,live">следующем, вполне валидном примере</a>:</p>

<pre>
	<code>&lt;details&gt;</code>
	<code>    &lt;summary&gt;Вопрос 1&lt;/summary&gt;</code>
	<code>    &lt;p&gt;Население превышает широкий кристаллический фундамент.&lt;/p&gt;</code>
	<code>    &lt;details&gt;</code>
	<code>        &lt;summary&gt;Приложенные документы&lt;/summary&gt;</code>
	<code>        &lt;ul&gt;</code>
	<code>            &lt;li&gt;&lt;a href="#"&gt;Болгары очень дружелюбны;&lt;/a&gt;&lt;/li&gt;</code>
	<code>            &lt;li&gt;Скумбрия неумеренно перевозит вулканизм;&lt;/li&gt;</code>
	<code>            &lt;li&gt;Дождливая погода, куда входят Пик-Дистрикт;&lt;/li&gt;</code>
	<code>            &lt;li&gt;Белый саксаул дегустирует живописный утконос;&lt;/li&gt;</code>
	<code>        &lt;/ul&gt;</code>
	<code>    &lt;/details&gt;</code>
	<code>&lt;/details&gt;</code>
</pre>

<h2>Примеры использования</h2>

<p>Так в каких же случаях вы можете использовать <code>&lt;details&gt;</code>? Первое, что приходит в голову — FAQ. Разработчики часто используют для них «аккордеоны», поэтому <code>&lt;details&gt;</code> замечательно подходит.</p>

<p>Также не забывайте о навигации по странице. Это может быть закрепленный блок, передвигающаяся одновременно с прокруткой. <a href="http://jsbin.com/egefop/8#html,live">Возможно, что-то вроде этого?</a></p>

<p>Вы можете использовать <code>&lt;details&gt;</code> для сворачивания и разворачивания блока комментариев в блоге, для профиля пользователя, для описания загружаемого файла, для сложных форм или в веб-приложениях, как показано в этом примере из спецификации:</p>

<p><img src="http://static.web-standards.ru/articles/details-summary-elements/details-w3c.png" alt="Пример использования &lt;details&gt; из спецификации" class="pic pic-middle"></p>

<p class="note">Пример использования <code>&lt;details&gt;</code> из спецификации.</p>

<p>На самом деле, даже глядя сейчас на админку WordPress, я вижу множество возможностей использования <code>&lt;details&gt;</code>. Если у вас есть ещё какие-то идеи и предложения — расскажите о них в комментариях.</p>

<h2>Оформление</h2>

<p>Как же нам оформить эту штуку? Для элемента, раскрывающего содержимое, в WebKit вы можете использовать псевдо-элемент <code>::-webkit-details-marker</code>. <a href="http://jsbin.com/egefop/9#html,live">Небольшой пример</a>:</p>

<pre>
	<code>details summary::-webkit-details-marker {</code>
	<code>    background: red;</code>
	<code>    color: #fff;</code>
	<code>    font-size: 500%;</code>
	<code>}</code>
</pre>

<p>Мы также можем позиционировать этот элемент по отношению к родителю. <a href="http://jsbin.com/egefop/17#html,live">Здесь, например, он прижат к правому краю</a>. В общем-то, и все.</p>

<p>А как же заменить раскрывающий элемент своей иконкой? Используя выборку по атрибуту, вы можете определить, когда <code>&lt;details&gt;</code> раскрыт, а когда закрыт, и применить соответствующее фоновое изображение. Мы делаем примерно то же самое в <a href="http://jsbin.com/egefop/11#html,live">этом примере</a>, за исключением того, что вместо фонового изображения мы используем псевдо-элемент <code>:after</code>:</p>

<pre>
	<code>summary::-webkit-details-marker {</code>
	<code>    display: none</code>
	<code>}</code>
	<code>summary:after {</code>
	<code>    background: red;</code>
	<code>    border-radius: 5px;</code>
	<code>    content: "+";</code>
	<code>    color: #fff;</code>
	<code>    float: left;</code>
	<code>    font-size: 1.5em;</code>
	<code>    font-weight: bold;</code>
	<code>    margin: -5px 10px 0 0;</code>
	<code>    padding: 0;</code>
	<code>    text-align: center;</code>
	<code>    width: 20px;</code>
	<code>}</code>
	<code>details[open] summary:after {</code>
	<code>    content: "-";</code>
	<code>}</code>
</pre>

<p>В этом примере символы <code>+</code> и <code>-</code> используются в качестве раскрывающей ссылки. В зависимости от дизайна вы можете использовать <code>:before</code> вместо <code>:after</code>, но, в любом случае, оба псевдо-элемента позволяют использование изображения.</p>

<p>Выборка по атрибуту <code>details[open]</code> скрывает в себе некоторые интересные возможности. Как хорошие HTML5-доктора, мы создали <a href="http://jsbin.com/egefop/15#html,live">доработанный пример</a>, показанный на этом скриншоте:</p>

<p><img src="http://static.web-standards.ru/articles/details-summary-elements/nice-details.png" alt="Элемент &lt;details&gt; в Chrome" class="pic pic-middle"></p>

<p class="note">Оформленный <code>&lt;details&gt;</code> в Chrome.</p>

<p>Было бы интересно (хотя это и не всегда уместно), если бы мы могли использовать CSS-трансформации для анимации разворачивания и сворачивания <code>&lt;details&gt;</code>, но пока это невозможно.</p>

<h2>Доступность</h2>

<p>К сожалению, на момент написания статьи отсутствует возможность управления <code>&lt;details&gt;</code> с помощью клавиатуры. <a href="http://www.paciellogroup.com/blog/2011/08/accessibility-notes-2nd-august-2011/">Стив Фолкнер пишет</a>:</p>

<blockquote>
	<p>Проблема в том, что на данный момент отсутствует поддержки клавиатуры и нет никакой инофрмации для обеспечения доступности.</p>
</blockquote>

<p>Попробуйте сами. Если вы раскроете элемент <code>&lt;details&gt;</code> с помощью мыши, тогда вы сможете использовать клавиатуру для навигации по вложенным элементам, но вы также должны иметь возможность открывать и закрывать <code>&lt;details&gt;</code> с клавиатуры. Что ж, неидеально, но я уверен, что разработчики Chrome скоро с этим разберутся. Правда, ребята?</p>

<h2>Обратная совместимость</h2>

<p>Прежде чем кто-то начнет восклицать, что это не работает в IE6, хочу сказать: мы знаем. Тем не менее, благодаря некоторым умным людям, мы можем обеспечить изящную обратную совместимость. В этой <a href="https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills">очень полезной коллекции всевозможных кроссбраузерных костылей</a> я нашел два решения, оба они требуют jQuery:</p>

<ul>
	<li>Обратная совместимость для <a href="http://mathiasbynens.be/notes/html5-details-jquery"><code>&lt;details&gt;</code> с помощью jQuery</a> от Матиаса Байненса;</li>
	<li><a href="https://github.com/manuelbieh/details-Polyfill">Еще одна альтернатива <code>&lt;details&gt;</code>, также основанная на jQuery</a> от Мануэля Бье.</li>
</ul>

<p>Многие из вас захотят использовать <a href="http://modernizr.com/">Modernizr</a> для определения возможностей браузера, но на данный момент в Modernizr отсутствует проверка поддержки <code>&lt;details&gt;</code>. Матиас, автор приведенного выше решения для обратной совместимости, предлагает использовать <a href="https://github.com/Modernizr/Modernizr/blob/master/feature-detects/elem-details.js">этот Modernizr-сниппет</a>.</p>

<h2>Зачем вообще это использовать?</h2>

<p>Конечно, дарёному коню в зубы не смотрят, но все-таки — почему этот виджет существует в HTML5? Что ж, как и в случае с другими возможностями HTML5, он просто делает нашу жизнь легче. Реализация таких элементов, как календарь, слайдер, прогресс-бар, а теперь ещё и «аккордеон», становится гораздо проще и не требует использования JavaScript. Кто знает, что будет следующим? Нативные табы? Было бы здорово :)</p>

<h2>В заключение</h2>

<p>В этой статье мы продемонстрировали, как использовать элементы <code>&lt;details&gt;</code> и <code>&lt;summary&gt;</code>. Элемент <code>&lt;details&gt;</code> при помощи <code>&lt;summary&gt;</code> создаёт естественный для браузера интерактивный раскрывающийся виджет.</p>

<p>На текущий момент <code>&lt;details&gt;</code> работает только в Chrome, но, надеюсь, эта ситуация в скором времени изменится. Пока что мы можем использовать в CSS только <code>::-webkit-details-marker</code>, но есть и множество других CSS-техник. Если у вас есть какой-либо опыт или идеи для использования элемента <code>&lt;details&gt;</code>, расскажите об этом в комментариях.</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/the-details-and-summary-elements/">The details and summary elements</a>» <a href="http://html5doctor.com/author/toml/">Тома Лидбеттера</a> (Tom Leadbetter), опубликованной на сайте <a href="http://html5doctor.com/">HTML5Doctor.com</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/details-summary-elements/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Вам не нравится IE6? Что, правда?</title>
		<link>http://web-standards.ru/articles/dont-like-ie6-really/</link>
		<comments>http://web-standards.ru/articles/dont-like-ie6-really/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 10:19:23 +0000</pubDate>
		<dc:creator>Реми Шарп</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/dont-like-ie6-really/</guid>
		<description><![CDATA[<p>Сегодня прочёл очередное высказывание на тему <q>Почему я не поддерживаю IE6</q> из длинного-предлинного списка ему подобных. Что за бред? Если поддержка IE6 является частью вашей работы или включена в договор — значит так оно и есть, такова профессия, и в этих сложностях её смысл.</p>

<p>Меня тошнит от подобных старых и скучных публикаций и даже целых сайтов, посвящённых разглагольствованиям, почему IE6 должен умереть. Мы все в курсе, что IE6 должен умереть. Microsoft в курсе, что IE6 должен умереть. Чёрт, даже сам IE6 в курсе, что он должен умереть. Он шатается вокруг уже многие годы как чёртов зомби.</p>

<p>А теперь смотрите, факт: никто сегодня не устанавливает IE6 в качестве основного браузера. Более того, я готов спорить, что никто, будь у него такой выбор, не предпочтёт IE6 любому другому браузеру. Но проблема не в этом. Теперь нам ясно: никто, блин, специально не выбирает IE6 и уж точно не использует этот браузер, чтобы просто вас взбесить!</p>

<p>Кстати, когда IE6 наконец-то помрёт, кто займётся поиском и заменой IE6 на IE7 во всех записях, а потом IE7 на IE8 и так далее?</p>

<p>Вполне очевидно, что когда компания АБВ во времена XP и IE6 приобретала оборудование для своих сотрудников, это стоило ей чёртову кучу денег. Компании не любят тратить деньги, когда им кажется, что это совсем не нужно. Поэтому очередное обновление всех этих ПК не входит в их приоритеты. Не забывайте, что обновление тянет за собой поддержку, обслуживание, простой и так далее — всё, что стоит ещё одну чёртову кучу денег.</p>

<p>Относительно недавно я вёл курсы в одном научном институте, где местные разработчики рассказали мне, что самый часто используемый браузер у них — это IE6. И поддерживать этот браузер — это их работа.</p>

<p>Их работа. За которую им платят. Если вы не хотите поддерживать IE6 — не поддерживайте. Никто не выкручивает вам руки, заставляя фрилансить над подобными проектами. Если вы настолько против IE6 и имеете постоянную работу — я надеюсь, что вы упомянули это на собеседовании, но если нет — и вы действительно ненавидите IE6, то вы можете уволиться и найти другую работу, правильно?</p>

<p>То, что разрабатывать под IE6 сложно из-за того, что он уже не поддерживается и, в частности, просто не совместим с требованиями к современным сайтам — это факт. Поэтому мы просим за это больше денег.</p>

<p>Если ваш клиент создаёт совершенно новый продукт, то у вас нет причин для поддержки старых браузеров, если только у них нет чёткой статистики, показывающей эту необходимость. В любом случае, существует множество способов просчитать потенциальную статистику использования браузеров. Однако если это уже существующая компания, и у них есть поток IE6, обеспечивающий поддержку их бизнесу — тогда это просто часть вашей работы.</p>

<p>Некоторые команды разработчиков имеют такие размеры и способны нанимать новых людей только благодаря браузерам вроде IE. Если бы всё было так просто, куча людей осталась бы без работы.</p>

<p>Разработка для сети подразумевает, что вы знаете как работают браузеры. Суть такой работы заключается в том, чтобы сайты работали везде. Знание всех «подводных граблей» браузеров — это то, что отличает <em>Ваньку Середнячка</em> от <em>господина Николая Великолепного</em>. Если вы не хотите учить трюки IE6 (или IE7, или IE8, или IE9) — не надо. Вашу работу заберёт кто-нибудь другой.</p>

<p>Что до меня, я с нетерпением жду новых причин, согласно которым IE6 должен умереть — как будто это и так прекрасно не задокументировано.</p>

<p class="note note-last">Перевод оригинальной заметки «<a href="http://remy.tumblr.com/post/8334086394/what-do-you-mean-you-dont-like-ie6-really">What do you mean, you don’t like IE6? Really?</a>» <a href="http://richclarkdesign.com/">Реми Шарпа</a> (Remy Sharp), опубликованной в блоге «<a href="http://remy.tumblr.com/">rem @ &gt; 140 characters</a>».</p>]]></description>
			<content:encoded><![CDATA[<p>Сегодня прочёл очередное высказывание на тему <q>Почему я не поддерживаю IE6</q> из длинного-предлинного списка ему подобных. Что за бред? Если поддержка IE6 является частью вашей работы или включена в договор — значит так оно и есть, такова профессия, и в этих сложностях её смысл.</p>

<p>Меня тошнит от подобных старых и скучных публикаций и даже целых сайтов, посвящённых разглагольствованиям, почему IE6 должен умереть. Мы все в курсе, что IE6 должен умереть. Microsoft в курсе, что IE6 должен умереть. Чёрт, даже сам IE6 в курсе, что он должен умереть. Он шатается вокруг уже многие годы как чёртов зомби.</p>

<p>А теперь смотрите, факт: никто сегодня не устанавливает IE6 в качестве основного браузера. Более того, я готов спорить, что никто, будь у него такой выбор, не предпочтёт IE6 любому другому браузеру. Но проблема не в этом. Теперь нам ясно: никто, блин, специально не выбирает IE6 и уж точно не использует этот браузер, чтобы просто вас взбесить!</p>

<p>Кстати, когда IE6 наконец-то помрёт, кто займётся поиском и заменой IE6 на IE7 во всех записях, а потом IE7 на IE8 и так далее?</p>

<p>Вполне очевидно, что когда компания АБВ во времена XP и IE6 приобретала оборудование для своих сотрудников, это стоило ей чёртову кучу денег. Компании не любят тратить деньги, когда им кажется, что это совсем не нужно. Поэтому очередное обновление всех этих ПК не входит в их приоритеты. Не забывайте, что обновление тянет за собой поддержку, обслуживание, простой и так далее — всё, что стоит ещё одну чёртову кучу денег.</p>

<p>Относительно недавно я вёл курсы в одном научном институте, где местные разработчики рассказали мне, что самый часто используемый браузер у них — это IE6. И поддерживать этот браузер — это их работа.</p>

<p>Их работа. За которую им платят. Если вы не хотите поддерживать IE6 — не поддерживайте. Никто не выкручивает вам руки, заставляя фрилансить над подобными проектами. Если вы настолько против IE6 и имеете постоянную работу — я надеюсь, что вы упомянули это на собеседовании, но если нет — и вы действительно ненавидите IE6, то вы можете уволиться и найти другую работу, правильно?</p>

<p>То, что разрабатывать под IE6 сложно из-за того, что он уже не поддерживается и, в частности, просто не совместим с требованиями к современным сайтам — это факт. Поэтому мы просим за это больше денег.</p>

<p>Если ваш клиент создаёт совершенно новый продукт, то у вас нет причин для поддержки старых браузеров, если только у них нет чёткой статистики, показывающей эту необходимость. В любом случае, существует множество способов просчитать потенциальную статистику использования браузеров. Однако если это уже существующая компания, и у них есть поток IE6, обеспечивающий поддержку их бизнесу — тогда это просто часть вашей работы.</p>

<p>Некоторые команды разработчиков имеют такие размеры и способны нанимать новых людей только благодаря браузерам вроде IE. Если бы всё было так просто, куча людей осталась бы без работы.</p>

<p>Разработка для сети подразумевает, что вы знаете как работают браузеры. Суть такой работы заключается в том, чтобы сайты работали везде. Знание всех «подводных граблей» браузеров — это то, что отличает <em>Ваньку Середнячка</em> от <em>господина Николая Великолепного</em>. Если вы не хотите учить трюки IE6 (или IE7, или IE8, или IE9) — не надо. Вашу работу заберёт кто-нибудь другой.</p>

<p>Что до меня, я с нетерпением жду новых причин, согласно которым IE6 должен умереть — как будто это и так прекрасно не задокументировано.</p>

<p class="note note-last">Перевод оригинальной заметки «<a href="http://remy.tumblr.com/post/8334086394/what-do-you-mean-you-dont-like-ie6-really">What do you mean, you don’t like IE6? Really?</a>» <a href="http://richclarkdesign.com/">Реми Шарпа</a> (Remy Sharp), опубликованной в блоге «<a href="http://remy.tumblr.com/">rem @ &gt; 140 characters</a>».</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/dont-like-ie6-really/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Избегаем популярных ошибок в HTML5</title>
		<link>http://web-standards.ru/articles/avoiding-html5-mistakes/</link>
		<comments>http://web-standards.ru/articles/avoiding-html5-mistakes/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 16:12:33 +0000</pubDate>
		<dc:creator>Ричард Кларк</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[вёрстка]]></category>
		<category><![CDATA[методика]]></category>
		<category><![CDATA[семантика]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/avoiding-html5-mistakes/</guid>
		<description><![CDATA[<p>Разбирая сайты для <a href="http://html5gallery.com/">Галереи HTML5</a> и отвечая на вопросы читателей на сайте <a href="http://html5doctor.com/">Доктор HTML5</a>, я вынужден просматривать целую кучу страниц на HTML5 и, конечно же, их исходный код. В этой статье я расскажу вам об ошибках и сомнительной разметке, которые мне частенько приходится видеть, и объясню, как их избежать.</p>

<h2>Не используйте <code>&lt;section&gt;</code> как обёртку для оформления</h2>

<p>Одна из самых распространённых проблем, которую я часто вижу в разметке сайтов — это произвольная замена элементов <code>&lt;div&gt;</code> структурными элементами из HTML5, особенно замена оформительской обёртки на <code>&lt;section&gt;</code>. В XHTML или HTML4 я бы увидел что-нибудь такое:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;div id="wrapper"&gt;</code>
	<code>    &lt;div id="header"&gt;  </code>
	<code>        &lt;h1&gt;Моя супер-пупер страница&lt;/h1&gt;</code>
	<code>        &lt;!-- Содержимое шапки --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;div id="main"&gt;</code>
	<code>        &lt;!-- Содержимое страницы --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;div id="secondary"&gt;</code>
	<code>        &lt;!-- Вторичное содержимое --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;div id="footer"&gt;</code>
	<code>        &lt;!-- Содержимое подвала --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>&lt;/div&gt;</code>
</pre>

<p>Вместо этого я вижу следующее:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;section id="wrapper"&gt;</code>
	<code>    &lt;header&gt;  </code>
	<code>        &lt;h1&gt;Моя супер-пупер страница&lt;/h1&gt;</code>
	<code>        &lt;!-- Содержимое шапки --&gt;</code>
	<code>    &lt;/header&gt;</code>
	<code>    &lt;div id="main"&gt;</code>
	<code>        &lt;!-- Содержимое страницы --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;section id="secondary"&gt;</code>
	<code>        &lt;!-- Вторичное содержимое --&gt;</code>
	<code>    &lt;/section&gt;</code>
	<code>    &lt;footer&gt;</code>
	<code>        &lt;!-- Содержимое подвала --&gt;</code>
	<code>    &lt;/footer&gt;</code>
	<code>&lt;/section&gt;</code>
</pre>

<p>Честно говоря, это неправильно: <code>&lt;section&gt;</code> — это <strong>не обёртка.</strong> <a href="http://html5doctor.com/section">Элемент <code>&lt;section&gt;</code></a> определяет смысловую секцию содержимого для создания <a href="http://html5doctor.com/outline">структуры документа</a>. Он должен содержать заголовок. Если вы ищете элемент для того чтобы обернуть в него всю страницу (в стиле HTML или XHTML), подумайте, не применить ли стили непосредственно к элементу <code>&lt;body&gt;</code>, <a href="http://camendesign.com/code/developpeurs_sans_frontieres">как описано у Крока Кеймена</a>. Если же вам всё ещё нужна дополнительная обёртка, используйте <code>&lt;div&gt;</code>. Раз уж <a href="http://html5doctor.com/div">Доктор Майк объясняет, что <code>&lt;div&gt;</code> не мёртв</a>, а вам не удаётся найти ничего более удачного, пожалуй, этот элемент будет самым подходящим для создания оформительской обёртки.</p>

<p>Таким образом, корректной разметкой для упомянутого выше примера с использованием HTML5 и пары ролей ARIA будет следующий код. Обратите внимание, что вам, в зависимости от дизайна, всё ещё могут понадобится экстра-элементы <code>&lt;div&gt;</code>.</p>

<pre>
	<code>&lt;body&gt;</code>
	<code>    &lt;header&gt;  </code>
	<code>        &lt;h1&gt;Моя супер-пупер страница&lt;/h1&gt;</code>
	<code>        &lt;!-- Содержимое шапки --&gt;</code>
	<code>    &lt;/header&gt;</code>
	<code>    &lt;div role="main"&gt;</code>
	<code>        &lt;!-- Содержимое страницы --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;aside role="complementary"&gt;</code>
	<code>        &lt;!-- Вторичное содержимое --&gt;</code>
	<code>    &lt;/aside&gt;</code>
	<code>    &lt;footer&gt;</code>
	<code>        &lt;!-- Содержимое подвала --&gt;</code>
	<code>    &lt;/footer&gt;</code>
	<code>&lt;/body&gt;</code>
</pre>

<p>Если вы не уверены, какие элементы использовать, я рекомендую вам обратиться к нашей <a href="http://html5doctor.com/happy-1st-birthday-us/#flowchart">пошаговой схеме выбора HTML5-элементов</a> для разметки содержимого.</p>

<h2>Используйте <code>&lt;header&gt;</code> и <code>&lt;hgroup&gt;</code> осознанно</h2>

<p>Нет смысла писать разметку, если этого можно не делать, так ведь? К сожалению, я часто вижу элементы <code>&lt;header&gt;</code> и <code>&lt;hgroup&gt;</code> там, где они совсем не нужны. Вы можете узнать все подробности в наших статьях, посвящённых <a href="http://html5doctor.com/header">элементу <code>&lt;header&gt;</code></a> и <a href="http://html5doctor.com/hgroup">элементу <code>&lt;hgroup&gt;</code></a>, но я коротко резюмирую:</p>

<ul>
	<li>Элемент <code>&lt;header&gt;</code> представляет собой группу вводного содержимого или навигационных средств и обычно содержит структурный заголовок.</li>
	<li>Элемент <code>&lt;hgroup&gt;</code> группирует набор элементов от <code>&lt;h1&gt;</code> до <code>&lt;h6&gt;</code>, представляя собой структурный заголовок в случае, когда заглавие имеет несколько уровней, вроде подзаголовков, альтернативных названий или слоганов.</li>
</ul>

<h3>Злоупотребление <code>&lt;header&gt;</code></h3>

<p>Думаю, что вы в курсе, что <code>&lt;header&gt;</code> можно использовать в документе несколько раз. Но эта возможность привела к следующим ошибкам:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;article&gt;</code>
	<code>    &lt;header&gt;  </code>
	<code>        &lt;h1&gt;Мой лучший пост&lt;/h1&gt;</code>
	<code>    &lt;/header&gt;</code>
	<code>    &lt;!-- Содержимое записи --&gt;</code>
	<code>&lt;/article&gt;</code>
</pre>

<p>Если ваш <code>&lt;header&gt;</code> содержит единственный заголовок, избавьтесь от ненужного <code>&lt;header&gt;</code>. Элемент <code>&lt;article&gt;</code> в любом случае гарантирует, что заголовок войдёт в смысловую структуру документа. И поскольку <code>&lt;header&gt;</code> не содержит нескольких элементов, как указано в его описании, зачем вам код, который, в общем-то, не нужен? Будьте проще:</p>

<pre>
	<code>&lt;article&gt;</code>
	<code>    &lt;h1&gt;Мой лучший пост&lt;/h1&gt;</code>
	<code>    &lt;!-- Содержимое записи --&gt;</code>
	<code>&lt;/article&gt;</code>
</pre>

<h3>Неправильное использование <code>&lt;hgroup&gt;</code></h3>

<p>Раз уж зашла речь о заголовках — я часто вижу неправильное использование <code>&lt;hgroup&gt;</code>. Не следует использовать <code>&lt;hgroup&gt;</code> в сочетании с <code>&lt;header&gt;</code> в случае, когда:</p>

<ul>
	<li>дочерний заголовок всего один или</li>
	<li>элемента <code>&lt;hgroup&gt;</code> будет достаточно и без <code>&lt;header&gt;</code>.</li>
</ul>

<p>Первая проблема выглядит так:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;header&gt;</code>
	<code>    &lt;hgroup&gt;  </code>
	<code>        &lt;h1&gt;Мой лучший пост&lt;/h1&gt;</code>
	<code>    &lt;/hgroup&gt;</code>
	<code>    &lt;p&gt;Ричард Кларк&lt;/p&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<p>В этом случае стоит избавиться от <code>&lt;hgroup&gt;</code> и оставить только заголовок:</p>

<pre>
	<code>&lt;header&gt;</code>
	<code>    &lt;h1&gt;Мой лучший пост&lt;/h1&gt;</code>
	<code>    &lt;p&gt;Ричард Кларк&lt;/p&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<p>Следующая проблема состоит в очередном использовании элементов там, где они необязательны:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;header&gt;</code>
	<code>    &lt;hgroup&gt;  </code>
	<code>        &lt;h1&gt;Моя компания&lt;/h1&gt;</code>
	<code>        &lt;h2&gt;Основана в 1893 году&lt;/h2&gt;</code>
	<code>    &lt;/hgroup&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<p>Когда <code>&lt;hgroup&gt;</code> — это единственный дочерний элемент <code>&lt;header&gt;</code>, то какой смысл в этом <code>&lt;header&gt;</code>? Если в нём нет дополнительных элементов, соседствующих с <code>&lt;hgroup&gt;</code>, смело избавляйтесь от <code>&lt;header&gt;</code>.</p>

<pre>
	<code>&lt;hgroup&gt;  </code>
	<code>    &lt;h1&gt;Моя компания&lt;/h1&gt;</code>
	<code>    &lt;h2&gt;Основана в 1893 году&lt;/h2&gt;</code>
	<code>&lt;/hgroup&gt;</code>
</pre>

<p>Больше примеров использования <code>&lt;hgroup&gt;</code> вы можете найти <a href="http://html5doctor.com/hgroup">в отдельной, более подробной статье</a>.</p>

<h2>Не оборачивайте все списки ссылок в <code>&lt;nav&gt;</code></h2>

<p>На момент написания статьи существует <a href="http://dev.w3.org/html5/html4-differences/#new-elements">более 30-ти новых элементов</a> и неудивительно, что у нас разбегаются глаза, когда дело доходит до создания осмысленной структурной разметки. Поэтому не стоит злоупортреблять всеми доступными сейчас суперсемантическими элементами. Что, к сожалению, часто происходит с элементом <code>&lt;nav&gt;</code>. Спецификация определяет роль <code>&lt;nav&gt;</code> следующим образом:</p>

<blockquote>
	<p>Элемент <code>&lt;nav&gt;</code> представляет собой часть страницы, которая ссылается на другие страницы или части текущей, то есть раздел с навигационными ссылками.</p>
	<p>Замечание: не все группы ссылок на странице должны быть обёрнуты в элемент <code>&lt;nav&gt;</code> — этот элемент, главным образом, предназначен для группировки главных навигационных блоков. В частности, в подвалах часто содержатся короткие списки ссылок на различные части сайта, вроде правил использования сервиса, домашней страницы и копирайтов. Элемента <code>&lt;footer&gt;</code> вполне достаточно для группировки такого рода ссылок; и несмотря на то, что элемент <code>&lt;nav&gt;</code> может быть использован в таких случаях, обычно в этом нет необходимости.</p>
	<p><a href="http://www.whatwg.org/specs/web-apps/current-work/complete/sections.html#the-nav-element">Спецификация WHATWG HTML</a></p>
</blockquote>

<p>Ключевая фраза — «главных навигационных блоков». Мы можем дискутировать весь день о значении слова «главный», но для меня это значит:</p>

<ul>
	<li>Самая главная навигация;</li>
	<li>Поиск по сайту;</li>
	<li>Вторичная навигация (что спорно);</li>
	<li>Внутренняя навигация (по длинной статье, например).</li>
</ul>

<p>И хотя здесь не может быть «правильного» или «неправильного» использования, поверхностный опрос вкупе с моей собственной интерпретацией говорят, что следующие случаи не подходят для использования <code>&lt;nav&gt;</code>:</p>

<ul>
	<li>Постраничная навигация;</li>
	<li>Социальные ссылки, за исключением тех случаев, когда такие ссылки являются основной навигацией, к примеру, на сайтах <a href="http://about.me/">About Me</a> и <a href="http://flavours.me/">Flavours</a>;</li>
	<li>Тэги к записи в блоге;</li>
	<li>Категории записи;</li>
	<li>Навигация третьего уровня;</li>
	<li>Подвалы, набитые ссылками.</li>
</ul>

<p>Если вы не уверены, стоит ли оборачивать список ссылок в <code>&lt;nav&gt;</code>, просто спросите у себя: «главная ли это навигация?» Чтобы было легче ответить на этот вопрос, обратитесь к следующим правилам:</p>

<ul>
	<li>«Не используйте <code>&lt;nav&gt;</code>, если кажется, что в этом случае может подойти и <code>&lt;section&gt;</code> с заголовком <code>&lt;hx&gt;</code>», — <a href="http://krijnhoetmer.nl/irc-logs/whatwg/20091209#l-480">Ян Хиксон, IRC</a>.</li>
	<li>Добавите ли вы этот блок в список ссылок «перейти» для улучшения доступности?</li>
</ul>

<p>Если ответ на оба эти вопроса «нет», то, скорее всего, это не <code>&lt;nav&gt;</code>.</p>

<h2>Общие ошибки с элементом <code>&lt;figure&gt;</code></h2>

<p>Ах, <code>&lt;figure&gt;</code>. Правильным использованием этого элемента вместе с подельником <code>&lt;figcaption&gt;</code> не так-то просто овладеть. Рассмотрим некоторые общие проблемы, которые я вижу при использовании <code>&lt;figure&gt;</code>.</p>

<h3>Не каждая картинка это <code>&lt;figure&gt;</code></h3>

<p>Ранее я советовал вам не писать лишний код там, где этого не требуется. Та же ошибка и здесь. Я видел сайты, где каждая картинка была обёрнута в <code>&lt;figure&gt;</code>. Нет никакой необходимости в добавлении экстра-разметки вокруг картинок только ради самого процесса. Вы просто делаете лишнюю работу и нисколько не улучшаете описание содержимого страницы.</p>

<p>Спецификация обозначает <code>&lt;figure&gt;</code> как «содержимое в потоке, с необязательным заглавием, самодостаточное, обычно упоминаемое в качестве смысловой единицы в основном тексте». Как раз в этом состоит вся красота элемента <code>&lt;figure&gt;</code>, который может быть перемещён из основного содержимого, скажем, в колонку, что никак не повлияет на основной поток документа.</p>

<p>Если это исключительно оформительская картинка, никаким образом не упомянутая в основном документе, то это точно не <code>&lt;figure&gt;</code>. Есть и другие варианты использования, но просто спросите себя: «Нужна ли эта картинка для лучшего понимания контекста?» Если нет, то это вероятно не <code>&lt;figure&gt;</code>, а, возможно, <code>&lt;aside&gt;</code>. Если да, спросите себя: «Можно ли переместить эту картинку в примечания к тексту?» Если ответ на оба вопроса «да», то это, вероятнее всего, <code>&lt;figure&gt;</code>.</p>

<h3>Ваш логотип — это не <code>&lt;figure&gt;</code></h3>

<p>Плавно переходим к следующей проблеме, вышеупомянутые правила применимы и к ней. Вот пара регулярно встречающихся примеров:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;header&gt;</code>
	<code>    &lt;h1&gt;</code>
	<code>        &lt;figure&gt;</code>
	<code>            &lt;img src="logo.png" alt="Моя компания"&gt;</code>
	<code>        &lt;/figure&gt;</code>
	<code>        Название компании</code>
	<code>    &lt;/h1&gt;</code>
	<code>&lt;/header&gt;</code>
	<code> </code>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;header&gt;  </code>
	<code>    &lt;figure&gt;</code>
	<code>        &lt;img src="logo.png" alt="Моя компания"&gt;</code>
	<code>    &lt;/figure&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<p>Добавить здесь нечего: это совсем неправильно. Мы можем спорить до посинения насчёт того, должно ли лого находиться внутри <code>&lt;h1&gt;</code>, но мы здесь не за этим. Настоящая проблема — в неправильном употреблении <code>&lt;figure&gt;</code>. Этот элемент должен использоваться, только если он упоминается в документе или контексте общего структурного элемента. Будет честным признать, что ваш логотип вряд ли будет упомянут подобным образом. Просто не делайте так. Всё, что вам нужно, это:</p>

<pre>
	<code>&lt;header&gt;</code>
	<code>    &lt;h1&gt;Название компании&lt;/h1&gt;</code>
	<code>    &lt;!-- и всё остальное здесь --&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<h3>Элемент <code>&lt;figure&gt;</code> — это не только картинки</h3>

<p>Другое распространённое заблуждение насчёт <code>&lt;figure&gt;</code> — что он может быть использован только для картинок. Это не так. Элемент <code>&lt;figure&gt;</code> может быть видео, аудио, графиком (на SVG, к примеру), цитатой, таблицей, блоком кода, фрагментом текста или любой комбинацией этих и многих других элементов. Не ограничивайте использование <code>&lt;figure&gt;</code> только картинками. Наша работа, как энтузиастов от веб-стандартов, заключается в том, чтобы максимально точно описывать содержимое при помощи разметки.</p>

<p>Некоторое время назад я <a href="http://html5doctor.com/figure">писал про <code>&lt;figure&gt;</code> детальнее</a>. Рекомендую почитать, если вам интересно узнать подробности или просто освежить знания.</p>

<h2>Не используйте ненужные атрибуты <code>type</code></h2>

<p>Эта проблема, пожалуй, является самой распространённой среди заявок в Галерею HTML5. И хотя это, по сути, не ошибка, мне кажется, что правильнее будет её избегать.</p>

<p>Дело в том, что в HTML5 не нужно добавлять атрибут <code>type</code> для элементов <code>&lt;script&gt;</code> и <code>&lt;style&gt;</code>. Если эти элементы автоматически добавляются вашей CMS, то избавиться от них может быть непросто, но если вы пишете код руками или полностью контролируете шаблоны, то нет никакого смысла писать избыточные атрибуты. Поскольку все браузеры ожидают, что скриптами будет JavaScript, а стилями CSS, вам это совсем не нужно:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;link type="text/css" rel="stylesheet" href="styles.css"&gt;</code>
	<code>&lt;script type="text/javascript" src="scripts"&gt;&lt;/script&gt;</code>
</pre>

<p>Вместо этого просто напишите:</p>

<pre>
	<code>&lt;link rel="stylesheet" href="styles.css"&gt;</code>
	<code>&lt;script src="scripts"&gt;&lt;/script&gt;</code>
</pre>

<p>Кроме того, вы можете уменьшить объём кода, который пишете для задания кодировки документа и других вещей. Глава про семантику в «<a href="http://diveintohtml5.org/semantics.html">Погружении в HTML5</a>» Марка Пилгрима объясняет всё.</p>

<h2>Неправильное использование атрибутов форм</h2>

<p>Вы, должно быть, знаете, что HTML5 предложил набор новых атрибутов для элементов форм. Мы расскажем о них подробнее в ближайшие месяцы, а пока я покажу вам некоторые вещи, которые делать не стоит.</p>

<h3>Одиночные атрибуты</h3>

<p>Некоторые новые атрибуты для элементов форм являются одиночными, и только одно их присутствие в разметке обеспечивает смену поведения. Эти атрибуты включают:</p>

<pre>
	<code>autofocus</code>
	<code>autocomplete</code>
	<code>required</code>
</pre>

<p>Надо признаться, я нечасто встречал подобное, но если в качестве примера взять атрибут <code>required</code>, то попадалось следующее:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;input type="email" name="email" required="true"&gt;</code>
	<code>&lt;!-- Ещё один плохой пример --&gt;</code>
	<code>&lt;input type="email" name="email" required="1"&gt;</code>
</pre>

<p>В конечном счёте это никому не вредит. HTML-парсер видит атрибут <code>required</code> в разметке, поэтому требуемая функциональность будет включена. Но что, если поставить код вверх ногами и написать <code>required="false"</code>?</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;input type="email" name="email" required="false"&gt;</code>
</pre>

<p>Парсер по-прежнему увидит атрибут <code>required</code> и применит поведение, несмотря на то, что вы пытались сказать ему не делать этого. Явно не то, что вам было нужно.</p>

<p>Существует три правильных способа задания одиночных атрибутов, второй и третий из которых нужны только если вы пишете XHTML:</p>

<pre>
	<code>required</code>
	<code>required=""</code>
	<code>required="required"</code>
</pre>

<p>Если применить эту запись к нашему примеру (в HTML), получится следующее:</p>

<pre>
	<code>&lt;input type="email" name="email" required&gt;</code>
</pre>

<h2>Резюме</h2>

<p>Было бы просто невозможным перечислить здесь все странные приёмы и образцы разметки, с которыми мне довелось столкнуться, но эти — одни из самых часто встречавшихся. А какие ещё ошибки разметки бросались вам в глаза? Расскажите в комментариях.</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/avoiding-common-html5-mistakes/">Avoiding common HTML5 mistakes</a>» <a href="http://richclarkdesign.com/">Ричарда Кларка</a> (Richard Clark), опубликованной на сайте <a href="http://html5doctor.com/">HTML5Doctor.com</a>.</p>]]></description>
			<content:encoded><![CDATA[<p>Разбирая сайты для <a href="http://html5gallery.com/">Галереи HTML5</a> и отвечая на вопросы читателей на сайте <a href="http://html5doctor.com/">Доктор HTML5</a>, я вынужден просматривать целую кучу страниц на HTML5 и, конечно же, их исходный код. В этой статье я расскажу вам об ошибках и сомнительной разметке, которые мне частенько приходится видеть, и объясню, как их избежать.</p>

<h2>Не используйте <code>&lt;section&gt;</code> как обёртку для оформления</h2>

<p>Одна из самых распространённых проблем, которую я часто вижу в разметке сайтов — это произвольная замена элементов <code>&lt;div&gt;</code> структурными элементами из HTML5, особенно замена оформительской обёртки на <code>&lt;section&gt;</code>. В XHTML или HTML4 я бы увидел что-нибудь такое:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;div id="wrapper"&gt;</code>
	<code>    &lt;div id="header"&gt;  </code>
	<code>        &lt;h1&gt;Моя супер-пупер страница&lt;/h1&gt;</code>
	<code>        &lt;!-- Содержимое шапки --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;div id="main"&gt;</code>
	<code>        &lt;!-- Содержимое страницы --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;div id="secondary"&gt;</code>
	<code>        &lt;!-- Вторичное содержимое --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;div id="footer"&gt;</code>
	<code>        &lt;!-- Содержимое подвала --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>&lt;/div&gt;</code>
</pre>

<p>Вместо этого я вижу следующее:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;section id="wrapper"&gt;</code>
	<code>    &lt;header&gt;  </code>
	<code>        &lt;h1&gt;Моя супер-пупер страница&lt;/h1&gt;</code>
	<code>        &lt;!-- Содержимое шапки --&gt;</code>
	<code>    &lt;/header&gt;</code>
	<code>    &lt;div id="main"&gt;</code>
	<code>        &lt;!-- Содержимое страницы --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;section id="secondary"&gt;</code>
	<code>        &lt;!-- Вторичное содержимое --&gt;</code>
	<code>    &lt;/section&gt;</code>
	<code>    &lt;footer&gt;</code>
	<code>        &lt;!-- Содержимое подвала --&gt;</code>
	<code>    &lt;/footer&gt;</code>
	<code>&lt;/section&gt;</code>
</pre>

<p>Честно говоря, это неправильно: <code>&lt;section&gt;</code> — это <strong>не обёртка.</strong> <a href="http://html5doctor.com/section">Элемент <code>&lt;section&gt;</code></a> определяет смысловую секцию содержимого для создания <a href="http://html5doctor.com/outline">структуры документа</a>. Он должен содержать заголовок. Если вы ищете элемент для того чтобы обернуть в него всю страницу (в стиле HTML или XHTML), подумайте, не применить ли стили непосредственно к элементу <code>&lt;body&gt;</code>, <a href="http://camendesign.com/code/developpeurs_sans_frontieres">как описано у Крока Кеймена</a>. Если же вам всё ещё нужна дополнительная обёртка, используйте <code>&lt;div&gt;</code>. Раз уж <a href="http://html5doctor.com/div">Доктор Майк объясняет, что <code>&lt;div&gt;</code> не мёртв</a>, а вам не удаётся найти ничего более удачного, пожалуй, этот элемент будет самым подходящим для создания оформительской обёртки.</p>

<p>Таким образом, корректной разметкой для упомянутого выше примера с использованием HTML5 и пары ролей ARIA будет следующий код. Обратите внимание, что вам, в зависимости от дизайна, всё ещё могут понадобится экстра-элементы <code>&lt;div&gt;</code>.</p>

<pre>
	<code>&lt;body&gt;</code>
	<code>    &lt;header&gt;  </code>
	<code>        &lt;h1&gt;Моя супер-пупер страница&lt;/h1&gt;</code>
	<code>        &lt;!-- Содержимое шапки --&gt;</code>
	<code>    &lt;/header&gt;</code>
	<code>    &lt;div role="main"&gt;</code>
	<code>        &lt;!-- Содержимое страницы --&gt;</code>
	<code>    &lt;/div&gt;</code>
	<code>    &lt;aside role="complementary"&gt;</code>
	<code>        &lt;!-- Вторичное содержимое --&gt;</code>
	<code>    &lt;/aside&gt;</code>
	<code>    &lt;footer&gt;</code>
	<code>        &lt;!-- Содержимое подвала --&gt;</code>
	<code>    &lt;/footer&gt;</code>
	<code>&lt;/body&gt;</code>
</pre>

<p>Если вы не уверены, какие элементы использовать, я рекомендую вам обратиться к нашей <a href="http://html5doctor.com/happy-1st-birthday-us/#flowchart">пошаговой схеме выбора HTML5-элементов</a> для разметки содержимого.</p>

<h2>Используйте <code>&lt;header&gt;</code> и <code>&lt;hgroup&gt;</code> осознанно</h2>

<p>Нет смысла писать разметку, если этого можно не делать, так ведь? К сожалению, я часто вижу элементы <code>&lt;header&gt;</code> и <code>&lt;hgroup&gt;</code> там, где они совсем не нужны. Вы можете узнать все подробности в наших статьях, посвящённых <a href="http://html5doctor.com/header">элементу <code>&lt;header&gt;</code></a> и <a href="http://html5doctor.com/hgroup">элементу <code>&lt;hgroup&gt;</code></a>, но я коротко резюмирую:</p>

<ul>
	<li>Элемент <code>&lt;header&gt;</code> представляет собой группу вводного содержимого или навигационных средств и обычно содержит структурный заголовок.</li>
	<li>Элемент <code>&lt;hgroup&gt;</code> группирует набор элементов от <code>&lt;h1&gt;</code> до <code>&lt;h6&gt;</code>, представляя собой структурный заголовок в случае, когда заглавие имеет несколько уровней, вроде подзаголовков, альтернативных названий или слоганов.</li>
</ul>

<h3>Злоупотребление <code>&lt;header&gt;</code></h3>

<p>Думаю, что вы в курсе, что <code>&lt;header&gt;</code> можно использовать в документе несколько раз. Но эта возможность привела к следующим ошибкам:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;article&gt;</code>
	<code>    &lt;header&gt;  </code>
	<code>        &lt;h1&gt;Мой лучший пост&lt;/h1&gt;</code>
	<code>    &lt;/header&gt;</code>
	<code>    &lt;!-- Содержимое записи --&gt;</code>
	<code>&lt;/article&gt;</code>
</pre>

<p>Если ваш <code>&lt;header&gt;</code> содержит единственный заголовок, избавьтесь от ненужного <code>&lt;header&gt;</code>. Элемент <code>&lt;article&gt;</code> в любом случае гарантирует, что заголовок войдёт в смысловую структуру документа. И поскольку <code>&lt;header&gt;</code> не содержит нескольких элементов, как указано в его описании, зачем вам код, который, в общем-то, не нужен? Будьте проще:</p>

<pre>
	<code>&lt;article&gt;</code>
	<code>    &lt;h1&gt;Мой лучший пост&lt;/h1&gt;</code>
	<code>    &lt;!-- Содержимое записи --&gt;</code>
	<code>&lt;/article&gt;</code>
</pre>

<h3>Неправильное использование <code>&lt;hgroup&gt;</code></h3>

<p>Раз уж зашла речь о заголовках — я часто вижу неправильное использование <code>&lt;hgroup&gt;</code>. Не следует использовать <code>&lt;hgroup&gt;</code> в сочетании с <code>&lt;header&gt;</code> в случае, когда:</p>

<ul>
	<li>дочерний заголовок всего один или</li>
	<li>элемента <code>&lt;hgroup&gt;</code> будет достаточно и без <code>&lt;header&gt;</code>.</li>
</ul>

<p>Первая проблема выглядит так:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;header&gt;</code>
	<code>    &lt;hgroup&gt;  </code>
	<code>        &lt;h1&gt;Мой лучший пост&lt;/h1&gt;</code>
	<code>    &lt;/hgroup&gt;</code>
	<code>    &lt;p&gt;Ричард Кларк&lt;/p&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<p>В этом случае стоит избавиться от <code>&lt;hgroup&gt;</code> и оставить только заголовок:</p>

<pre>
	<code>&lt;header&gt;</code>
	<code>    &lt;h1&gt;Мой лучший пост&lt;/h1&gt;</code>
	<code>    &lt;p&gt;Ричард Кларк&lt;/p&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<p>Следующая проблема состоит в очередном использовании элементов там, где они необязательны:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;header&gt;</code>
	<code>    &lt;hgroup&gt;  </code>
	<code>        &lt;h1&gt;Моя компания&lt;/h1&gt;</code>
	<code>        &lt;h2&gt;Основана в 1893 году&lt;/h2&gt;</code>
	<code>    &lt;/hgroup&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<p>Когда <code>&lt;hgroup&gt;</code> — это единственный дочерний элемент <code>&lt;header&gt;</code>, то какой смысл в этом <code>&lt;header&gt;</code>? Если в нём нет дополнительных элементов, соседствующих с <code>&lt;hgroup&gt;</code>, смело избавляйтесь от <code>&lt;header&gt;</code>.</p>

<pre>
	<code>&lt;hgroup&gt;  </code>
	<code>    &lt;h1&gt;Моя компания&lt;/h1&gt;</code>
	<code>    &lt;h2&gt;Основана в 1893 году&lt;/h2&gt;</code>
	<code>&lt;/hgroup&gt;</code>
</pre>

<p>Больше примеров использования <code>&lt;hgroup&gt;</code> вы можете найти <a href="http://html5doctor.com/hgroup">в отдельной, более подробной статье</a>.</p>

<h2>Не оборачивайте все списки ссылок в <code>&lt;nav&gt;</code></h2>

<p>На момент написания статьи существует <a href="http://dev.w3.org/html5/html4-differences/#new-elements">более 30-ти новых элементов</a> и неудивительно, что у нас разбегаются глаза, когда дело доходит до создания осмысленной структурной разметки. Поэтому не стоит злоупортреблять всеми доступными сейчас суперсемантическими элементами. Что, к сожалению, часто происходит с элементом <code>&lt;nav&gt;</code>. Спецификация определяет роль <code>&lt;nav&gt;</code> следующим образом:</p>

<blockquote>
	<p>Элемент <code>&lt;nav&gt;</code> представляет собой часть страницы, которая ссылается на другие страницы или части текущей, то есть раздел с навигационными ссылками.</p>
	<p>Замечание: не все группы ссылок на странице должны быть обёрнуты в элемент <code>&lt;nav&gt;</code> — этот элемент, главным образом, предназначен для группировки главных навигационных блоков. В частности, в подвалах часто содержатся короткие списки ссылок на различные части сайта, вроде правил использования сервиса, домашней страницы и копирайтов. Элемента <code>&lt;footer&gt;</code> вполне достаточно для группировки такого рода ссылок; и несмотря на то, что элемент <code>&lt;nav&gt;</code> может быть использован в таких случаях, обычно в этом нет необходимости.</p>
	<p><a href="http://www.whatwg.org/specs/web-apps/current-work/complete/sections.html#the-nav-element">Спецификация WHATWG HTML</a></p>
</blockquote>

<p>Ключевая фраза — «главных навигационных блоков». Мы можем дискутировать весь день о значении слова «главный», но для меня это значит:</p>

<ul>
	<li>Самая главная навигация;</li>
	<li>Поиск по сайту;</li>
	<li>Вторичная навигация (что спорно);</li>
	<li>Внутренняя навигация (по длинной статье, например).</li>
</ul>

<p>И хотя здесь не может быть «правильного» или «неправильного» использования, поверхностный опрос вкупе с моей собственной интерпретацией говорят, что следующие случаи не подходят для использования <code>&lt;nav&gt;</code>:</p>

<ul>
	<li>Постраничная навигация;</li>
	<li>Социальные ссылки, за исключением тех случаев, когда такие ссылки являются основной навигацией, к примеру, на сайтах <a href="http://about.me/">About Me</a> и <a href="http://flavours.me/">Flavours</a>;</li>
	<li>Тэги к записи в блоге;</li>
	<li>Категории записи;</li>
	<li>Навигация третьего уровня;</li>
	<li>Подвалы, набитые ссылками.</li>
</ul>

<p>Если вы не уверены, стоит ли оборачивать список ссылок в <code>&lt;nav&gt;</code>, просто спросите у себя: «главная ли это навигация?» Чтобы было легче ответить на этот вопрос, обратитесь к следующим правилам:</p>

<ul>
	<li>«Не используйте <code>&lt;nav&gt;</code>, если кажется, что в этом случае может подойти и <code>&lt;section&gt;</code> с заголовком <code>&lt;hx&gt;</code>», — <a href="http://krijnhoetmer.nl/irc-logs/whatwg/20091209#l-480">Ян Хиксон, IRC</a>.</li>
	<li>Добавите ли вы этот блок в список ссылок «перейти» для улучшения доступности?</li>
</ul>

<p>Если ответ на оба эти вопроса «нет», то, скорее всего, это не <code>&lt;nav&gt;</code>.</p>

<h2>Общие ошибки с элементом <code>&lt;figure&gt;</code></h2>

<p>Ах, <code>&lt;figure&gt;</code>. Правильным использованием этого элемента вместе с подельником <code>&lt;figcaption&gt;</code> не так-то просто овладеть. Рассмотрим некоторые общие проблемы, которые я вижу при использовании <code>&lt;figure&gt;</code>.</p>

<h3>Не каждая картинка это <code>&lt;figure&gt;</code></h3>

<p>Ранее я советовал вам не писать лишний код там, где этого не требуется. Та же ошибка и здесь. Я видел сайты, где каждая картинка была обёрнута в <code>&lt;figure&gt;</code>. Нет никакой необходимости в добавлении экстра-разметки вокруг картинок только ради самого процесса. Вы просто делаете лишнюю работу и нисколько не улучшаете описание содержимого страницы.</p>

<p>Спецификация обозначает <code>&lt;figure&gt;</code> как «содержимое в потоке, с необязательным заглавием, самодостаточное, обычно упоминаемое в качестве смысловой единицы в основном тексте». Как раз в этом состоит вся красота элемента <code>&lt;figure&gt;</code>, который может быть перемещён из основного содержимого, скажем, в колонку, что никак не повлияет на основной поток документа.</p>

<p>Если это исключительно оформительская картинка, никаким образом не упомянутая в основном документе, то это точно не <code>&lt;figure&gt;</code>. Есть и другие варианты использования, но просто спросите себя: «Нужна ли эта картинка для лучшего понимания контекста?» Если нет, то это вероятно не <code>&lt;figure&gt;</code>, а, возможно, <code>&lt;aside&gt;</code>. Если да, спросите себя: «Можно ли переместить эту картинку в примечания к тексту?» Если ответ на оба вопроса «да», то это, вероятнее всего, <code>&lt;figure&gt;</code>.</p>

<h3>Ваш логотип — это не <code>&lt;figure&gt;</code></h3>

<p>Плавно переходим к следующей проблеме, вышеупомянутые правила применимы и к ней. Вот пара регулярно встречающихся примеров:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;header&gt;</code>
	<code>    &lt;h1&gt;</code>
	<code>        &lt;figure&gt;</code>
	<code>            &lt;img src="logo.png" alt="Моя компания"&gt;</code>
	<code>        &lt;/figure&gt;</code>
	<code>        Название компании</code>
	<code>    &lt;/h1&gt;</code>
	<code>&lt;/header&gt;</code>
	<code> </code>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;header&gt;  </code>
	<code>    &lt;figure&gt;</code>
	<code>        &lt;img src="logo.png" alt="Моя компания"&gt;</code>
	<code>    &lt;/figure&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<p>Добавить здесь нечего: это совсем неправильно. Мы можем спорить до посинения насчёт того, должно ли лого находиться внутри <code>&lt;h1&gt;</code>, но мы здесь не за этим. Настоящая проблема — в неправильном употреблении <code>&lt;figure&gt;</code>. Этот элемент должен использоваться, только если он упоминается в документе или контексте общего структурного элемента. Будет честным признать, что ваш логотип вряд ли будет упомянут подобным образом. Просто не делайте так. Всё, что вам нужно, это:</p>

<pre>
	<code>&lt;header&gt;</code>
	<code>    &lt;h1&gt;Название компании&lt;/h1&gt;</code>
	<code>    &lt;!-- и всё остальное здесь --&gt;</code>
	<code>&lt;/header&gt;</code>
</pre>

<h3>Элемент <code>&lt;figure&gt;</code> — это не только картинки</h3>

<p>Другое распространённое заблуждение насчёт <code>&lt;figure&gt;</code> — что он может быть использован только для картинок. Это не так. Элемент <code>&lt;figure&gt;</code> может быть видео, аудио, графиком (на SVG, к примеру), цитатой, таблицей, блоком кода, фрагментом текста или любой комбинацией этих и многих других элементов. Не ограничивайте использование <code>&lt;figure&gt;</code> только картинками. Наша работа, как энтузиастов от веб-стандартов, заключается в том, чтобы максимально точно описывать содержимое при помощи разметки.</p>

<p>Некоторое время назад я <a href="http://html5doctor.com/figure">писал про <code>&lt;figure&gt;</code> детальнее</a>. Рекомендую почитать, если вам интересно узнать подробности или просто освежить знания.</p>

<h2>Не используйте ненужные атрибуты <code>type</code></h2>

<p>Эта проблема, пожалуй, является самой распространённой среди заявок в Галерею HTML5. И хотя это, по сути, не ошибка, мне кажется, что правильнее будет её избегать.</p>

<p>Дело в том, что в HTML5 не нужно добавлять атрибут <code>type</code> для элементов <code>&lt;script&gt;</code> и <code>&lt;style&gt;</code>. Если эти элементы автоматически добавляются вашей CMS, то избавиться от них может быть непросто, но если вы пишете код руками или полностью контролируете шаблоны, то нет никакого смысла писать избыточные атрибуты. Поскольку все браузеры ожидают, что скриптами будет JavaScript, а стилями CSS, вам это совсем не нужно:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;link type="text/css" rel="stylesheet" href="styles.css"&gt;</code>
	<code>&lt;script type="text/javascript" src="scripts"&gt;&lt;/script&gt;</code>
</pre>

<p>Вместо этого просто напишите:</p>

<pre>
	<code>&lt;link rel="stylesheet" href="styles.css"&gt;</code>
	<code>&lt;script src="scripts"&gt;&lt;/script&gt;</code>
</pre>

<p>Кроме того, вы можете уменьшить объём кода, который пишете для задания кодировки документа и других вещей. Глава про семантику в «<a href="http://diveintohtml5.org/semantics.html">Погружении в HTML5</a>» Марка Пилгрима объясняет всё.</p>

<h2>Неправильное использование атрибутов форм</h2>

<p>Вы, должно быть, знаете, что HTML5 предложил набор новых атрибутов для элементов форм. Мы расскажем о них подробнее в ближайшие месяцы, а пока я покажу вам некоторые вещи, которые делать не стоит.</p>

<h3>Одиночные атрибуты</h3>

<p>Некоторые новые атрибуты для элементов форм являются одиночными, и только одно их присутствие в разметке обеспечивает смену поведения. Эти атрибуты включают:</p>

<pre>
	<code>autofocus</code>
	<code>autocomplete</code>
	<code>required</code>
</pre>

<p>Надо признаться, я нечасто встречал подобное, но если в качестве примера взять атрибут <code>required</code>, то попадалось следующее:</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;input type="email" name="email" required="true"&gt;</code>
	<code>&lt;!-- Ещё один плохой пример --&gt;</code>
	<code>&lt;input type="email" name="email" required="1"&gt;</code>
</pre>

<p>В конечном счёте это никому не вредит. HTML-парсер видит атрибут <code>required</code> в разметке, поэтому требуемая функциональность будет включена. Но что, если поставить код вверх ногами и написать <code>required="false"</code>?</p>

<pre>
	<code>&lt;!-- Не копируйте этот код! Он неправильный! --&gt;</code>
	<code>&lt;input type="email" name="email" required="false"&gt;</code>
</pre>

<p>Парсер по-прежнему увидит атрибут <code>required</code> и применит поведение, несмотря на то, что вы пытались сказать ему не делать этого. Явно не то, что вам было нужно.</p>

<p>Существует три правильных способа задания одиночных атрибутов, второй и третий из которых нужны только если вы пишете XHTML:</p>

<pre>
	<code>required</code>
	<code>required=""</code>
	<code>required="required"</code>
</pre>

<p>Если применить эту запись к нашему примеру (в HTML), получится следующее:</p>

<pre>
	<code>&lt;input type="email" name="email" required&gt;</code>
</pre>

<h2>Резюме</h2>

<p>Было бы просто невозможным перечислить здесь все странные приёмы и образцы разметки, с которыми мне довелось столкнуться, но эти — одни из самых часто встречавшихся. А какие ещё ошибки разметки бросались вам в глаза? Расскажите в комментариях.</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/avoiding-common-html5-mistakes/">Avoiding common HTML5 mistakes</a>» <a href="http://richclarkdesign.com/">Ричарда Кларка</a> (Richard Clark), опубликованной на сайте <a href="http://html5doctor.com/">HTML5Doctor.com</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/avoiding-html5-mistakes/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Элементы small и hr</title>
		<link>http://web-standards.ru/articles/small-hr-elements/</link>
		<comments>http://web-standards.ru/articles/small-hr-elements/#comments</comments>
		<pubDate>Mon, 30 May 2011 06:55:52 +0000</pubDate>
		<dc:creator>Оли Стадхольм</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[семантика]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/small-hr-elements/</guid>
		<description><![CDATA[<p>Не так давно мы писали <a href="http://web-standards.ru/articles/i-b-em-strong-elements/">о презентационных элементах <code>&lt;i&gt;</code> и <code>&lt;b&gt;</code></a> из HTML4, возродившихся к новой семантической жизни. Другие два элемента, которые претерпели изменения, чтобы получить значения в HTML5 — это <code>&lt;small&gt;</code> и <code>&lt;hr&gt;</code>:</p>

<ul>
	<li><code>&lt;small&gt;</code> — использовался раньше для того, чтобы просто сделать текст помельче, теперь же он предназначен для пометок и небольших надписей (<a href="http://dev.w3.org/html5/markup/small.html">W3C:Markup</a>, <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-small-element">WHATWG</a>);</li>
	<li><code>&lt;hr&gt;</code> — использовался раньше для создания горизонтальных линеек, теперь предназначен для смысловой разбивки на уровне текстовых блоков (<a href="http://dev.w3.org/html5/markup/hr.html">W3C:Markup</a>, <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/grouping-content.html#the-hr-element">WHATWG</a>).</li>
</ul>

<h2>Элемент <code>&lt;small&gt;</code></h2>

<blockquote>
	<p>Элемент <code>&lt;small&gt;</code> представляет собой так называемые «надписи мелким шрифтом», вроде тех, что используются для предостережений и оговорок в юридических документах.</p>
	<p><a href="http://dev.w3.org/html5/markup/small.html">Спецификация W3C</a></p>
</blockquote>

<p>Теперь <code>&lt;small&gt;</code> применяется для пометок и является более локальным аналогом элемента <code>&lt;aside&gt;</code> — для второстепенной информации на странице. Типичным примером будет следующая за основным содержимым юридическая болтовня, вроде заявлений об авторском праве в подвале, отказе от ответственности, или же информации о лицензии. Он также может быть использован для указания авторства. <strong>Не используйте его для содержимого на блочном уровне</strong> (параграфы, списки и т.д.), иначе это будет воспринято как основное содержимое.</p>

<pre>
	<code>&lt;p&gt;</code>
	<code>    Я использую</code>
	<code>    &lt;span class="museo"&gt;Museo Slab&lt;/span&gt;,</code>
	<code>    &lt;small class="font-license"&gt;</code>
	<code>        шрифт Жоса Буйвенга (exljbris)</code>
	<code>        &lt;a href="http://www.exljbris.nl/"&gt;www.exljbris.nl&lt;/a&gt;</code>
	<code>    &lt;/small&gt;</code>
	<code>&lt;/p&gt;</code>
</pre>

<p class="note">Использование <code>&lt;small class="font-license"&gt;</code> для того, чтобы выполнить требования лицензионного соглашения</p>

<pre>
	<code>&lt;small&gt;</code>
	<code>    &lt;a href="http://creativecommons.org/licenses/by-sa/3.0/"</code>
	<code>        rel="license"&gt;</code>
	<code>        Creative Commons Attribution Share-alike license</code>
	<code>    &lt;/a&gt;</code>
	<code>&lt;/small&gt;</code>
</pre>

<p class="note">Использование <code>&lt;small&gt;</code> вокруг ссылки на <a href="http://creativecommons.org/choose/">Creative Commons license</a> с <code>rel="license"</code></p>

<p>Текст внутри <code>&lt;small&gt;</code> необязательно должен быть меньше, чем окружающий — если же вам нужен именно мелкий текст, то для этого лучше подойдет CSS. Используйте <code>&lt;small&gt;</code> только на строчном уровне. В конце концов, <code>&lt;small&gt;</code> не влияет на семантику <code>&lt;em&gt;</code> или <code>&lt;strong&gt;</code>.</p>

<h2>Элемент <code>&lt;hr&gt;</code></h2>

<blockquote>
	<p><code>&lt;hr&gt;</code> служит для смысловой разбивки на уровне блоков текста</p>
	<p><a href="http://dev.w3.org/html5/markup/hr.html">Спецификация W3C</a></p>
</blockquote>

<p>Пообщавшись с <a href="http://ian.hixie.ch/">Яном Хиксоном</a> (редактором HTML5) я понял, что до сих пор неправильно понимал <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/content-models.html#paragraph">модель поведения содержимого</a>. Я узнал, что <code>&lt;hr&gt;</code> на самом деле означает <q>конец одной секции и начало другой</q> — что семантически равносильно <code>&lt;/section&gt;&lt;section&gt;</code>. Но поскольку элементы вроде <code>&lt;section&gt;</code> и так указывают на это, получается, что <code>&lt;hr&gt;</code> больше подходит для смысловой разбивки, вроде смыслового разделения внутри блока текста или отделения одной сцены в романе от другой. В любом случае, вы можете использовать этот элемент везде, где вы используете элемент <code>&lt;p&gt;</code>. Из-за унылого вида в браузерах по умолчанию, <code>&lt;hr&gt;</code> не слишком распространён сегодня, однако это не мешает оформить его при помощи CSS в виде красивого вензеля.</p>

<p><img src="http://static.web-standards.ru/articles/small-hr-elements/hr-separator.png" alt="Оформление &lt;hr&gt; в виде вензеля" class="pic"></p>

<pre>
	<code>hr {</code>
	<code>    margin:3em 0;</code>
	<code>    height:24px;</code>
	<code>    border:0;</code>
	<code>    background:url(flourish.png) 50% 50% no-repeat;</code>
	<code>    }</code>
</pre>

<p class="note">Оформите <code>&lt;hr&gt;</code> красиво: уберите рамку, поля и добавьте фоновую картинку.</p>

<p>IE7 и младше оправдывают свою дурную репутацию, добавляя рамку вокруг изображения, несмотря на наши усилия, <a href="http://blog.neatlysliced.com/2008/03/hr-image-replacement/">но и это можно исправить</a>. Или же вы можете просто скрыть <code>&lt;hr&gt;</code> в стилях для IE7 и младше. Если переход между частями содержимого очевиден или разделение чисто визуальное, а не смысловое, то вместо <code>&lt;hr&gt;</code> лучше нарисовать рамку или фоновую картинку на другом элементе.</p>

<p><img src="http://static.web-standards.ru/articles/small-hr-elements/corkd.png" alt="Неподходящий случай для использования &lt;hr&gt; на Cork’d.com" class="pic"></p>

<p class="note">На <a href="http://content.corkd.com/">Cork’d</a> используеся декоративная фоновая картинка для заголовков. Но несмотря на обилие линеек, это совсем неподходящий случай для использования <code>&lt;hr&gt;</code>.</p>

<h2>В заключение</h2>

<p>В момент выхода HTML4, презентационные элементы <code>&lt;basefont&gt;</code>, <code>&lt;font&gt;</code>, <code>&lt;s&gt;</code>, <code>&lt;strike&gt;</code> и <code>&lt;u&gt;</code> уже были помечены как нежелательные для использования, в пользу применения CSS. HTML5 завершил этот процесс, избавившись от элементов <code>&lt;big&gt;</code> и <code>&lt;tt&gt;</code>.</p>

<p>Остальные презентационные элементы из HTML4 — долго игнорируемые <code>&lt;small&gt;</code> и <code>&lt;hr&gt;</code> (<a href="http://web-standards.ru/articles/i-b-em-strong-elements/">наряду с <code>&lt;i&gt;</code> и <code>&lt;b&gt;</code></a>) — были пересмотрены в HTML5 с учетом их полезных, медиа-независимых семантических свойств, которые имеют отношение к их типичному использованию. Будете ли <em>вы</em> использовать их? Выскажитесь в комментариях!</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/small-hr-element/">The small &amp; hr elements</a>» <a href="http://oli.jp/">Оли Стадхольма</a> (Oli Studholme), опубликованной на сайте <a href="http://html5doctor.com/">HTML5Doctor.com</a>.</p>]]></description>
			<content:encoded><![CDATA[<p>Не так давно мы писали <a href="http://web-standards.ru/articles/i-b-em-strong-elements/">о презентационных элементах <code>&lt;i&gt;</code> и <code>&lt;b&gt;</code></a> из HTML4, возродившихся к новой семантической жизни. Другие два элемента, которые претерпели изменения, чтобы получить значения в HTML5 — это <code>&lt;small&gt;</code> и <code>&lt;hr&gt;</code>:</p>

<ul>
	<li><code>&lt;small&gt;</code> — использовался раньше для того, чтобы просто сделать текст помельче, теперь же он предназначен для пометок и небольших надписей (<a href="http://dev.w3.org/html5/markup/small.html">W3C:Markup</a>, <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/text-level-semantics.html#the-small-element">WHATWG</a>);</li>
	<li><code>&lt;hr&gt;</code> — использовался раньше для создания горизонтальных линеек, теперь предназначен для смысловой разбивки на уровне текстовых блоков (<a href="http://dev.w3.org/html5/markup/hr.html">W3C:Markup</a>, <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/grouping-content.html#the-hr-element">WHATWG</a>).</li>
</ul>

<h2>Элемент <code>&lt;small&gt;</code></h2>

<blockquote>
	<p>Элемент <code>&lt;small&gt;</code> представляет собой так называемые «надписи мелким шрифтом», вроде тех, что используются для предостережений и оговорок в юридических документах.</p>
	<p><a href="http://dev.w3.org/html5/markup/small.html">Спецификация W3C</a></p>
</blockquote>

<p>Теперь <code>&lt;small&gt;</code> применяется для пометок и является более локальным аналогом элемента <code>&lt;aside&gt;</code> — для второстепенной информации на странице. Типичным примером будет следующая за основным содержимым юридическая болтовня, вроде заявлений об авторском праве в подвале, отказе от ответственности, или же информации о лицензии. Он также может быть использован для указания авторства. <strong>Не используйте его для содержимого на блочном уровне</strong> (параграфы, списки и т.д.), иначе это будет воспринято как основное содержимое.</p>

<pre>
	<code>&lt;p&gt;</code>
	<code>    Я использую</code>
	<code>    &lt;span class="museo"&gt;Museo Slab&lt;/span&gt;,</code>
	<code>    &lt;small class="font-license"&gt;</code>
	<code>        шрифт Жоса Буйвенга (exljbris)</code>
	<code>        &lt;a href="http://www.exljbris.nl/"&gt;www.exljbris.nl&lt;/a&gt;</code>
	<code>    &lt;/small&gt;</code>
	<code>&lt;/p&gt;</code>
</pre>

<p class="note">Использование <code>&lt;small class="font-license"&gt;</code> для того, чтобы выполнить требования лицензионного соглашения</p>

<pre>
	<code>&lt;small&gt;</code>
	<code>    &lt;a href="http://creativecommons.org/licenses/by-sa/3.0/"</code>
	<code>        rel="license"&gt;</code>
	<code>        Creative Commons Attribution Share-alike license</code>
	<code>    &lt;/a&gt;</code>
	<code>&lt;/small&gt;</code>
</pre>

<p class="note">Использование <code>&lt;small&gt;</code> вокруг ссылки на <a href="http://creativecommons.org/choose/">Creative Commons license</a> с <code>rel="license"</code></p>

<p>Текст внутри <code>&lt;small&gt;</code> необязательно должен быть меньше, чем окружающий — если же вам нужен именно мелкий текст, то для этого лучше подойдет CSS. Используйте <code>&lt;small&gt;</code> только на строчном уровне. В конце концов, <code>&lt;small&gt;</code> не влияет на семантику <code>&lt;em&gt;</code> или <code>&lt;strong&gt;</code>.</p>

<h2>Элемент <code>&lt;hr&gt;</code></h2>

<blockquote>
	<p><code>&lt;hr&gt;</code> служит для смысловой разбивки на уровне блоков текста</p>
	<p><a href="http://dev.w3.org/html5/markup/hr.html">Спецификация W3C</a></p>
</blockquote>

<p>Пообщавшись с <a href="http://ian.hixie.ch/">Яном Хиксоном</a> (редактором HTML5) я понял, что до сих пор неправильно понимал <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/content-models.html#paragraph">модель поведения содержимого</a>. Я узнал, что <code>&lt;hr&gt;</code> на самом деле означает <q>конец одной секции и начало другой</q> — что семантически равносильно <code>&lt;/section&gt;&lt;section&gt;</code>. Но поскольку элементы вроде <code>&lt;section&gt;</code> и так указывают на это, получается, что <code>&lt;hr&gt;</code> больше подходит для смысловой разбивки, вроде смыслового разделения внутри блока текста или отделения одной сцены в романе от другой. В любом случае, вы можете использовать этот элемент везде, где вы используете элемент <code>&lt;p&gt;</code>. Из-за унылого вида в браузерах по умолчанию, <code>&lt;hr&gt;</code> не слишком распространён сегодня, однако это не мешает оформить его при помощи CSS в виде красивого вензеля.</p>

<p><img src="http://static.web-standards.ru/articles/small-hr-elements/hr-separator.png" alt="Оформление &lt;hr&gt; в виде вензеля" class="pic"></p>

<pre>
	<code>hr {</code>
	<code>    margin:3em 0;</code>
	<code>    height:24px;</code>
	<code>    border:0;</code>
	<code>    background:url(flourish.png) 50% 50% no-repeat;</code>
	<code>    }</code>
</pre>

<p class="note">Оформите <code>&lt;hr&gt;</code> красиво: уберите рамку, поля и добавьте фоновую картинку.</p>

<p>IE7 и младше оправдывают свою дурную репутацию, добавляя рамку вокруг изображения, несмотря на наши усилия, <a href="http://blog.neatlysliced.com/2008/03/hr-image-replacement/">но и это можно исправить</a>. Или же вы можете просто скрыть <code>&lt;hr&gt;</code> в стилях для IE7 и младше. Если переход между частями содержимого очевиден или разделение чисто визуальное, а не смысловое, то вместо <code>&lt;hr&gt;</code> лучше нарисовать рамку или фоновую картинку на другом элементе.</p>

<p><img src="http://static.web-standards.ru/articles/small-hr-elements/corkd.png" alt="Неподходящий случай для использования &lt;hr&gt; на Cork’d.com" class="pic"></p>

<p class="note">На <a href="http://content.corkd.com/">Cork’d</a> используеся декоративная фоновая картинка для заголовков. Но несмотря на обилие линеек, это совсем неподходящий случай для использования <code>&lt;hr&gt;</code>.</p>

<h2>В заключение</h2>

<p>В момент выхода HTML4, презентационные элементы <code>&lt;basefont&gt;</code>, <code>&lt;font&gt;</code>, <code>&lt;s&gt;</code>, <code>&lt;strike&gt;</code> и <code>&lt;u&gt;</code> уже были помечены как нежелательные для использования, в пользу применения CSS. HTML5 завершил этот процесс, избавившись от элементов <code>&lt;big&gt;</code> и <code>&lt;tt&gt;</code>.</p>

<p>Остальные презентационные элементы из HTML4 — долго игнорируемые <code>&lt;small&gt;</code> и <code>&lt;hr&gt;</code> (<a href="http://web-standards.ru/articles/i-b-em-strong-elements/">наряду с <code>&lt;i&gt;</code> и <code>&lt;b&gt;</code></a>) — были пересмотрены в HTML5 с учетом их полезных, медиа-независимых семантических свойств, которые имеют отношение к их типичному использованию. Будете ли <em>вы</em> использовать их? Выскажитесь в комментариях!</p>

<p class="note note-last">Перевод оригинальной статьи «<a href="http://html5doctor.com/small-hr-element/">The small &amp; hr elements</a>» <a href="http://oli.jp/">Оли Стадхольма</a> (Oli Studholme), опубликованной на сайте <a href="http://html5doctor.com/">HTML5Doctor.com</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/small-hr-elements/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Нюансы CSS</title>
		<link>http://web-standards.ru/articles/css-nuances/</link>
		<comments>http://web-standards.ru/articles/css-nuances/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 10:52:17 +0000</pubDate>
		<dc:creator>Лев Солнцев</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[вёрстка]]></category>
		<category><![CDATA[методика]]></category>

		<guid isPermaLink="false">http://web-standards.ru/articles/css-nuances/</guid>
		<description><![CDATA[<p>Многие используют CSS для оформления сайтов и веб-страниц, знают основные приёмы вёрстки, а если и нет, то быстро найдут решение в интернете, или им подскажут в тематических сообществах. Тем не менее многие широко используемые решения не оптимальны, и если ознакомиться со спецификациями чуть глубже, можно написать лучший код.</p>
<p>К примеру многие знают, что цвет в шестнадцатеричной нотации вида <code>#RRGGBB</code> можно писать сокращённо как <code>#RGB</code>, если каждый старший разряд совпадает с младшим, или что нуль можно писать без единиц измерения, таких как «px» или «em», так как нуль — в любой системе измерения нуль.</p>

<h2>Что считает браузер</h2>
<p>Также широко известно, что можно отцентрировать блок с шириной меньше родительского элемента при помощи <code>margin:0 auto</code>. Однако мало кто задумывается, что почти во всех случаях дело касается непозиционированных элементов, и в этом случае значение <code>margin-top:auto</code> или <code>margin-bottom:auto</code> устанавливается равным нулю, а значит данное правило можно сократить до простого <code>margin:auto</code>.</p>
<p>Правила <code>margin-left:auto</code> и <code>margin-right:auto</code> при ширине блока меньше ширины контейнера равномерно распределяют оставшееся место. Так, задав только <code>margin-left:auto</code>, можно выровнять элемент по правому краю.</p>
<p>В обычном потоке элементы идут сверху вниз, поэтому <code>margin-top:auto</code> устанавливается нулевым. Однако для абсолютно спозиционированных элементов действует то же распределение свободного места, и аналогичным образом можно сделать <a href="http://test.csswg.org/suites/css2.1/20110111/html4/absolute-non-replaced-height-003.htm">центрирование по вертикали</a> при заданных высоте и <code>top</code> с <code>bottom</code> (не работает в IE7).</p>

<h2>Сокращения и значения по умолчанию</h2>
<p>Не менее широко распространено использование спрайтов, например: <code>background:url(icons.png) 0 0 no-repeat</code>. Однако, <code>background-position:0 0</code> является значением по умолчанию, поэтому <code>0 0</code> в таком случае можно опустить.</p>
<p>Но если в <code>background-position</code> задана хоть одна координата: будь то <code>top</code>, <code>left</code> или <code>100%</code>, то вторая принимает значение 50%. Это может быть полезно для значков, выровненных посередине строки по вертикали — достаточно указать лишь положение слева или справа.</p>
<p>Не все знают, что опущенные в сокращённой записи правила принимают своё значение по умолчанию. Поэтому уточняющие правила надо писать после или делать сильнее общей сокращённой надписи, как <code>background-position</code> уточняет положение каждого спрайта после <code>background</code> в предыдущем примере.</p>
<p>При подобном написании:</p>

<pre>
	<code>h1 {</code>
	<code>    font:2em/1 Arial,sans-serif;</code>
	<code>}</code>
</pre>

<p>задаётся не только шрифт, его размер и интерлиньяж, но и сразу сбрасывается полужирное написание (<code>font-weight:normal</code>), а также другие свойства, такие как <code>font-style</code> (курсив) и <code>font-variant</code> (капитель). Некоторые авторы совершенно зря дописывают в <code>font</code> значение <code>normal</code>. Непонятно даже к какому правилу из перечисленных трёх оно могло бы относиться — порядок следования в сокращённых свойствах неважен, и неучитывание порядка могло приводить к ошибкам лишь в устаревших браузерах.</p>
<p>Другими недопонятыми, но тоже полезными сокращёнными записями являются отдельные правила рамок <code>border-width</code>, <code>border-style</code> и <code>border-color</code>. Например, благодаря им можно задать верхнюю и нижнюю одинаковые рамки не дублированием кода в <code>border-top</code> и в <code>border-bottom</code>, а подобным образом:</p>

<pre>
	<code>border:solid gray;</code>
	<code>border-width:3px 0;</code>
</pre>

<p>Кроме меньшего размера кода, такая запись полезна тем, что каждое значение написано только один раз, и поменять, скажем, <code>solid</code> на <code>double</code> не составляет труда.</p>
<p>Более того, если будет использоваться <code>border-image</code>, то здесь явно задано, что размер боковых рамок нулевой. В противном случае <code>border-image</code> приводит к неявному появлению рамок, что может дать неожиданный эффект в углах.</p>
<p>Есть возможность, что <code>border-radius</code> может быть включен в сокращённую запись <code>border</code> (предлагался вариант с косой чертой «/»), поэтому записывайте на всякий случай <code>border-radius</code> после <code>border</code>.</p>

<h2>Переусложенение</h2>
<p>Часто, чтобы избавиться от рамки на картинке внутри ссылки, пишут:</p>

<pre>
	<code>a img {</code>
	<code>    border:0;</code>
	<code>}</code>
</pre>

<p>Однако в таком случае бразуер будет на каждой картинке проверять, не находится ли она в ссылке. Если для простых страниц это кажется несущественным (вы и глазом моргнуть не успеете за те несколько миллисекунд, на которое задержится отображение страницы), то в какой-нибудь фотогалерее со сложной анимацией это может лишить вас нескольких кадров в секунду, прибавляя ощущения «тормознутости». Куда проще написать так:</p>

<pre>
	<code>img {</code>
	<code>    border:0;</code>
	<code>}</code>
</pre>

<p>Эффект будет тот же самый. Уточнение, что рамка появляется на ссылках <code>a</code> в данном случае совершенно излишне.</p>
<p>Из тех же соображений производительности, как правило, незачем писать имя тэга вместе с классом и уж тем более с идентификатором, который сам по себе уникален. В данном правиле могут быть только два исключения: уточнение для конкретного тэга (возможно в этом случае у вас очень общий класс), и обход недостатка IE7, где эффекты при наведении <code>:hover</code> тормозят, если в селекторе не указан тэг (то есть надо писать <code>a.class:hover { color:#FC0; }</code>).</p>

<h2>Наследование</h2>
<p>Ещё одна недооценённая многими возможность CSS: наследование стилей. Например, может не устраивать, что по умолчанию содержимое ячеек таблиц центрируется по вертикали, при этом используются следующие правила:</p>

<pre>
	<code>th {</code>
	<code>    vertical-align:bottom;</code>
	<code>}</code>
	<code>td {</code>
	<code>    vertical-align:top;</code>
	<code>}</code>
</pre>

<p>Вроде бы всё здорово, но, сделав так, вы лишаетесь простого способа переопределить выравнивание для целого ряда:</p>

<pre>
	<code>tr.images {</code>
	<code>    vertical-align:middle;</code>
	<code>}</code>
</pre>

<p>Этого можно избежать, воспользовавшись тем, что ячейки таблицы <code>th</code> и <code>td</code> наследуют правила от рядов <code>tr</code>, а те в свою очередь от блоков <code>thead</code>, <code>tfoot</code> и <code>tbody</code>.</p>

<pre>
	<code>thead {</code>
	<code>    vertical-align:bottom;</code>
	<code>}</code>
	<code>tbody,</code>
	<code>tfoot {</code>
	<code>    vertical-align:top;</code>
	<code>}</code>
</pre>

<p>Стоит отметить, что все браузеры, кроме IE8, наследуют еще и значение <code>text-align</code> для <code>th</code>, а сам IE8 понимет ключевое слово <code>inherit</code>, что также позволяет наследовать значение <code>text-align</code>.</p>

<h2>Заключение</h2>
<p>Знание основ спецификаций, понимание механизмов работы браузеров и выполняемых действий позволяет оптимизировать написание кода, упростить его, сделать лаконичней, а также упростить дальшейшую разработку и поддержку.</p>]]></description>
			<content:encoded><![CDATA[<p>Многие используют CSS для оформления сайтов и веб-страниц, знают основные приёмы вёрстки, а если и нет, то быстро найдут решение в интернете, или им подскажут в тематических сообществах. Тем не менее многие широко используемые решения не оптимальны, и если ознакомиться со спецификациями чуть глубже, можно написать лучший код.</p>
<p>К примеру многие знают, что цвет в шестнадцатеричной нотации вида <code>#RRGGBB</code> можно писать сокращённо как <code>#RGB</code>, если каждый старший разряд совпадает с младшим, или что нуль можно писать без единиц измерения, таких как «px» или «em», так как нуль — в любой системе измерения нуль.</p>

<h2>Что считает браузер</h2>
<p>Также широко известно, что можно отцентрировать блок с шириной меньше родительского элемента при помощи <code>margin:0 auto</code>. Однако мало кто задумывается, что почти во всех случаях дело касается непозиционированных элементов, и в этом случае значение <code>margin-top:auto</code> или <code>margin-bottom:auto</code> устанавливается равным нулю, а значит данное правило можно сократить до простого <code>margin:auto</code>.</p>
<p>Правила <code>margin-left:auto</code> и <code>margin-right:auto</code> при ширине блока меньше ширины контейнера равномерно распределяют оставшееся место. Так, задав только <code>margin-left:auto</code>, можно выровнять элемент по правому краю.</p>
<p>В обычном потоке элементы идут сверху вниз, поэтому <code>margin-top:auto</code> устанавливается нулевым. Однако для абсолютно спозиционированных элементов действует то же распределение свободного места, и аналогичным образом можно сделать <a href="http://test.csswg.org/suites/css2.1/20110111/html4/absolute-non-replaced-height-003.htm">центрирование по вертикали</a> при заданных высоте и <code>top</code> с <code>bottom</code> (не работает в IE7).</p>

<h2>Сокращения и значения по умолчанию</h2>
<p>Не менее широко распространено использование спрайтов, например: <code>background:url(icons.png) 0 0 no-repeat</code>. Однако, <code>background-position:0 0</code> является значением по умолчанию, поэтому <code>0 0</code> в таком случае можно опустить.</p>
<p>Но если в <code>background-position</code> задана хоть одна координата: будь то <code>top</code>, <code>left</code> или <code>100%</code>, то вторая принимает значение 50%. Это может быть полезно для значков, выровненных посередине строки по вертикали — достаточно указать лишь положение слева или справа.</p>
<p>Не все знают, что опущенные в сокращённой записи правила принимают своё значение по умолчанию. Поэтому уточняющие правила надо писать после или делать сильнее общей сокращённой надписи, как <code>background-position</code> уточняет положение каждого спрайта после <code>background</code> в предыдущем примере.</p>
<p>При подобном написании:</p>

<pre>
	<code>h1 {</code>
	<code>    font:2em/1 Arial,sans-serif;</code>
	<code>}</code>
</pre>

<p>задаётся не только шрифт, его размер и интерлиньяж, но и сразу сбрасывается полужирное написание (<code>font-weight:normal</code>), а также другие свойства, такие как <code>font-style</code> (курсив) и <code>font-variant</code> (капитель). Некоторые авторы совершенно зря дописывают в <code>font</code> значение <code>normal</code>. Непонятно даже к какому правилу из перечисленных трёх оно могло бы относиться — порядок следования в сокращённых свойствах неважен, и неучитывание порядка могло приводить к ошибкам лишь в устаревших браузерах.</p>
<p>Другими недопонятыми, но тоже полезными сокращёнными записями являются отдельные правила рамок <code>border-width</code>, <code>border-style</code> и <code>border-color</code>. Например, благодаря им можно задать верхнюю и нижнюю одинаковые рамки не дублированием кода в <code>border-top</code> и в <code>border-bottom</code>, а подобным образом:</p>

<pre>
	<code>border:solid gray;</code>
	<code>border-width:3px 0;</code>
</pre>

<p>Кроме меньшего размера кода, такая запись полезна тем, что каждое значение написано только один раз, и поменять, скажем, <code>solid</code> на <code>double</code> не составляет труда.</p>
<p>Более того, если будет использоваться <code>border-image</code>, то здесь явно задано, что размер боковых рамок нулевой. В противном случае <code>border-image</code> приводит к неявному появлению рамок, что может дать неожиданный эффект в углах.</p>
<p>Есть возможность, что <code>border-radius</code> может быть включен в сокращённую запись <code>border</code> (предлагался вариант с косой чертой «/»), поэтому записывайте на всякий случай <code>border-radius</code> после <code>border</code>.</p>

<h2>Переусложенение</h2>
<p>Часто, чтобы избавиться от рамки на картинке внутри ссылки, пишут:</p>

<pre>
	<code>a img {</code>
	<code>    border:0;</code>
	<code>}</code>
</pre>

<p>Однако в таком случае бразуер будет на каждой картинке проверять, не находится ли она в ссылке. Если для простых страниц это кажется несущественным (вы и глазом моргнуть не успеете за те несколько миллисекунд, на которое задержится отображение страницы), то в какой-нибудь фотогалерее со сложной анимацией это может лишить вас нескольких кадров в секунду, прибавляя ощущения «тормознутости». Куда проще написать так:</p>

<pre>
	<code>img {</code>
	<code>    border:0;</code>
	<code>}</code>
</pre>

<p>Эффект будет тот же самый. Уточнение, что рамка появляется на ссылках <code>a</code> в данном случае совершенно излишне.</p>
<p>Из тех же соображений производительности, как правило, незачем писать имя тэга вместе с классом и уж тем более с идентификатором, который сам по себе уникален. В данном правиле могут быть только два исключения: уточнение для конкретного тэга (возможно в этом случае у вас очень общий класс), и обход недостатка IE7, где эффекты при наведении <code>:hover</code> тормозят, если в селекторе не указан тэг (то есть надо писать <code>a.class:hover { color:#FC0; }</code>).</p>

<h2>Наследование</h2>
<p>Ещё одна недооценённая многими возможность CSS: наследование стилей. Например, может не устраивать, что по умолчанию содержимое ячеек таблиц центрируется по вертикали, при этом используются следующие правила:</p>

<pre>
	<code>th {</code>
	<code>    vertical-align:bottom;</code>
	<code>}</code>
	<code>td {</code>
	<code>    vertical-align:top;</code>
	<code>}</code>
</pre>

<p>Вроде бы всё здорово, но, сделав так, вы лишаетесь простого способа переопределить выравнивание для целого ряда:</p>

<pre>
	<code>tr.images {</code>
	<code>    vertical-align:middle;</code>
	<code>}</code>
</pre>

<p>Этого можно избежать, воспользовавшись тем, что ячейки таблицы <code>th</code> и <code>td</code> наследуют правила от рядов <code>tr</code>, а те в свою очередь от блоков <code>thead</code>, <code>tfoot</code> и <code>tbody</code>.</p>

<pre>
	<code>thead {</code>
	<code>    vertical-align:bottom;</code>
	<code>}</code>
	<code>tbody,</code>
	<code>tfoot {</code>
	<code>    vertical-align:top;</code>
	<code>}</code>
</pre>

<p>Стоит отметить, что все браузеры, кроме IE8, наследуют еще и значение <code>text-align</code> для <code>th</code>, а сам IE8 понимет ключевое слово <code>inherit</code>, что также позволяет наследовать значение <code>text-align</code>.</p>

<h2>Заключение</h2>
<p>Знание основ спецификаций, понимание механизмов работы браузеров и выполняемых действий позволяет оптимизировать написание кода, упростить его, сделать лаконичней, а также упростить дальшейшую разработку и поддержку.</p>]]></content:encoded>
			<wfw:commentRss>http://web-standards.ru/articles/css-nuances/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

