<?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>Ксдыщь!</title>
	<atom:link href="http://flack.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://flack.ru</link>
	<description>Вебдев и всякая фигня</description>
	<lastBuildDate>Mon, 06 Apr 2009 16:47:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Всё меняется</title>
		<link>http://flack.ru/2008/11/18/evrth-changes/</link>
		<comments>http://flack.ru/2008/11/18/evrth-changes/#comments</comments>
		<pubDate>Tue, 18 Nov 2008 11:13:21 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[-1]]></category>

		<guid isPermaLink="false">http://flack.ru/2008/11/18/evrth-changes/</guid>
		<description><![CDATA[С момента рассказа про пять инструментов произошли, прямо скажем, кардинальные изменения. В целях успокоения совести коротко о новом списке.

Windows XP SP3
EditPlus 2.31
TopStyle 3.12
putty
Adobe Photoshop Elements 6.0

Возвращение к корням, ткскть. К табличной верстке тоже, да. А вообще html/css заебал уже, хуета занудная.
Ну и напоследок: макинтош дерьмо, маккеган круче пасториуса, широкова нахер. Всем привет.
]]></description>
			<content:encoded><![CDATA[<p>С момента рассказа про <a href="http://flack.ru/2008/02/29/5-tools/">пять инструментов</a> произошли, прямо скажем, кардинальные изменения. В целях успокоения совести коротко о новом списке.</p>
<ol>
<li>Windows XP SP3</li>
<li>EditPlus 2.31</li>
<li>TopStyle 3.12</li>
<li>putty</li>
<li>Adobe Photoshop Elements 6.0</li>
</ol>
<p>Возвращение к корням, ткскть. К табличной верстке тоже, да. А вообще html/css заебал уже, хуета занудная.</p>
<p>Ну и напоследок: макинтош дерьмо, маккеган круче пасториуса, широкова нахер. Всем привет.</p>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2008/11/18/evrth-changes/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Семантическая верстка — советы и решения. Часть VIII. Минимальные и максимальные размеры</title>
		<link>http://flack.ru/2008/08/26/semantic-coding-howto-8/</link>
		<comments>http://flack.ru/2008/08/26/semantic-coding-howto-8/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 11:33:22 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[Рецептарий]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[max-width]]></category>
		<category><![CDATA[min-width]]></category>

		<guid isPermaLink="false">http://flack.ru/2008/08/26/semantic-coding-howto-8/</guid>
		<description><![CDATA[min-height
В спецификации CSS предусмотрены правила min-width/min-height и max-width/max-height. К сожалению, Internet Explorer поддерживает эти правила только начиная с седьмой версии. Однако, это ограничение можно обойти.
Свойство min-height позволяет указать минимальную высоту для элемента. Если высота содержимого элемента окажется меньше его высоты, заданной правилом min-height, то высота элемента будет установлена на основании значения правила min-height. В противном [...]]]></description>
			<content:encoded><![CDATA[<h4>min-height</h4>
<p>В спецификации CSS предусмотрены правила min-width/min-height и max-width/max-height. К сожалению, Internet Explorer поддерживает эти правила только начиная с седьмой версии. Однако, это ограничение можно обойти.<span id="more-127"></span></p>
<p>Свойство min-height позволяет указать минимальную высоту для элемента. Если высота содержимого элемента окажется меньше его высоты, заданной правилом min-height, то высота элемента будет установлена на основании значения правила min-height. В противном случае блок растянется по своему содержимому.</p>
<p><strong>style.css:</strong></p>
<pre><code>#element {
    min-height:300px;
    }</code></pre>
<p>Как говорилось выше, В IE это будет работать только в седьмой версии. К счастью, в IE есть баг в обработке правила height. По сути, height ведет себя так же как и min-height, именно на этом основан наш workaround. Обратите внимание, что мы используем «star html hack», чтобы не задавать значение height для IE 7.</p>
<p><strong>ie.css:</strong></p>
<pre><code>* HTML #element {
    height:300px;
    }</code></pre>
<p>Обращу ваше внимание, что при использовании height для эмуляции min-height, overflow:hidden использовать нельзя, иначе в IE height начнет работать так же, как и в нормальных браузерах.</p>
<h4>min-width, max-width</h4>
<p>С эмуляцией минимальной и максимальной ширины все несколько сложнее. Для этого понадобится использовать IE-only правило expression (NB: это свойство не является валидным по текущему стандарту CSS и должно использоваться через conditional comments).</p>
<p>Хитрость в том, что внутри expression мы можем выполнять JavaScript.</p>
<pre><code>#element {
    width:expression(some javascript goes here);
    }</code></pre>
<p>Для задания минимальной ширины используем следующий expression:</p>
<p><strong>ie.css:</strong></p>
<pre><code>* HTML #element {
    width:expression((document.body.clientWidth||document.documentElement.clientWidth)  &gt; 760 ? 'auto' : '760px');
    }</code></pre>
<p>Для минимальной и максимальной ширины одновременно:</p>
<p><strong>ie.css:</strong></p>
<pre><code>* HTML #element {
    width:expression(document.body.clientWidth&lt;=760?'760px':(document.body.clientWidth&gt;1100?'1100px':'100%'));
    }</code></pre>
<p>Данные правила, естественно, не будут работать у пользователей с отключенным JavaScript.</p>
<p><strong>Материалы к изучению:</strong></p>
<ul>
<li><a href="http://cssing.org.ua/2005/09/02/min-width-for-ie/">min-width для IE</a></li>
<li><a href="http://xhtml.ru/2005/06/11/max-width/">max-width в Internet Explorer</a></li>
<li><a href="http://cssplay.co.uk/boxes/minwidth.html">min-width for Internet Explorer without Java Script?</a></li>
<li><a href="http://lusever.livejournal.com/15868.html">Тонкий CSS для Internet Explorer (expression)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2008/08/26/semantic-coding-howto-8/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Семантическая верстка — советы и решения. Часть VII. Прижимаем подвал к низу окна</title>
		<link>http://flack.ru/2008/08/26/semantic-coding-howto-7/</link>
		<comments>http://flack.ru/2008/08/26/semantic-coding-howto-7/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 11:21:45 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[Рецептарий]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[footer]]></category>
		<category><![CDATA[подвал]]></category>

		<guid isPermaLink="false">http://flack.ru/2008/08/26/semantic-coding-howto-7/</guid>
		<description><![CDATA[Хоть прибитый «футер» на страницах и считается пережитком табличного подхода, такая задача тем не менее возникает регулярно. Существует решение данной проблемы без таблиц, но при условии, что вы знаете высоту футера или способны при ее изменении исправить стили.
Авторство данного метода принадлежит Кэмерону Адамсу (Cameron Adams). Благодаря приведенной технике вы можете прижать ваш подвал к низу [...]]]></description>
			<content:encoded><![CDATA[<p>Хоть прибитый «футер» на страницах и считается пережитком табличного подхода, такая задача тем не менее возникает регулярно. Существует решение данной проблемы без таблиц, но при условии, что вы знаете высоту футера или способны при ее изменении исправить стили.<span id="more-126"></span></p>
<p>Авторство данного метода принадлежит Кэмерону Адамсу (Cameron Adams). Благодаря приведенной технике вы можете прижать ваш подвал к низу страницу при малом размере контента и сохранить нормальное положение вещей, когда контент требует вертикальной прокрутки.</p>
<pre><code>&lt;div id="header-content"&gt;
    &lt;div id="header"&gt;
        Шапка сайта
    &lt;/div&gt;
    &lt;div id="content"&gt;
        Основная контентная часть
    &lt;/div&gt;
&lt;/div&gt;
&lt;div id="footer"&gt;
    Подвал
&lt;/div&gt;</code></pre>
<p>Обратите внимание, что вся разметка макета, кроме подвала, должна быть заключена в контейнер, в данном случае div#header-content.</p>
<p><strong>style.css:</strong></p>
<pre><code>html,
body {
    height:100%; /* Растягиваем документ на всю высоту окна */
    }
#header-content {
    position:relative;
    min-height:100%; /* Минимальная высота основной части макета */
    }
#content {
    padding-bottom:3em; /* Пространство необходимое, чтобы подвал не залезал на основную часть при большом количестве контента */
    }
#footer {
    position:relative;
    height:3em; /* Высота подвала, указывать необязательно, но полезно при разработке */
    margin:-3em 0 0; /* Поднимаем футер наверх */
    }</code></pre>
<p><strong>ie.css:</strong></p>
<pre><code>* HTML #header-content {
    height:100%; /* Эмулируем min-height для IE &lt;7 */
    }</code></pre>
<p><strong>Материалы для изучения:</strong></p>
<ul>
<li><a href="http://www.themaninblue.com/writing/perspective/2005/08/29/">footerStickAlt: A more robust method of positioning a footer</a></li>
<li><a href="http://solardreamstudios.com/learn/css/footerstick/">footerStick</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2008/08/26/semantic-coding-howto-7/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Семантическая верстка — советы и решения. Часть VI. Запрет на обтекание float’ов</title>
		<link>http://flack.ru/2008/08/26/semantic-coding-howto-6/</link>
		<comments>http://flack.ru/2008/08/26/semantic-coding-howto-6/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 11:15:53 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[Рецептарий]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[float]]></category>
		<category><![CDATA[веб-стандарты]]></category>
		<category><![CDATA[запрет обтекания]]></category>

		<guid isPermaLink="false">http://flack.ru/2008/08/26/semantic-coding-howto-6/</guid>
		<description><![CDATA[На данном примере мы рассмотрим, как реализовать запрет на обтекание определенного элемента, к которому применено правило float. Нашей задачей является создание анонса новости. Макет выглядит следующим образом:

Поскольку мы уже сошлись на отказе от таблиц в пользу семантики, нам потребуется минимум html-кода:
&#60;div class="announce"&#62;
    &#60;img src="pic.gif" alt="" /&#62;
    &#60;h2&#62;&#60;a href="#"&#62;Россияне помогли&#60;/a&#62;&#60;/h2&#62;
 [...]]]></description>
			<content:encoded><![CDATA[<p>На данном примере мы рассмотрим, как реализовать запрет на обтекание определенного элемента, к которому применено правило float. Нашей задачей является создание анонса новости. <span id="more-124"></span>Макет выглядит следующим образом:</p>
<p><img src="/wp-content/uploads/2008/08/image010.gif" alt="image010.gif" /></p>
<p>Поскольку мы уже сошлись на отказе от таблиц в пользу семантики, нам потребуется минимум html-кода:</p>
<pre><code>&lt;div class="announce"&gt;
    &lt;img src="pic.gif" alt="" /&gt;
    &lt;h2&gt;&lt;a href="#"&gt;Россияне помогли&lt;/a&gt;&lt;/h2&gt;
    &lt;p&gt;Полиция турецкого города Измир сообщила об аресте 17 участников группировки, занимавшейся мошенничеством и рассылкой вирусов в Сети.
     Арест произошел после того, как местные полицейские выяснили, что трое русских хакеров отправили в общей сложности миллион писем с
     вирусами и получили доступ к банковским счетам многих жителей Турции.&lt;/p&gt;
&lt;/div&gt;</code></pre>
<p>Зададим картинке float, чтобы прижать ее налево и соответствующие макету поля:</p>
<pre><code>.announce img {
    float:left;
    margin:0 10px 10px 0;
    }</code></pre>
<p>К сожалению, текст обтекает картинку, а это совсем не то, что нам требуется по условию задачи. Чтобы запретить обтекание применим дополнительные стили к тексту:<br />
<strong>style.css:</strong></p>
<pre><code>.announce p {
    overflow:hidden;
    }</code></pre>
<p><strong>ie.css:</strong></p>
<pre><code>.announce p {
    zoom:1; /* Для IE 7 */
   }
   * HTML .announce p {
        height:1%; /* Для IE 5,6 */
        }</code></pre>
<p>Voila!</p>
<p class="note">Внимательный читатель безусловно заметит, что для реализации задачи мы воспользовались правилами, указывающими Explorer’у на hasLayout. Таким образов еще раз показав их полезность.</p>
<p><strong>Материалы для изучения:</strong></p>
<ul>
<li><a href="http://cssing.org.ua/2005/07/03/display-table/">display:table</a></li>
<li><a href="http://www.pupinc.com/files/test/float.html">Pup&#8217;s Box Flow Hack</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2008/08/26/semantic-coding-howto-6/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>5 инструментов</title>
		<link>http://flack.ru/2008/02/29/5-tools/</link>
		<comments>http://flack.ru/2008/02/29/5-tools/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 22:41:08 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[komodo]]></category>
		<category><![CDATA[meld]]></category>
		<category><![CDATA[photoshop]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://flack.ru/2008/02/29/5-tools/</guid>
		<description><![CDATA[Принимаю эстафету у Ивана Сагалаева.
Пять инструментов, чаще всего используемых в работе. Скриншоты правда с домашней машины.


Ubuntu. Тут, в общем, без вариантов. Я частенько ругаю убунтятину за работу с самбой, но в целом понимаю, что на тот же мак переходить нерационально. А второй рабочий ноут мне вряд ли дадут :) Короче мой выбор.

Komodo Edit. Лучший редактор. [...]]]></description>
			<content:encoded><![CDATA[<p>Принимаю эстафету у <a href="http://softwaremaniacs.org/blog/2008/02/26/5-tools/">Ивана Сагалаева</a>.</p>
<p>Пять инструментов, чаще всего используемых в работе. Скриншоты правда с домашней машины.<br />
<span id="more-112"></span></p>
<ol>
<li><strong>Ubuntu</strong>. Тут, в общем, без вариантов. Я частенько ругаю убунтятину за работу с самбой, но в целом понимаю, что на тот же мак переходить нерационально. А второй рабочий ноут мне вряд ли дадут :) Короче мой выбор.<br />
<a href="/wp-content/uploads/2008/02/ubuntu.jpg"><img src="/wp-content/uploads/2008/02/ubuntu-thumb.gif" alt="ubuntu" /></a></li>
<li><strong><a href="http://www.activestate.com/Products/komodo_edit/">Komodo Edit</a></strong>. Лучший редактор. Не по расчёту, но по любви. HTML/CSS/JS/XML/XSLT.</li>
<li><strong>Photoshop 7.0/Wine</strong>. Gimp у меня всё-таки не пошёл, а тут всё знакомо можно сказать с детства. Вива адобе.</li>
<li><strong><a href="http://meld.sourceforge.net/">Meld</a></strong>. Совершенно опиздонительный diff/merge для Gnome. Файлы, каталоги, ветки CVS. Конечно хочется поддержку SVN, но со сравнением двух виртуальных хостов справляется легко.</li>
<li><strong>Терминал</strong>. Последний по списку, но не последний по качеству. Из этой штуки можно делать почти всё. А если открыть вторую вкладку, то вообще всё. За Ctrl-R я почти продал душу дьяволу.<a href="/wp-content/uploads/2008/02/terminal.jpg"><img src="/wp-content/uploads/2008/02/terminal-thumb.gif" alt="terminal" /></a></li>
<li>Ну и оффтопиком.. <strong>Guitar Pro</strong>. Любимейшая программа на данный момент, без вариантов. <a href="http://flack.ru/wp-content/uploads/2007/12/gp5.png">Декабрьский скриншот</a>.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2008/02/29/5-tools/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Семантическая верстка — советы и решения. Часть V. Навигация по сайту или укрощение списков</title>
		<link>http://flack.ru/2008/02/08/semantic-coding-howto-5/</link>
		<comments>http://flack.ru/2008/02/08/semantic-coding-howto-5/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 19:42:32 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[Рецептарий]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[float]]></category>
		<category><![CDATA[веб-стандарты]]></category>

		<guid isPermaLink="false">http://flack.ru/2008/02/08/semantic-coding-howto-5/</guid>
		<description><![CDATA[Навигация — это то, с чего начинается любой сайт, ведь без нее пользователь просто не сможет им пользоваться. Не удивительно, что мы заострим на ее организации свое внимание.
Представим себе кусочек макета, присланного нам дизайнером. На нем изображено главное меню будущего сайта:

Пункт меню «Обратная связь» показывает поведение при наведении мышкой.
Если забыть на время про семантику, то [...]]]></description>
			<content:encoded><![CDATA[<p>Навигация — это то, с чего начинается любой сайт, ведь без нее пользователь просто не сможет им пользоваться. Не удивительно, что мы заострим на ее организации свое внимание.</p>
<p>Представим себе кусочек макета, присланного нам дизайнером. На нем изображено главное меню будущего сайта:</p>
<p><img src="http://flack.ru/wp-content/uploads/2008/02/semantic-coding-5-0.gif" alt="Иллюстрация 1" /></p>
<p>Пункт меню «Обратная связь» показывает поведение при наведении мышкой.<span id="more-107"></span></p>
<p>Если забыть на время про семантику, то наше меню можно представить в HTML приверно так:</p>
<pre><code>&lt;table id=”main-nav”&gt;&lt;tr&gt;
        &lt;td&gt;&lt;a href=””&gt;Новости&lt;/a&gt;&lt;/td&gt;
	  …
    &lt;/tr&gt;
&lt;/table&gt;</code></pre>
<p>Набросать небольшой CSS, использовать Javascript для подсветки пункта при наведении мышкой и жить счастливо. Но не правильно.</p>
<p>При таком подходе мы теряем первичный структурный смысл нашей навигации. Любое меню — прежде всего список. Не даром мы говорим именно «пункт меню» и читаем книги, в которых оглавление более всего похоже именно на список.</p>
<p>Поэтому, вспомнив о семантике документа мы напишем код нашей навигации следующим образом:</p>
<pre><code>&lt;ul id=”main-nav”&gt;
    &lt;li&gt;&lt;a href=””&gt;Новости&lt;/a&gt;&lt;/li&gt;
    …
&lt;/ul&gt;</code></pre>
<p>Первый шаг к светлому будущему. Однако наше горизонтальное меню в данный момент выглядит в браузере следующим образом:</p>
<p><img src="http://flack.ru/wp-content/uploads/2008/02/semantic-coding-5-1.gif" alt="Иллюстрация 2" /></p>
<p>По сравнению с табличным решением мы сразу сталкиваемся с двумя очевидными проблемами. Во-первых, визуально неуместными маркерами списка, а во вторых с тем, что пока данное меню принять за горизонтальное может только очень незаурядный ум.</p>
<h4>Немного магии CSS</h4>
<p>Начнем с решения двух вышеназванных проблем:</p>
<pre><code class="css">* {margin:0;padding:0;}
body {
    padding:40px;
    background:#FFF;
    font:100.01% Tahoma,Helvetica,sans-serif;
    color:#000;
    }
ul#main-nav {
    float:left; /* Предотвращаем эффект, при котором список не охватит внутри себя свои пункты. Это будет видно, если задать ul видимые границы */
    font:bold .75em Tahoma,Helvetica,sans-serif; /* Устанавливаем параметры шрифта */
    }
ul#main-nav li {
    float:left; /* «Прижимаем» элементы списка налево, эмулируя горизонталь */
    list-style:none; /* Убираем маркеры у пунктов списка */
    }</code></pre>
<p class="note">Я не буду здесь останавливаться на механизмах работы правила float, так о нем можно писать целые книги. Подробное объяснение на русском можно почепнуть в статье Ивана Сагалаева «<a href="http://softwaremaniacs.org/blog/2005/12/01/css-layout-float/">Раскладка в CSS: float</a>».</p>
<p>В итоге мы получили следующий результат:</p>
<p><img src="http://flack.ru/wp-content/uploads/2008/02/semantic-coding-5-2.gif" alt="Иллюстрация 3" /></p>
<p>Как видите, мы уже значительно ближе к намеченной цели. Осталось лишь дописать оформительские эффекты. Все было бы очевидно, если бы не одно — нам необходимо организовать подсветку пункта меню при наведении на него мыши.</p>
<h4>Javascript? Не наш метод</h4>
<p>В стандарте CSS 2.1, который является текущим, предусмотрен псевдоселектор :hover, благодаря которому мы можем менять стиль элемента по тому же принципу, как делаем при onmouseover при помощи Javascript. Одна проблема — IE шестой версии и ниже применяет :hover только к ссылкам. Флагманы технического прогресса, что уж тут скажешь.</p>
<p>Но не стоит отчаиваться. Поскольку наш список все-таки является навигацией, в нем совершенно очевидным образом находятся ссылки, к которым :hover в IE 5 и 6 можно применить без лишних проблем. Заодно на ссылки мы навесим и другие элементы оформления, такие как оступы, границы и цвет.</p>
<pre><code class="css">ul#main-nav li a {
    display:block; /* Делаем ссылки блочным элементом, чтобы они могли нативно работать с внутренними полями */
    position:relative; /* Небольшой «хак», чтобы в IE кликабельная область распространилась на внутренние поля */
    padding:4px 8px; /* Внутренние поля */
    background:#FFF; /* Цвет фона */
    border:1px solid #CCC; /* Границы */
    border-width:1px 0 1px 1px;
    color:#47AAE9; /* Цвет шрифта */
    }
    ul#main-nav li a:hover {
        background:#F2F2F2; /* Цвет фона при наведении на ссылку */
        color:#000; /* Цвет шрифта при наведении на ссылку */
        }</code></pre>
<p>Осталась небольшая деталь. Так как мы не рисовали правую границу для ссылок внутри элементов списка — у нашего меню не хватает правой границы. Конечно можно было бы задать класс последнему элементу списка и переопределить нужные стили, но в данном случае можно сделать все проще и без лишней разметки. Достаточно лишь добавить границу самому списку.</p>
<pre><code class="css">ul#main-nav {
    float:left;
    border-right:1px solid #CCC;
    font:bold .75em Tahoma,Helvetica,sans-serif;
    }</code></pre>
<p><img src="http://flack.ru/wp-content/uploads/2008/02/semantic-coding-5-3.gif" alt="Иллюстрация 4" /></p>
<p>Отлично, не правда ли? Мы добились не только нужного визуального отображения, но и поведения, при этом используя лишь семантически верную HTML-разметку и CSS.</p>
<p class="note">У данного решения есть один минус — в Opera седьмых версий элементы списка не выстроятся линию, пока мы не зададим списку конкретную ширину. Это проблема продвинутого уровня и я не буду на ней останавливаться. Попытайтесь найти решение самостоятельно.</p>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2008/02/08/semantic-coding-howto-5/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Семантическая верстка — советы и решения. Часть IV. Создание «резиновых» макетов с использованием отрицательных полей</title>
		<link>http://flack.ru/2008/02/01/semantic-coding-howto-4/</link>
		<comments>http://flack.ru/2008/02/01/semantic-coding-howto-4/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 20:42:51 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[Рецептарий]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[веб-стандарты]]></category>
		<category><![CDATA[отрицательные поля]]></category>

		<guid isPermaLink="false">http://flack.ru/2008/02/01/semantic-coding-howto-4/</guid>
		<description><![CDATA[Отрицательные поля, пожалуй, самый мощный инструмент для семантической верстки сложных макетов. Овладеть этой техникой просто необходимо, потому как благодаря ей вы во многих случаях сможете отказаться от таблиц для разметки макета.
Разберем использование отрицательных полей на примере. Мы сверстаем трехколоночный макет с двумя фиксированными боковыми колонками, тянущейся центральной, шапкой и подвалом.

html:
&#60;div id="header"&#62;
    Шапка
&#60;/div&#62;
&#60;div [...]]]></description>
			<content:encoded><![CDATA[<p>Отрицательные поля, пожалуй, самый мощный инструмент для семантической верстки сложных макетов. Овладеть этой техникой просто необходимо, потому как благодаря ей вы во многих случаях сможете отказаться от таблиц для разметки макета.</p>
<p>Разберем использование отрицательных полей на примере. Мы сверстаем трехколоночный макет с двумя фиксированными боковыми колонками, тянущейся центральной, шапкой и подвалом.<br />
<span id="more-105"></span><br />
<strong>html:</strong></p>
<pre><code class="html">&lt;div id="header"&gt;
    Шапка
&lt;/div&gt;
&lt;div id="container"&gt;
    &lt;div id="nav"&gt;
        Левая колонка
    &lt;/div&gt;
    &lt;div id="content"&gt;
        Контент
    &lt;/div&gt;
&lt;/div&gt;
&lt;div id="sidebar"&gt;
    Правая колонка
&lt;/div&gt;
&lt;div id="footer"&gt;
    Футер
&lt;/div&gt;</code></pre>
<p>Обратите внимание на то, что левая и центральная колонки объединены общим контейнером. Именно для этого контейнера мы установим отрицательное поле, которое «подтянет» правую колонку.</p>
<p><strong>style.css:</strong></p>
<pre><code class="css">body {
    padding:20px;
    background:#FFF;
    color:#000;
    }
#header {
    padding:10px;
    background:#51CAC8;
    }
#container {
    float:left; /* Делаем контейнер плавающим, чтобы добиться нужного поведения */
    width:100%; /* Указываем контейнеру занимать все доступное пространство */
    margin:10px -170px 10px 0; /* Устанавливаем отрицательное правое поле, чтобы подтянуть правую колонку */
    }
#nav {
    float:left; /* Прижимаем блок налево */
    width:150px; /* Обращаем внимание, что фактическая ширина блока = 170 пикселям */
    padding:10px;
    background:#E73D00;
    }
#content {
    margin:0 150px 0 170px; /* Устанавливаем поля, чтобы контент не «налезал» на боковые колонки */
    padding:10px;
    background:#91CA00;
    }
#sidebar {
    float:right; /* Прижимаем блок направо */
    width:130px; /* Обращаем внимание, что фактическая ширина блока = 150 пикселям */
    margin-top:10px;
    padding:10px;
    background:#F5DC09;
    }
#footer {
    clear:both; /* Ставим подвал ниже самой длинной колонки */
    padding:10px;
    background:#DDDEDF;
    }</code></pre>
<p><strong>ie.css:</strong></p>
<pre><code class="css">* HTML #nav {
    width:170px;
    w\idth:150px;
    }
* HTML #sidebar {
    width:150px;
    w\idth:130px;
    }
#footer {
    height:1%; /* Немного магии для IE5, неправильно считающего отступы */
    }</code></pre>
<p>Это даст нам следующий результат:</p>
<p><img src="/wp-content/uploads/2008/02/negative-margins.png" alt="Иллюстрация результата" /></p>
<p>Центральная колонка при этом будет тянуться пропорционально размерам рабочей области окна. Принципиальное отличие такого макета от таблицы с тремя ячейками заключается в том, что наши три колонки не будут одновременно тянуться по высоте, а будут занимать нужное им вертикальное пространство. При этом подвал всегда будет ниже самой длинной из них. Для того, чтобы эмулировать поведение ячеек таблиц, вам придется воспользоваться техникой faux columns.</p>
<p><strong>Материалы для изучения:</strong></p>
<ul>
<li><a href="http://webmascon.com/topics/coding/43a.asp">«Резиновая вёрстка»: используем отрицательные поля</a></li>
<li><a href="http://alistapart.com/articles/fauxcolumns">Faux Columns</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2008/02/01/semantic-coding-howto-4/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Семантическая верстка — советы и решения. Часть третья. Блочная модель</title>
		<link>http://flack.ru/2007/12/22/semantic-coding-howto-3/</link>
		<comments>http://flack.ru/2007/12/22/semantic-coding-howto-3/#comments</comments>
		<pubDate>Sat, 22 Dec 2007 00:11:20 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[Рецептарий]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[блочная модель]]></category>
		<category><![CDATA[веб-стандарты]]></category>

		<guid isPermaLink="false">http://flack.ru/2007/12/22/semantic-coding-howto-3/</guid>
		<description><![CDATA[Блочная модель
Одна из ключевых особенностей cемантической валидной верстки — использование правильной блочной модели. Рассмотрим на примере, как она работает.

html:
&#60;div id="parent"&#62;
    &#60;div id="element"&#62;
        Lorem ipsum…
    &#60;/div&#62;
&#60;/div&#62;
style.css:
#parent {
    border:1px solid red;
    }
#element {
    width:200px; /* [...]]]></description>
			<content:encoded><![CDATA[<h4>Блочная модель</h4>
<p>Одна из ключевых особенностей cемантической валидной верстки — использование правильной блочной модели. Рассмотрим на примере, как она работает.<br />
<span id="more-98"></span><br />
<strong>html:</strong></p>
<pre><code>&lt;div id="parent"&gt;
    &lt;div id="element"&gt;
        Lorem ipsum…
    &lt;/div&gt;
&lt;/div&gt;</code></pre>
<p><strong>style.css:</strong></p>
<pre><code>#parent {
    border:1px solid red;
    }
#element {
    width:200px; /* Ширина области контента */
    margin:40px; /* Поля */
    padding:20px; /* Отступы */
    border:4px solid #CCC; /* Границы */
    background:#F2F2F2;
    }</code></pre>
<p><img src="/wp-content/uploads/2007/12/block-model-1.png" alt="Иллюстрация размерностей" /></p>
<p>Визуальная ширина блока 248 пикселей, несмотря на то, что четко задана ширина в 200 пикселей. Дело в том, что по спецификации CSS визуальный размер блока складывается из суммы размера области контента, величины отступов и ширины границ. Заданное нами в CSS значение ширины (width) — на самом деле ширина области контента. Отсюда мы получаем визуальную ширину блока следующим образом.</p>
<p>Визуальный размер блока = 200 (ширина области контента) + 40 (сумма правого и левого отступов) + 8 (сумма правой и левой границ).</p>
<p>Для того чтобы четко задать визуальную ширину, при написании значений размеров в CSS нужно выполнить ряд нехитрых действий. Из желаемой визуальной ширины необходимо вычесть сумму обоих отступов и сумму обеих границ. Таким образом, чтобы изобразить блок шириной 200 пиксел, необходимо задать следующее значение правила width:</p>
<p>width = 200 (нужная визуальная ширина блока) — 40 (сумма правого и левого отступов) — 8 (сумма правой и левой границ).</p>
<p>Переопределим значение правила width в CSS.</p>
<p><strong>style.css:</strong></p>
<pre><code>#element {
    width:152px; /* Ширина области контента */
    margin:40px; /* Поля */
    padding:20px; /* Отступы */
    border:4px solid #CCC; /* Границы */
    }</code></pre>
<p><img src="/wp-content/uploads/2007/12/block-model-2.png" alt="Иллюстрация размерностей - 2" /></p>
<p>Нужный результат получен. Данные вычисления вначале могут показаться довольно сложными, но выработав привычку, вы будете выполнять их автоматически.</p>
<h4>Неправильная блочная модель и кроссбраузерные проблемы</h4>
<p>Даже при использовании полного правильного DOCTYPE, вы столкнетесь с ситуацией, когда блочная модель работает неправильно. Это связано с неправильной реализацией блочной модели в IE 5.x. В этом браузере визуальная ширина нашего примера вычисляется следующим образом:</p>
<p>Визуальная ширина блока = значению правила width.</p>
<p>Хотя такая модель может показаться более логичной, она не соответствует спецификации CSS.</p>
<p>Чтобы избежать различного отображения блоков в IE 5.x и более современных браузерах, необходимо применить хак с экранированием. Дело в том, что в CSS можно вполне законно экранировать символы (кроме A&#8211;F), и такие правила будут вполне корректно работать везде, кроме IE пятых версий. Так будет выглядеть хак, необходимый в данном примере:</p>
<p><strong>ie.css:</strong></p>
<pre><code>* HTML #element {
    width:200px; /* Для пятых версий IE, некорректно обрабатывающих блочную модель */
    w\idth:152px; /* Для более старших */
    }</code></pre>
<p>Для достижения такого же результата вы можете использовать и условные комментарии, подключая отдельный css-файл Internet Explorer версии 5.</p>
<p><strong>Полезные ссылки</strong></p>
<ul>
<li><a href="http://www.webmascon.com/topics/coding/38a.asp">Трюк с блочной моделью CSS</a></li>
<li><a href="http://www.webmascon.com/topics/tools/10a.asp">Шпаргалка по CSS</a></li>
<li><a href="http://www.info.com.ph/~etan/w3pantheon/style/modifiedsbmh.html">Modified SBMH (Simplified Box Model Hack)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2007/12/22/semantic-coding-howto-3/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Генерация URL&#8217;ов в XSLT 1.0</title>
		<link>http://flack.ru/2007/12/13/urls-generation-in-xslt-10/</link>
		<comments>http://flack.ru/2007/12/13/urls-generation-in-xslt-10/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 22:42:34 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[Рецептарий]]></category>
		<category><![CDATA[urls]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://flack.ru/2007/12/13/urls-generation-in-xslt-10/</guid>
		<description><![CDATA[В первой версии XSLT самой слабой, пожалуй, остаётся работа со строками.
Наиболее часто проблемы из-за этого возникают  с генерацией URL&#8217;ов. Допустим, мы имеем страницу с адресом:
http://example.com/index.xml?section=catalog&#38;cat-id=10&#38;item-id=1404&#38;item-unique-key=809124
Нам нужно, скажем, сгенерировать три ссылки: на главную страницу категории (cat-id), главную страницу (section) и независимую от категории страницу итема (item-id, item-unique-key).
Способов много, я по-началу даже использовал substring, но потом [...]]]></description>
			<content:encoded><![CDATA[<p>В первой версии XSLT самой слабой, пожалуй, остаётся работа со строками.</p>
<p>Наиболее часто проблемы из-за этого возникают  с генерацией URL&#8217;ов. Допустим, мы имеем страницу с адресом:</p>
<pre><code>http://example.com/index.xml?section=catalog&amp;cat-id=10&amp;item-id=1404&amp;item-unique-key=809124</code></pre>
<p>Нам нужно, скажем, сгенерировать три ссылки: на главную страницу категории (cat-id), главную страницу (section) и независимую от категории страницу итема (item-id, item-unique-key).</p>
<p>Способов много, я по-началу даже использовал substring, но потом ради разнообразия включил моск и набросал небольшой шаблончик. Открытием для хоть сколько-то опытных разработчиков он не будет, так что будем считать это очередным self-note.<span id="more-91"></span></p>
<p>В первую очередь нам нужно надыбать xml с параметрами запроса. В идеале что-то вроде:</p>
<pre><code>&lt;state name="request"&gt;
    &lt;param name="section"&gt;catalog&lt;/param&gt;
    &lt;param name="cat-id"&gt;10&lt;/param&gt;
    &lt;param name="item-id"&gt;1404&lt;/param&gt;
    &lt;param name="item-unique-key"&gt;809124&lt;/param&gt;
&lt;/state&gt;</code></pre>
<p>Готовый вариант стилей будет выглядеть вот так:</p>
<pre><code>&lt;xsl:variable name="request" select="/page/state[@name='request']"/&gt;

&lt;xsl:template match="/"&gt;
    &lt;html&gt;
        &lt;head&gt;
	    &lt;title&gt;Custom page name&lt;/title&gt;
	&lt;/head&gt;
	&lt;body&gt;
	    &lt;div id="place-holder"&gt;
		&lt;ul&gt;
		    &lt;li&gt;
			&lt;a&gt;
			    &lt;xsl:attribute name="href"&gt;
				&lt;xsl:apply-templates select="$request"&gt;
				    &lt;xsl:with-param name="exclude-params" select="'item-id|item-unique-key'"/&gt;
				&lt;/xsl:apply-templates&gt;
			    &lt;/xsl:attribute&gt;
			    Ссылка на общую страницу категории
			&lt;/a&gt;
		    &lt;/li&gt;
		    &lt;li&gt;
			&lt;a&gt;
			    &lt;xsl:attribute name="href"&gt;
				&lt;xsl:apply-templates select="$request"&gt;
				    &lt;xsl:with-param name="exclude-params" select="'cat-id'"/&gt;
				&lt;/xsl:apply-templates&gt;
			    &lt;/xsl:attribute&gt;
			    Ссылка на страницу итема, безотносительно категории
			&lt;/a&gt;
		    &lt;/li&gt;
		    &lt;li&gt;
			&lt;a&gt;
			    &lt;xsl:attribute name="href"&gt;
				&lt;xsl:apply-templates select="$request"&gt;
				    &lt;xsl:with-param name="exclude-params" select="'cat-id|item-id|item-unique-key'"/&gt;
				&lt;/xsl:apply-templates&gt;
			    &lt;/xsl:attribute&gt;
			    Ссылка на главную страницу раздела
			&lt;/a&gt;
		    &lt;/li&gt;
		&lt;/ul&gt;
	    &lt;/div&gt;
        &lt;/body&gt;
    &lt;/html&gt;
&lt;/xsl:template&gt;

&lt;xsl:template match="state"&gt;
    &lt;xsl:param name="exclude-params"/&gt;
    &lt;xsl:text&gt;http://example.com/index.xml&lt;/xsl:text&gt;
    &lt;xsl:apply-templates select="param[not(contains($exclude-params,@name))]"/&gt;
&lt;/xsl:template&gt;

&lt;xsl:template match="param[position()=1]"&gt;
    &lt;xsl:text&gt;?&lt;/xsl:text&gt;
    &lt;xsl:value-of select="@name"/&gt;
    &lt;xsl:text&gt;=&lt;/xsl:text&gt;
    &lt;xsl:value-of select="."/&gt;
&lt;/xsl:template&gt;

&lt;xsl:template match="param"&gt;
    &lt;xsl:text&gt;&amp;&lt;/xsl:text&gt;
    &lt;xsl:value-of select="@name"/&gt;
    &lt;xsl:text&gt;=&lt;/xsl:text&gt;
    &lt;xsl:value-of select="."/&gt;
&lt;/xsl:template&gt;</code></pre>
<p>Разберём чуть подробнее:</p>
<pre><code>&lt;xsl:attribute name="href"&gt;
    &lt;xsl:apply-templates select="$request" name="create-url"&gt;
        &lt;xsl:with-param name="exclude-params" select="'cat-id|item-id|item-unique-key'"/&gt;
    &lt;/xsl:apply-templates&gt;
&lt;/xsl:attribute&gt;
</code></pre>
<p>Здесь мы запускаем шаблон для генерации URL&#8217;а, передавая ему, какие параметры не хотим видеть в создаваемом запросе. Если этих параметров в текущем URL&#8217;e нет, ничего страшного не случится.</p>
<p>Ну и, собственно, единственная соль:</p>
<pre><code>&lt;xsl:template match="state"&gt;
    &lt;xsl:param name="exclude-params"/&gt;
    &lt;xsl:text&gt;http://example.com/index.xml&lt;/xsl:text&gt;
    &lt;xsl:apply-templates select="param[not(contains($exclude-params,@name))]"/&gt;
&lt;/xsl:template&gt;</code></pre>
<p>Не матчим те параметры, которые мы передали как исключаемые. Ну и собственно генерируем URL:</p>
<pre><code>&lt;xsl:template match="param"&gt;
    &lt;xsl:text&gt;&amp;&lt;/xsl:text&gt;
    &lt;xsl:value-of select="@name"/&gt;
    &lt;xsl:text&gt;=&lt;/xsl:text&gt;
    &lt;xsl:value-of select="."/&gt;
&lt;/xsl:template&gt;</code></pre>
<p>Исключительно простая штука, которая может сэкономить начинающим кучу времени и нервов. Правда нужно еще xml получать правильный, но про пинание программеров будет в следующий раз :)</p>
<p>Желающие могут заценить исходники: <a href="http://flack.ru/wp-content/uploads/2007/12/index.xml">xml</a>, <a href="http://flack.ru/wp-content/uploads/2007/12/index.xsl">xsl</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2007/12/13/urls-generation-in-xslt-10/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Семантическая верстка — советы и решения. Часть вторая. Хаки-шмаки, даём люлей IE</title>
		<link>http://flack.ru/2007/12/07/semantic-coding-howto-2/</link>
		<comments>http://flack.ru/2007/12/07/semantic-coding-howto-2/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 21:51:12 +0000</pubDate>
		<dc:creator>Flack</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[Рецептарий]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[веб-стандарты]]></category>
		<category><![CDATA[рецепты]]></category>

		<guid isPermaLink="false">http://flack.ru/2007/12/07/semantic-coding-howto-2/</guid>
		<description><![CDATA[
CSS-хаки
Альтернатива синице

Укрощаем Internet Explorer или «магические правила»

CSS-хаки
При использовании семантической верстки каждый разработчик обязательно столкнется с проблемами кроссбраузерности, для решения которых в большинстве случаев приходится использовать так называемые «хаки». Обычно под этим термином подразумевается особый способ написания селекторов или правил, понимаемый только конкретным браузером. Однако совместимость с CSS в большинстве браузеров уже достигла уровня, при котором [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://flack.ru/2007/12/07/semantic-coding-howto-2/#hacks">CSS-хаки</a></li>
<li><a href="http://flack.ru/2007/12/07/semantic-coding-howto-2/#cond">Альтернатива синице<br />
</a></li>
<li><a href="http://flack.ru/2007/12/07/semantic-coding-howto-2/#magic">Укрощаем Internet Explorer или «магические правила»</a></li>
</ul>
<h4 id="hacks">CSS-хаки</h4>
<p>При использовании семантической верстки каждый разработчик обязательно столкнется с проблемами кроссбраузерности, для решения которых в большинстве случаев приходится использовать так называемые «хаки». Обычно под этим термином подразумевается особый способ написания селекторов или правил, понимаемый только конкретным браузером. Однако совместимость с CSS в большинстве браузеров уже достигла уровня, при котором следует ограничивать использование «хаков».</p>
<p>Как правило, основным источником неприятностей бывает Internet Explorer. Многообразие ошибок в реализации CSS в браузерах Microsoft удивляет даже самых опытных верстальщиков. В связи с этим возникают ситуации, когда необходимо использовать дополнительные или альтернативные правила для IE. Именно в таких случаях рекомендуется применять «хаки». Если же вам вдруг понадобились альтернативные правила, скажем, только для Firefox, то рекомендуется пересмотреть ваш код, и в 99% случаев вы найдете более элегантное решение.<br />
<span id="more-90"></span><br />
Наиболее популярным хаком на сегодня остается так называемый «star html hack»:</p>
<pre><code>#element {
  position:relative; /* Основное правило  для всеx браузеров */
  }
  * HTML #element {
    position:static; /* Переопределение  правила для IE младше седьмой версии */
    }</code></pre>
<p>В валидных HTML- и XHMTL-документах селектор HTML всегда играет роль корневого элемента, а BODY — потомка первого уровня, но не второго или более высокого уровня. Таким образом, теоретически селектор «* HTML» не должен применяться ни к одному элементу. Но на практике IE пятых и шестых версий из-за ошибки в собственном движке интерпретируют данный селектор как HTML и применяют указываемые правила. Поскольку остальные современные браузеры селектор «* HTML» игнорируют, этот прием можно использовать в корыстных целях. Это полезно, но правильно ли?</p>
<p>Несмотря на то что данный хак корректен с точки зрения стандарта CSS, есть ряд негативных нюансов.</p>
<p>Во-первых, слово «хак» звучит странно, и разработчику уже это должно не понравиться.</p>
<p>Во-вторых, такие хаки для браузера Internet Explorer засоряют код, подгружаемый и всеми остальными браузерами.</p>
<p>В-третьих, в этом хаке игнорируется недавно вышедший Internet Explorer 7.0, где был исправлен целый ряд ошибок в модуле CSS (более подробно об этом вы можете почитать непосредственно в блоге разработчиков IE7 по адресу <a href="http://blogs.msdn.com/ie/">blogs.msdn.com/ie</a>).</p>
<p>Как же укротить Internet Explorer, не используя хаки?</p>
<h4 id="cond">Альтернатива синице</h4>
<p>В недрах Microsoft Developer Network есть решение получше — conditional comments. Данная технология поддерживается в Internet Explorer, начиная с пятой версии, тем самым охватывая все интересующие нас браузеры. Ниже приводится пример элегантного использования условных комментариев:</p>
<pre><code>&lt;link href="style.css" rel="stylesheet" type="text/css" media="all" /&gt;
&lt;!--[if IE]&gt;&lt;link rel="stylesheet" type="text/css" href="ie.css" media="all"/&gt;&lt;![endif]--&gt;
</code></pre>
<p>Обычное подключение CSS-файлов, однако увидят вторую строку, а следовательно и подгрузят css-файл только браузеры семейства Internet Explorer. Происходит это благодаря условию, заложенному в условном комментарии — if IE. Данное условие означает «если Internet Explorer» и Explorer’ы версии пять и выше (включая свежий седьмой) прочитают код, находящийся внутри комментария и интерпретируют его.</p>
<p>Таким образом все наши хаки можно вынести в отдельный файл:</p>
<p><strong>style.css:</strong></p>
<pre><code>#element {
    position:relative; /* Основное правило для всеx браузеров */
    }</code></pre>
<p><strong>ie.css:</strong></p>
<pre><code>#element {
    position:static; /* Переопределение правила для IE всех версий */
    }</code></pre>
<p>Теперь мы не используем хаки в основном листе стилей; добились того, что альтернативное правило было применено ко всем  Explorer’ам, включая седьмой; а также избавили пользователей альтернативных браузеров от загрузки лишнего кода. При этом мы сохранили наш (X)HTML и CSS валидным, так как такой условный комментарий не распознается никем иным кроме IE, включая даже валидатор от W3C.</p>
<p>Условные комментарии гибче, чем кажется на одном примере. Вы можете охватить не только все Explorer’ы, но и все его версии ниже или выше определенной или конкретную его версию; а также подгрузить код, который будут интерпретировать все браузеры, кроме Internet Explorer. К сожалению, это уже тема для отдельной статьи и с этими возможностями читателю следует ознакомится самостоятельно.</p>
<p><strong>Материалы для изучения:</strong></p>
<ul>
<li><a href="http://msdn.microsoft.com/workshop/author/dhtml/overview/ccomment_ovw.asp">раздел в Microsoft Developer Network</a></li>
<li><a href="http://www.quirksmode.org/css/condcom.html">Подробное объяснение синтаксиса и методологии использования</a></li>
<li><a href="http://www.456bereastreet.com/archive/200511/valid_downlevelrevealed_conditional_comments/">О валидности синтаксиса условных комментариев не для IE</a></li>
</ul>
<h4 id="magic">Укрощаем Internet Explorer или «магические правила»</h4>
<p>Как уже говорилось выше, больше всего проблем верстальщику доставляют браузеры от Microsoft. Мы уже рассказали о том, как добавить отдельные правила только для Internet Explorer, но не коснулись того, какие же правила нам смогут помочь. Исправляем это досадное упущение.<br />
Все перечисляемые ниже элементы управляют свойством <a href="http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/haslayout.asp">hasLayout</a>. hasLayout не является частью стандарта CSS и является скорее микрософтовской «заплаткой» для веб-разработчиков. Но и на том спасибо, как говорится.</p>
<p>Мы приводим только названия багов, для исправления которых применяются данные правила. Более подробное описание указываемых багов вы можете найти по адресу <a href="http://www.positioniseverything.net/explorer.html">positioniseverything.net/explorer.html</a>.</p>
<p><strong>position:relative</strong></p>
<ul>
<li>The IE/Win Disappearing List-Background Bug</li>
<li>IE6 Border Chaos</li>
</ul>
<p>Данное правило также часто применяется для спонтанно пропадающих блоков. Не падающих или неправильно отображающихся, а именно пропадающих. Особенно грешит этим Internet Explorer 5.0.</p>
<p><strong>height:1%</strong></p>
<ul>
<li>The IE6 Three Pixel Text-Jog</li>
<li>The IE Escaping Floats Bug</li>
<li>IE and italics (будьте осторожны с 5.0, используйте экранирование)</li>
<li>IE/Win Unscrollable Content Bug</li>
<li>IE/Win Guillotine Bug</li>
<li>Quirky Percentages in IE6&#8217;s Visual Formatting Model</li>
</ul>
<p>Применяется также для клиаринга элементов. Задается контейнеру, содержащему float’ы.</p>
<p><strong>display:inline</strong></p>
<ul>
<li>Floats, Margins and IE</li>
<li>The IE Doubled Float-Margin Bug</li>
</ul>
<p><strong>display:inline-block;</strong></p>
<ul>
<li>Quirky Percentages in IE6&#8217;s Visual Formatting Model</li>
</ul>
<p><strong>zoom:1</strong></p>
<ul>
<li>Аналог height:1%; для IE 7.</li>
</ul>
<p>И еще пара советов:<br />
Во-первых, используйте данные правила по-возможности только для IE. Причем для разных версий решение может отличаться (наиболее часто это касается height:1% и zoom:1).<br />
Во-вторых, столкнувшись с нежелательным поведением Explorer’а, которому нет документированного объяснения (или вам просто лень его искать) — попробуйте последовательно применить к проблемному элементу все правила, влияющие на свойство hasLayout. Шаманство — неотъемлемая часть нашей професии.</p>
<p><strong>Материалы для изучения:</strong></p>
<ul>
<li><a href="http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/haslayout.asp">hasLayout property в MSDN</a></li>
<li><a href="http://www.satzansatz.de/cssd/onhavinglayout.html">On having layout</a></li>
<li><a href="http://cssing.org.ua/2005/11/11/ie-magic/">Магия для IE</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://flack.ru/2007/12/07/semantic-coding-howto-2/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
