<?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>Ars Longa, Vita Brevis &#187; HTML</title>
	<atom:link href="http://blog.sjinks.pro/html/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Кросс-браузерный резиновый трёхколоночный макет в высоту окна</title>
		<link>http://blog.sjinks.pro/css/209-cross-browser-liquid-three-column-layout-full-height/</link>
		<comments>http://blog.sjinks.pro/css/209-cross-browser-liquid-three-column-layout-full-height/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 20:49:24 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[кросс-браузерное решение]]></category>
		<category><![CDATA[макет]]></category>
		<category><![CDATA[резиновый макет]]></category>
		<category><![CDATA[трёхколоночный макет]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=209</guid>
		<description><![CDATA[Кросс-браузерное решение для резинового макета с одинаковой высотой колонок и стопроцентной высотой Недавно понадобилось сверстать резиновый трёхколоночный макет с высотой 100% и колонками одинаковой высоты. К моему удивлению, это оказалось не очень простым делом: вместо планируемого получаса это заняло намного больше времени. Требования к макету: кросс-браузерность (куда без неё); минимальная высота: 100% (полное окно, независимо [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/209-cross-browser-liquid-three-column-layout-full-height/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Кросс-браузерное решение для резинового макета с одинаковой высотой колонок и стопроцентной высотой</em></h2>
<p>Недавно понадобилось сверстать резиновый <a href="http://blog.sjinks.pro/tag/three-column-layout/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  трёхколоночный макет">трёхколоночный макет</a> с высотой 100% и колонками одинаковой высоты. К моему удивлению, это оказалось не очень простым делом: вместо планируемого получаса это заняло намного больше времени.</p>
<p>Требования к макету:</p>
<ul>
<li>кросс-браузерность (куда без неё);</li>
<li>минимальная высота: 100% (полное окно, независимо от высоты контента);</li>
<li>минимум кода;</li>
<li>все три колонки должны быть одинаковой высоты;</li>
<li>никакого JavaScript.</li>
</ul>
<p><span id="more-209"></span></p>
<p>Минимум кода означает минимум разметки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p20910">
        <div class="code xhtml" id="p209code10">
<span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">html</span> xmlns<span class="sy0">=</span><span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">head</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">meta</span> <span class="kw3">http-equiv</span><span class="sy0">=</span><span class="st0">&quot;Content-Type&quot;</span> <span class="kw3">content</span><span class="sy0">=</span><span class="st0">&quot;text/html; charset=UTF-8&quot;</span> <span class="sy0">/</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">title</span>&gt;</span>Three Column Liquid Layout<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">title</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">head</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">body</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;header&quot;</span>&gt;</span>Header<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;container&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;content&quot;</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;column&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">p</span>&gt;</span>Sed eleifend, sapien vel mollis euismod, sem velit semper ante...<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">p</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;left&quot;</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;column&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">p</span>&gt;</span>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis sollicitudin dolor nec nunc iaculis tincidunt...<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">p</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;right&quot;</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;column&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">p</span>&gt;</span>Phasellus sollicitudin. Fusce ut tellus. Vivamus dapibus. Cras eu elit. Vestibulum ante ipsum primis in faucibus orci luctus et...<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">p</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;footer&quot;</span>&gt;</span>Footer<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">body</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">html</span>&gt;</span>
        </div>
    </div>
</div>

<p><q>So far so good</q>, как любит говорить один мой коллега. Теперь переходим к разметке.</p>
<p>Начнём с общих определений:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p20911">
        <div class="code css" id="p209code11">
html <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="re0">#800000</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
html<span class="sy0">,</span> body <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
body <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">font</span><span class="sy0">:</span> <span class="re3">14px</span>/<span class="re3"><span class="nu0">120</span>%</span> Verdana<span class="sy0">,</span> Tahoma<span class="sy0">,</span> Arial<span class="sy0">,</span> Helvetica<span class="sy0">,</span> <span class="kw2">sans-serif</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">90</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> 0 <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Теперь переходим к 100% высоте. Помним, что Konqueror/KHTML <a href="http://blog.sjinks.pro/css/15-footer-in-the-very-bottom/#comment-163">имеет свою точку зрения</a> по поводу того, кто задаёт скроллинг; также не забываем про <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a>, который <a href="http://blog.sjinks.pro/css/15-footer-in-the-very-bottom/">не понимает</a> <code>min-height</code></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p20912">
        <div class="code css" id="p209code12">
html <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
html<span class="sy0">:</span>not<span class="br0">&#40;</span><span class="re2">:nth-</span>child<span class="br0">&#40;</span>1<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">visible</span><span class="sy0">;</span> <span class="coMULTI">/* KHTML сам нарисует скроллинг, не будем ему мешать */</span><br />
<span class="br0">&#125;</span><br />
<br />
html<span class="sy0">,</span> body <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#container</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="kw2">auto</span> !important<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span> <span class="coMULTI">/* для IE6 */</span><br />
&nbsp; &nbsp; <span class="kw1">min-height</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#container</span> <span class="br0">&#123;</span> <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">visible</span><span class="sy0">;</span> <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Для IE6 мы должны задать <code>overflow: visible</code>, в противном случае контент будет нещадно обрезаться.</p>
<p>Задаем заголовок и подвал:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p20913">
        <div class="code css" id="p209code13">
<span class="re0">#header</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3">3em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">red</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">color</span><span class="sy0">:</span> <span class="re0">#FFF</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">absolute</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">z-index</span><span class="sy0">:</span> <span class="nu0">1000</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">left</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re1">.column</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-top</span><span class="sy0">:</span> <span class="re3">3em</span> !important<span class="sy0">;</span> <span class="coMULTI">/* компенсация высоты заголовка */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#footer</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3">3em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">color</span><span class="sy0">:</span> <span class="re0">#FFF</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">green</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">z-index</span><span class="sy0">:</span> <span class="nu0">1000</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-top</span><span class="sy0">:</span> <span class="re3">-3em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Заголовок позиционируем абсолютно, так как контейнер <code>#container</code> имеет как минимум стопроцентную высоту: задать высоту <code>100%-3em</code> будет проблематично. Поэтому, считая, что высота заголовка нам известна (а так обычно всегда), мы просто помещаем заголовок "на территорию" контейнера, а высота заголовка будет компенсирована верхним отступом у колонок. Даже если нам придётся задать фоновый рисунок у <code>#container</code>, мы можем компенсировать высоту заголовка путём использования <code>background-position</code>.</p>
<p>Аналогично (только хуже <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ) с футером: его нужно поднять вверх на всю его высоту (отсюда относительное позиционирование и <code>z-index</code>)&nbsp;&mdash;&nbsp;как и в случае с заголовком, для поддержания стопроцентной высоты необходимо, чтобы он располагался "на территории" контейнера.</p>
<p>Теперь переходим к <a href="http://blog.sjinks.pro/css/48-liquid-three-column-layout-with-right-sidebars/">трём колонкам</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p20914">
        <div class="code css" id="p209code14">
<span class="re0">#container</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-left</span><span class="sy0">:</span> <span class="re3">220px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-right</span><span class="sy0">:</span> <span class="re3">200px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw1">left</span><span class="sy0">;</span> <span class="coMULTI">/* IE 5.01 */</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="coMULTI">/**/</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">lime</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#left</span><span class="sy0">,</span> <span class="re0">#right</span><span class="sy0">,</span> <span class="re0">#content</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw1">left</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-bottom</span><span class="sy0">:</span> <span class="re3">1000em</span> !important<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-bottom</span><span class="sy0">:</span> <span class="re3">-997em</span> !important<span class="sy0">;</span> <span class="coMULTI">/* компенсация высоты футера */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#left</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">220px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">url</span><span class="br0">&#40;</span>images/tile-2.jpg<span class="br0">&#41;</span> <span class="kw2">repeat</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">-<span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">right</span><span class="sy0">:</span> <span class="re3">220px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#left</span> <span class="br0">&#123;</span> <span class="coMULTI">/* У IE6 всё не как у людей */</span><br />
&nbsp; &nbsp; <span class="kw1">left</span><span class="sy0">:</span> <span class="re3">200px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#right</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">200px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">url</span><span class="br0">&#40;</span>images/tile-3.jpg<span class="br0">&#41;</span> <span class="kw2">repeat</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-right</span><span class="sy0">:</span> <span class="re3">-<span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#content</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">url</span><span class="br0">&#40;</span>images/tile-1.jpg<span class="br0">&#41;</span> <span class="kw2">repeat</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Теперь идут хаки. По слухам, в IE/Mac вышеприведённая техника для создания колонок одинаковой высоты не работает. Вернее, он работает, но страницу разносит по высоте (добавляется невидимый <code>padding</code>). Мне-то всё равно, но так как исправить просто (в смысле, сделать колонки разной высоты), то почему бы и нет:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p20915">
        <div class="code css" id="p209code15">
<span class="re0">#left</span><span class="sy0">,</span> <span class="re0">#right</span><span class="sy0">,</span> <span class="re0">#content</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw1">left</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-bottom</span><span class="sy0">:</span> <span class="re3">3em</span><span class="sy0">;</span> <span class="coMULTI">/* компенсация высоты футера */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/* Прячем от IE/Mac \*/</span><br />
<span class="re0">#left</span><span class="sy0">,</span> <span class="re0">#right</span><span class="sy0">,</span> <span class="re0">#content</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-bottom</span><span class="sy0">:</span> <span class="re3">1000em</span> !important<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-bottom</span><span class="sy0">:</span> <span class="re3">-997em</span> !important<span class="sy0">;</span> <br />
<span class="br0">&#125;</span><br />
<span class="coMULTI">/**/</span>
        </div>
    </div>
</div>

<p>Переходим к Опере. Старые версии (7.0-7.2) не обрезают колонки по высоте. На помощь приходит <a href="http://www.positioniseverything.net/easyclearing.html">EasyClearing</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p20916">
        <div class="code css" id="p209code16">
<span class="re0">#container</span><span class="re2">:after </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">content</span><span class="sy0">:</span> <span class="st0">'EasyClearing'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">clear</span><span class="sy0">:</span> <span class="kw2">both</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">visibility</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#container</span> <span class="br0">&#123;</span> <span class="kw1">display</span><span class="sy0">:</span> inline-<span class="kw2">block</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="coMULTI">/*\*/</span><br />
<span class="re0">#container</span> <span class="br0">&#123;</span> <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="coMULTI">/**/</span>
        </div>
    </div>
</div>

<p>Но, как это обычно бывает в жизни, исправил одну ошибку&nbsp;&mdash;&nbsp;вылезла другая: EasyClearing портит разметку в IE&nbsp;5.01. По счастью, это легко лечится путём добавления <code>float: left</code> контейнеру <code>#container</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p20917">
        <div class="code css" id="p209code17">
<span class="re0">#container</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw1">left</span><span class="sy0">;</span> <span class="coMULTI">/* IE 5.01 */</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="coMULTI">/**/</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Тем не менее, мы исправили не все глюки в Опере. Для Opera 8, у которой есть свои глюки в обработке overflow: hidden, нам придётся убрать <code>margin-bottom</code>/<code>padding-bottom</code> с самих колонок и применить их элементу внутри колонок. Либо так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p20918">
        <div class="code css" id="p209code18">
<span class="co1">@media all and (min-width: 0px) {</span><br />
&nbsp; &nbsp; <span class="re0">#left</span><span class="sy0">,</span> <span class="re0">#right</span><span class="sy0">,</span> <span class="re0">#content</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">margin-bottom</span><span class="sy0">:</span> 0 !important<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">padding-bottom</span><span class="sy0">:</span> <span class="re3">3em</span> !important<span class="sy0">;</span> <span class="coMULTI">/* Компенсация высоты футера */</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="re0">#left</span><span class="re2">:before</span><span class="sy0">,</span> <span class="re0">#right</span><span class="re2">:before</span><span class="sy0">,</span> <span class="re0">#content</span><span class="re2">:before </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">content</span><span class="sy0">:</span> <span class="st0">'EasyClearing'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">inherit</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">padding-top</span><span class="sy0">:</span> <span class="re3">1000em</span> !important<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">margin-bottom</span><span class="sy0">:</span> <span class="re3">-1000em</span> !important<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p><a href="http://blog.sjinks.pro/test/3col/3col_h100.html" rel="nofollow">Тестовая страница</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/209-cross-browser-liquid-three-column-layout-full-height/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/css/209-cross-browser-liquid-three-column-layout-full-height/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>Пять звёздочек без JavaScript</title>
		<link>http://blog.sjinks.pro/css/173-five-stars-without-javascript/</link>
		<comments>http://blog.sjinks.pro/css/173-five-stars-without-javascript/#comments</comments>
		<pubDate>Fri, 30 May 2008 19:26:35 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=173</guid>
		<description><![CDATA[Кросс-браузерный вариант реализации механизма рейтинга без использования JavaScript Прочитал сегодня статью "Пять звёздочек" на Pepelsbey.net. Автор описывает очень интересный подход для реализации механизма рейтингов; основное преимущество описываемого подхода&#160;&#8212;&#160;минимум JavaScript за счет грамотного использования CSS. Решение Вадима основано на использовании CSS&#160;rollovers, плавающих элементах и z-index и выглядит очень красиво. Особенно меня впечатлило то, что его решение [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/173-five-stars-without-javascript/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Кросс-браузерный вариант реализации механизма рейтинга без использования JavaScript</em></h2>
<p>Прочитал сегодня статью "<a href="http://pepelsbey.net/2008/05/five-stars/" rel="nofollow">Пять звёздочек</a>" на <a href="http://pepelsbey.net/" rel="nofollow">Pepelsbey.net</a>. Автор описывает очень интересный подход для реализации механизма рейтингов; основное преимущество описываемого подхода&nbsp;&mdash;&nbsp;минимум JavaScript за счет грамотного использования <a href="http://blog.sjinks.pro/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CSS">CSS</a>.<span id="more-173"></span></p>
<p>Решение Вадима основано на использовании CSS&nbsp;rollovers, плавающих элементах и <code>z-index</code> и выглядит очень красиво. Особенно меня впечатлило то, что его решение будет работать с выключенной загрузкой изображений и отключенным CSS. Весьма приятно, ибо о <a href="http://blog.sjinks.pro/tag/usability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  usability">usability</a> отечественные разработчики задумываются далеко не всегда.</p>
<p>Среди недостатков отмечу следующие:</p>
<ol>
<li>При использовании <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a> с выключенным JavaScript вся красота перестаёт работать (оффтопик: не могу понять, по каким причинам народ до сих пор сидит на <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a>?)</li>
<li>Некоторое неудобство при изменении шкалы: например, если изменить код так, чтобы можно было учитывать полбалла, то помимо ширин придется менять и <code>z-index</code> каждого элемента <code>a</code>. Хотя, в принципе, это мелочь.</li>
</ol>
<p>Полгода назад я какое-то работал над проектом myfolio.com, там тоже применялось пятизвёздочное голосование (правда, принцип несколько другой). Считая, что тот подход тоже имеет право жить <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> , привожу его здесь.</p>
<p>Разметка очень проста:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p17321">
        <div class="code html" id="p173code21">
&nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;a class=&quot;ievote&quot; href=&quot;#&quot;&gt;&lt;table cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;vote&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;ten&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=10&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;5 stars&quot;</span>&gt;</span>5.0<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;nine&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=9&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;4.5 stars&quot;</span>&gt;</span>4.5<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;eight&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=8&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;4 stars&quot;</span>&gt;</span>4.0<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;seven&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=7&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;3.5 stars&quot;</span>&gt;</span>3.5<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;six&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=6&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;3 star&quot;</span>&gt;</span>3.0<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;five&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=5&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;2.5 stars&quot;</span>&gt;</span>2.5<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;four&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=4&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;2 stars&quot;</span>&gt;</span>2.0<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;three rated&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=3&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;1.5 stars&quot;</span>&gt;</span>1.5<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;two&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=2&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;1 star&quot;</span>&gt;</span>1.0<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;one&quot;</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#rated=1&quot;</span> <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;0.5 stars&quot;</span>&gt;</span>0.5<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;![endif]--&gt;</span>
        </div>
    </div>
</div>

<p>Про условные комментарии вокруг элемента <code>ul</code> можно прочитать в статье "<a href="http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/">Кросс-браузерное одноуровневое вертикальное меню без JavaScript</a>".</p>
<p>Из особенностей&nbsp;&mdash;&nbsp;нумерация идёт в обратном порядке (это связано отказом от <span class="codebox"><code class="css"><span class="kw1">float</span></code></span> и <span class="codebox"><code class="css"><span class="kw1">z-index</span></code></span>, ибо код в myfolio был гораздо сложнее и с <span class="codebox"><code class="css"><span class="kw1">z-index</span></code></span> возникали некоторые проблемы в IE6).</p>
<p>Теперь самое интересное: стили:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p17322">
        <div class="code css" id="p173code22">
<span class="re1">.vote</span><span class="sy0">,</span> <span class="re1">.vote</span> li<span class="re1">.rated</span><span class="sy0">,</span> <span class="re1">.vote</span> li a<span class="re2">:hover </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">url</span><span class="br0">&#40;</span><span class="co2">stars.gif</span><span class="br0">&#41;</span> <span class="kw2">no-repeat</span> 0 <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/* Небольшая особенность: если задавать цвет, то картинка не должна быть прозрачной.<br />
Задание цвета используется для тех, кто выключил загрузку изображений в настройках браузера.<br />
В этом случае пользователь увидит нечто наподобие progress bar (но это всё же лучше, чем ничего).<br />
*/</span><br />
<span class="re1">.vote</span> li<span class="re1">.rated</span><span class="sy0">,</span> <span class="re1">.vote</span> li a<span class="re2">:hover </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background-color</span><span class="sy0">:</span> <span class="kw2">red</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re1">.vote</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background-position</span><span class="sy0">:</span> 0 <span class="re3">-14px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re1">.vote</span><span class="re2">:hover </span>li<span class="sy0">,</span> <span class="re1">.ievote</span><span class="re2">:hover </span>li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re1">.vote</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">80px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re1">.vote</span><span class="sy0">,</span> <span class="re1">.vote</span> li<span class="sy0">,</span> <span class="re1">.vote</span> li a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3">14px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re1">.vote</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">absolute</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re1">.vote</span><span class="sy0">,</span> <span class="re1">.vote</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">left</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">list-style</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re1">.vote</span> li a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">text-indent</span><span class="sy0">:</span> <span class="re3">-100px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">outline</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/* Задаем ширину каждого балла; каждый последующий балл включает в себя предыдущий*/</span><br />
<span class="re1">.vote</span> li<span class="re1">.one</span> &nbsp; <span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">7px</span><span class="sy0">;</span> &nbsp;<span class="br0">&#125;</span><br />
<span class="re1">.vote</span> li<span class="re1">.two</span> &nbsp; <span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">16px</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re1">.vote</span> li<span class="re1">.three</span> <span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">23px</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re1">.vote</span> li<span class="re1">.four</span> &nbsp;<span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">32px</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re1">.vote</span> li<span class="re1">.five</span> &nbsp;<span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">39px</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re1">.vote</span> li<span class="re1">.six</span> &nbsp; <span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">48px</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re1">.vote</span> li<span class="re1">.seven</span> <span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">55px</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re1">.vote</span> li<span class="re1">.eight</span> <span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">64px</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re1">.vote</span> li<span class="re1">.nine</span> &nbsp;<span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">71px</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re1">.vote</span> li<span class="re1">.ten</span> &nbsp; <span class="br0">&#123;</span> <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">80px</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/* Для IE6 */</span><br />
<span class="re1">.ievote</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">text-decoration</span><span class="sy0">:</span> <span class="kw2">none</span> !important<span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Наконец, <a href="http://blog.sjinks.pro/test/stars/stars.html">страница с рабочим примером</a>.</p>
<p><strong>Достоинства метода:</strong></p>
<ol>
<li>Метод кросс-браузерный, работает даже при отключенной загрузке изображений и выключенном CSS;</li>
<li>Превосходно работает даже при отключённом JavaScript (в том числе, и в IE6);</li>
<li>Благодаря использованию CSS rollover достаточно всего лишь одного HTTP-запроса (в отличие от реализаций, где используются списки с элементами <code>img</code>).</li>
</ol>
<p><a href="http://www.site-creator.info/html/rate/main.html" rel="nofollow">Еще одно красивое решение от site-creator.info</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/173-five-stars-without-javascript/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/css/173-five-stars-without-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Пять советов верстальщику</title>
		<link>http://blog.sjinks.pro/css/171-five-tips-my-five-cents/</link>
		<comments>http://blog.sjinks.pro/css/171-five-tips-my-five-cents/#comments</comments>
		<pubDate>Tue, 27 May 2008 22:17:43 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=171</guid>
		<description><![CDATA[Мои пять копеек Принимая эстафету, организованную Никитой Селецким, от Максима Покровского, добавляю свои пять копеек в копилку советов по вёрстке. Изучайте стандарты W3C. Как это ни банально звучит, хороший верстальщик (да и web-разработчик) просто обязан (пусть не наизусть) знать и понимать спецификации. Недавно в книжном магазине видел книжку по верстке. Лучше бы я её не [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/171-five-tips-my-five-cents/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Мои пять копеек</em></h2>
<p>Принимая эстафету, организованную <a href="http://seleckis.lv/journal/css/5-sovetov-verstalschiku">Никитой Селецким</a>, от <a href="http://pokrovskii.com/5-sovetov-verstalshhiku">Максима Покровского</a>, добавляю свои пять копеек в копилку советов по вёрстке.</p>
<ol>
<li><strong>Изучайте стандарты W3C.</strong> Как это ни банально звучит, хороший верстальщик (да и web-разработчик) просто обязан (пусть не наизусть) знать и понимать спецификации. Недавно в книжном магазине видел книжку по верстке. Лучше бы я её не видел: вложенные таблицы, архаичные тэги и всё в том же духе. Так вот: такие книги&nbsp;&mdash;&nbsp;зло. Всё, что надо знать, есть в спецификациях <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Следствия из данной рекомендации: да здравствует семантическая вёрстка; Vaild <a href="http://blog.sjinks.pro/tag/xhtml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XHTML">XHTML</a>/<a href="http://blog.sjinks.pro/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CSS">CSS</a> forever (тем не менее, это не должно быть самоцелью).</li>
<li><strong>Дизайн должен быть кросс-браузерным.</strong> Internet Explorer уже давно не единственный браузер, которым пользуются люди, но, тем не менее, существует большое количество сайтов, которые написаны исключительно под IE. Так вот, это неправильно. Дизайн (равно как и код) нужно тщательно тестировать в как можно большем количестве браузеров. Для тех, кто под Windows, вообще райская жизнь: на одной машине без проблем уживаются <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a>/7, FireFox, Opera, Safari и даже Konqueror из виндового порта KDE4. Затраты времени на тест в различных браузерах окупаются: заказчики имеют тенденцию смотреть на дизайн в экзотических браузерах, и когда всё отлично смотрится с первого раза, их приятно удивляет. А приятное удивление заказчика оборачивается бонусами для исполнителя <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li><strong>Помните про <a href="http://blog.sjinks.pro/tag/usability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  usability">usability</a> и accessibility.</strong> Тестируйте сайт с выключенными картинками, JavaScript и CSS (в различных комбинациях). Страница без CSS позволяет получить представление о том, как поисковик воспринимает страницу. Контент в самом низу? Что же удивляться, что Гугол недооценивает сайт? Или поставьте себя на место человека с ограниченными способностями, использующего скринридер. Хватит ли у Вас терпения, чтобы прослушать главную страницу Вашего сайта? Или Вам это надоест, когда скринридер пойдет читать <a href="http://blog.sjinks.pro/tag/menu/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  меню">меню</a> навигации? Отключили JavaScript и развалился дизайн/не отправляется форма? Далеко не все пользователи включают JavaScript. И если для правильного отображения сайта требуется то, что может не быть доступно всем пользователям&nbsp;&mdash;&nbsp;это минус.</li>
<li><strong>Изучайте работу мастеров.</strong> Это полезно. Только ключевое слово&nbsp;&mdash;&nbsp;<em>изучайте</em>. Если слепо передрать код/<a href="http://blog.sjinks.pro/tag/layout/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  макет">макет</a>/нужное подставить без понимания того, что там происходит&nbsp;&mdash;&nbsp;это нехорошо. А если разобраться с кодом, то приобретаются знания и опыт. Как говорится, знание&nbsp;&mdash;&nbsp;сила.</li>
<li><strong>Упрощайте.</strong> Если код можно упростить, его нужно упростить. Во-первых, так понятнее, во-вторых&nbsp;&mdash;&nbsp;чище, в-третьих&nbsp;&mdash;&nbsp;размер страницы уменьшается. Суп из <code>div</code>'ов ничуть не лучше вложенных таблиц, поверьте.</li>
</ol>
<p>Вроде всё&hellip; Эстафету передавать мне особо некому (разве что Вам, <a href="http://www.w3school.ru/blog/">Всеволод</a>), поэтому подхватывайте все желающие <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/171-five-tips-my-five-cents/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/css/171-five-tips-my-five-cents/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Аккордеон на CSS без использования JavaScript</title>
		<link>http://blog.sjinks.pro/css/100-css-accordion-without-javascript/</link>
		<comments>http://blog.sjinks.pro/css/100-css-accordion-without-javascript/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 18:17:49 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[аккордеон]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=100</guid>
		<description><![CDATA[Простой аккордеон без использования JavaScript В статье "парочка аккордеонов" я рассказывал, как сделать простой аккордеон с использованием JavaScript. Однако, будучи "certified CSS&#160;2.0 designer" и "certified XHTML&#160;1.0 designer", я не смог удержаться, чтобы не сделать аккордеон без JavaScript (только на CSS/XHTML). IE6 потребуется несколько иная разметка, чем нормальным браузерам (об этом можно прочитать в статье "Кросс-браузерное [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/100-css-accordion-without-javascript/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Простой <a href="http://blog.sjinks.pro/tag/accordion/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  аккордеон">аккордеон</a> без использования JavaScript</em></h2>
<p>В статье "<a href="http://blog.sjinks.pro/javascript/91-couple-of-accordions/"><strong>парочка аккордеонов</strong></a>" я рассказывал, как сделать простой аккордеон с использованием JavaScript. Однако, будучи "certified <a href="http://blog.sjinks.pro/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CSS">CSS</a>&nbsp;2.0 designer" и "certified <a href="http://blog.sjinks.pro/tag/xhtml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XHTML">XHTML</a>&nbsp;1.0 designer", я не смог удержаться, чтобы не сделать аккордеон <strong>без JavaScript</strong> (только на CSS/XHTML).<span id="more-100"></span></p>
<p><a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a> потребуется несколько иная <a href="http://blog.sjinks.pro/tag/markup/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  разметка">разметка</a>, чем нормальным браузерам (об этом можно прочитать в статье "<a href="http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/"><strong>Кросс-браузерное одноуровневое вертикальное меню без JavaScript</strong></a>"), поэтому я сразу привожу разметку, которая подойдёт для всех браузеров (за основу взята разметка из статьи "<a href="http://blog.sjinks.pro/javascript/91-couple-of-accordions/"><strong>парочка аккордеонов</strong></a>"):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p10026">
        <div class="code xhtml" id="p100code26">
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;accordion&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Item 1<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 1.1<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 1.2<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 1.3<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 1.4<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;active&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Item 2<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 2.1<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 2.2<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 2.3<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 2.4<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Item 3<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 3.1<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 3.2<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Item 4<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 4.1<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>SubItem 4.2<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span>
        </div>
    </div>
</div>

<p>Теперь CSS для нормальных браузеров:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p10027">
        <div class="code css" id="p100code27">
a <span class="br0">&#123;</span> <span class="kw1">text-decoration</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span> <span class="kw1">color</span><span class="sy0">:</span> <span class="re0">#00F</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
a<span class="re2">:hover </span><span class="br0">&#123;</span> <span class="kw1">text-decoration</span><span class="sy0">:</span> <span class="kw2">underline</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
<span class="re0">#accordion</span> a <span class="br0">&#123;</span> <span class="kw1">outline</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span> <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
<span class="re0">#accordion</span><span class="sy0">,</span> <span class="re0">#accordion</span> ul<span class="sy0">,</span> <span class="re0">#accordion</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">list-style</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="re0">#CCC</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">150px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">40px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> <span class="sy0">&gt;</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="re0">#CCC</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="re3">2px</span> <span class="re3">5px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/* Update 11-May-2008: в IE7 эта конструкция не работает<br />
#accordion &gt; li:not([class=&quot;active&quot;]) ul {<br />
&nbsp; &nbsp; display: none;<br />
}<br />
/**/</span><br />
<span class="coMULTI">/* Для максимальной совместимости с IE7 используем следующие<br />
&nbsp; &nbsp;два правила (их теоретически можно было сделать видимыми только <br />
&nbsp; &nbsp;для IE7, но смысла загромождать код нет :-) ). Легко заметить, что<br />
&nbsp; &nbsp;эти два правила есть инверсия предыдущего закомментированного правила */</span><br />
<span class="re0">#accordion</span> <span class="sy0">&gt;</span> li<span class="br0">&#91;</span>class<span class="sy0">=</span><span class="st0">&quot;active&quot;</span><span class="br0">&#93;</span> ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> <span class="sy0">&gt;</span> li ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> <span class="sy0">&gt;</span> li<span class="re2">:hover </span>ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> <span class="sy0">&gt;</span> li<span class="re2">:last-child </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#accordion</span> li<span class="re1">.active</span> <span class="sy0">&gt;</span> a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">color</span><span class="sy0">:</span> <span class="kw2">red</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Не забудем про IE6:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p10028">
        <div class="code css" id="p100code28">
<span class="sy0">*</span> html <span class="re0">#accordion</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="re0">#CCC</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="re3">2px</span> <span class="re3">5px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/* IE7 не понимает last-child */</span><br />
<span class="sy0">*</span><span class="re2">:first-child</span><span class="sy0">+</span>html <span class="re0">#accordion</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-bottom</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li<span class="re1">.active</span> a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">color</span><span class="sy0">:</span> <span class="kw2">red</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li<span class="re1">.active</span> ul a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">color</span><span class="sy0">:</span> <span class="kw1">blue</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li table <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li<span class="re1">.active</span> table <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li a<span class="re2">:hover </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">static</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/* Спасибо Ивану Маркееву (http://markeev.labwr.ru) за замеченную опечатку */</span><br />
<span class="sy0">*</span> html <span class="re0">#accordion</span> li a<span class="re2">:hover </span>table <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p><a href="http://blog.sjinks.pro/test/accordion/accordion3.html">Рабочий пример</a>.</p>
<p class="centered"><a href="http://www.odesk.com/users/~~2a9d5e50f22b834c"><img src="http://www.odesk.com/api/exams/32167/image" alt="oDesk Certified CSS 2.0 Designer"/></a> <a href="http://www.odesk.com/users/~~2a9d5e50f22b834c"><img src="http://www.odesk.com/api/exams/35154/image" alt="oDesk Certified XHTML 1.0 Designer"/></a></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/100-css-accordion-without-javascript/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/css/100-css-accordion-without-javascript/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Google Adsense и XHTML</title>
		<link>http://blog.sjinks.pro/html/67-google-adsense-and-xhtml/</link>
		<comments>http://blog.sjinks.pro/html/67-google-adsense-and-xhtml/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 18:50:36 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Adsense]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[IE7]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=67</guid>
		<description><![CDATA[Как заставить Adsense работать на XHTML-страницах Не секрет, что Adsense для вставки рекламы использует &#60;iframe&#62;. Не секрет, что для вставки этого &#60;iframe&#62; используется самый простой метод&#160;&#8212;&#160;document.write(). Какими же проблемами это грозит? Частично отвечая на вопрос, почему это не работает для XHTML-документов? Сразу оговорюсь, что не работает это не для всех документов, а только для тех, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/html/67-google-adsense-and-xhtml/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как заставить Adsense работать на <a href="http://blog.sjinks.pro/tag/xhtml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XHTML">XHTML</a>-страницах</em></h2>
<p>Не секрет, что Adsense для вставки рекламы использует <code>&lt;iframe&gt;</code>. Не секрет, что для вставки этого <code>&lt;iframe&gt;</code> используется самый простой метод&nbsp;&mdash;&nbsp;<code>document.write()</code>. Какими же проблемами это грозит? Частично отвечая на вопрос, почему это не работает для XHTML-документов?<span id="more-67"></span></p>
<p>Сразу оговорюсь, что не работает это не для всех документов, а только для тех, которые, как и полагается XHTML-документам, выдаются с <code>Content-Type: application/xhtml+xml</code>.</p>
<p>Итак, для "настоящих XHTML-документов" возникает две проблемы:</p>
<ol>
<li><code>document.write()</code> не работает;</li>
<li>В XHTML&nbsp;1.1/XHTML&nbsp;1.0&nbsp;Strict элемента <code>&lt;iframe&gt;</code> нет.</li>
</ol>
<p>Основной является первая проблема. Тем не менее, даже если заменить <code>document.write</code> другой конструкцией (<code>document.createElement()</code>/<code>document.createElementNS()</code>&nbsp;+ <code>node.appendChild()</code> или аналогичной), то в результате получим невалидный XHTML-код (который <em>может</em> не отображаться в валидирующих браузерах&nbsp;&mdash;&nbsp;я <em>слышал</em>, что это свойственно Konqueror).</p>
<p>Как же с этим бороться? Как уже было сказано, в современных версиях XHTML элемента <code>&lt;iframe&gt;</code> нет. Но есть другой, не менее известный элемент&nbsp;&mdash;&nbsp;<code>&lt;object&gt;</code>. Теоретически можно сохранить скрипт <a href="http://blog.sjinks.pro/tag/google/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google">Google</a> AdSense локально, изменить его, научив использовать <code>document.createElement()</code>/<code>document.createElementNS()</code> и <code>&lt;object&gt;</code> вместо <code>&lt;iframe&gt;</code>. Вот только имеет ли это смысл? </p>
<p>Идём дальше. Как уже было сказано выше, источник проблем здесь&nbsp;&mdash;&nbsp;специфический Content-Type (или, если смотреть глубже, кривые руки разработчиков Google&nbsp;&mdash;&nbsp;кому какой вариант нравится больше). То есть если страница будет выдаваться как, например, text/<a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">html</a>, то AdSense будет работать. А если это соединить с <code>&lt;object&gt;</code>, то получим готовое решение.</p>
<p>Выглядеть это будет так: на странице, на которой <em>должны</em> быть объявления, <em>вместо</em> кода <a href="http://blog.sjinks.pro/tag/google-adsense/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google Adsense">Google Adsense</a> помещаем следующий код:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6733">
        <div class="code xhtml" id="p67code33">
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">object</span> <span class="kw3">data</span><span class="sy0">=</span><span class="st0">&quot;adsense.html&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/html&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">object</span>&gt;</span>
        </div>
    </div>
</div>

<p>Сама же страница adsense.html будет выглядеть следующим образом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6734">
        <div class="code html" id="p67code34">
<span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">html</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">head</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">title</span>&gt;</span>Google Adsense - Disable Me in Adblock :-)<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">title</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">meta</span> <span class="kw3">http-equiv</span><span class="sy0">=</span><span class="st0">&quot;Content-Type&quot;</span> <span class="kw3">content</span><span class="sy0">=</span><span class="st0">&quot;text/html; charset=utf-8&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">style</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; html, body { margin: 0; padding: 0; border: 0; }<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">style</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">head</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">body</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span>&gt;</span>//<span class="sc-2">&lt;!--</span><br />
<span class="sc-2"> &nbsp; &nbsp; &nbsp; &nbsp;google_ad_client = &quot;pub-5756520316076607&quot;;</span><br />
<span class="sc-2"> &nbsp; &nbsp; &nbsp; &nbsp;google_ad_slot = &quot;5162144530&quot;;</span><br />
<span class="sc-2"> &nbsp; &nbsp; &nbsp; &nbsp;google_ad_width = 468;</span><br />
<span class="sc-2"> &nbsp; &nbsp; &nbsp; &nbsp;google_ad_height = 60;</span><br />
<span class="sc-2"> &nbsp; &nbsp;//--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">script</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">script</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">body</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">html</span>&gt;</span>
        </div>
    </div>
</div>

<p>Разумеется, следует использовать <em>свои</em> параметры AdSense.</p>
<p>Если сервер настроен выдавать статические .html-страницы с <code>Content-Type: application/xhtml+xml</code> (или любым другим, кроме <code>text/html</code>), то это, разумеется, надо поправить (как именно&nbsp;&mdash;&nbsp;зависит от сервера). Например, для Apache это может выглядеть следующим образом (предполагается, что эти строки будут добавлены в файл .htaccess, находящийся в том же каталоге, что и adsense.html):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6735">
        <div class="code apache" id="p67code35">
&lt;<span class="kw3">Files</span> adsense.html&gt;<br />
&nbsp; &nbsp; <span class="kw1">ForceType</span> text/html<br />
&lt;/<span class="kw3">Files</span>&gt;
        </div>
    </div>
</div>

<p><strong>Update:</strong> мне всё же интересно, будут ли объявления в этом случае контекстно-зависимыми? Ведь по большому счету, referer'ом скрипта <code>http://pagead2.googlesyndication.com/pagead/show_ads.js</code> будет страница adsense.html, а не та, на которой эта реклама должна отображаться&hellip; И проверить из-за проблем с аккаунтом не могу <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p><strong>Update:</strong> <a href="http://www.cssplay.co.uk/menu/adsense.html" rel="nofollow">Stu Nicholls</a> нашел еще одну скрытую ошибку: дело в том, что при нажатии на ссылку в рекламном блоке, Internet Explorer откроет её не в главном окне (как это должно быть), а внутри тэга <code>&lt;object&gt;</code>.</p>
<p>Stu Nicholls предлагает следующее решение проблемы: использовать условные комментарии для того, чтобы не использовать <code>&lt;object&gt;</code> в IE (в любом случае, IE пока не понимает <code>application/xhtml+xml</code>, так что использование небольшого хака для IE не будет критичным). Я немного изменил предложенный код так, чтобы IE вообще не видел тэг <code>&lt;object&gt;</code> (нечто подобное было сделано в статье "<a href="http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/">Кросс-браузерное одноуровневое вертикальное меню без JavaScript</a>")</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6736">
        <div class="code xhtml" id="p67code36">
<span class="sc-2">&lt;!--[if gt IE 8]&gt;&lt;!--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">object</span> <span class="kw3">data</span><span class="sy0">=</span><span class="st0">&quot;adsense.html&quot;</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/html&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">object</span>&gt;</span><br />
<span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
<span class="sc-2">&lt;!--[if lte IE 8]&gt;</span><br />
<span class="sc-2"> &nbsp; &nbsp;&lt;script type=&quot;text/javascript&quot;&gt;</span><br />
<span class="sc-2"> &nbsp; &nbsp; &nbsp; &nbsp;google_ad_client = &quot;pub-5756520316076607&quot;;</span><br />
<span class="sc-2"> &nbsp; &nbsp; &nbsp; &nbsp;google_ad_slot = &quot;5162144530&quot;;</span><br />
<span class="sc-2"> &nbsp; &nbsp; &nbsp; &nbsp;google_ad_width = 468;</span><br />
<span class="sc-2"> &nbsp; &nbsp; &nbsp; &nbsp;google_ad_height = 60;</span><br />
<span class="sc-2"> &nbsp; &nbsp;&lt;/script&gt;</span><br />
<span class="sc-2"> &nbsp; &nbsp;&lt;script type=&quot;text/javascript&quot; src=&quot;http://pagead2.googlesyndication.com/pagead/show_ads.js&quot;&gt;&lt;/script&gt;</span><br />
<span class="sc-2">&lt;![endif]--&gt;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/html/67-google-adsense-and-xhtml/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/html/67-google-adsense-and-xhtml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Размещение блока неизвестного размера в центре страницы при помощи CSS</title>
		<link>http://blog.sjinks.pro/css/59-placing-object-of-unknown-size-in-the-center-of-the-page/</link>
		<comments>http://blog.sjinks.pro/css/59-placing-object-of-unknown-size-in-the-center-of-the-page/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 06:43:33 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[IE7]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[макет]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[хак]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=59</guid>
		<description><![CDATA[Как разместить блок неизвестного размера точно в центре страницы Гуляя по Internet, совершенно случайно натолкнулся на статью "Стили CSS - центрируем объекты по центру веб-страницы". Первой мыслью было, что автор начнёт рассказывать про вертикальное центрирование и всем известный margin: 0 auto. Но не тут-то было, всё гораздо интереснее Статья, на которую я наткнулся&#160;&#8212;&#160;это перевод статьи [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/59-placing-object-of-unknown-size-in-the-center-of-the-page/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как разместить блок неизвестного размера точно в центре страницы</em></h2>
<p>Гуляя по Internet, совершенно случайно натолкнулся на статью "<a href="http://www.w3school.ru/blog/css/how-to-center-an-object-exactly-in-the-center.html">Стили CSS - центрируем объекты по центру веб-страницы</a>".</p>
<p>Первой мыслью было, что автор начнёт рассказывать про <a href="http://blog.sjinks.pro/css/24-vertical-align-without-tables/">вертикальное центрирование</a> и всем известный <code>margin: 0 auto</code>. Но не тут-то было, всё гораздо интереснее <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <span id="more-59"></span></p>
<p>Статья, на которую я наткнулся&nbsp;&mdash;&nbsp;это перевод статьи Криса Койера (Chris Coyier) <a href="http://css-tricks.com/quick-css-trick-how-to-center-an-object-exactly-in-the-center/">Quick CSS Trick: How To Center an Object Exactly In The Center</a>. При этом высота и ширина центрируемого объекта в статье полагаются известными. Что ж, я ожидал чего-то большего.</p>
<p>Я сначала вкратце опишу идею Криса, потом расскажу, почему так не надо делать и затем покажу, что простого решения, удовлетворяющего всем требованиям, нет <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Начнём. Пусть у нас имеется, например, <code>&lt;div&gt;</code> размерами 200&times;100&nbsp;пикселей. Поступаем следующим образом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5947">
        <div class="code css" id="p59code47">
<span class="re1">.centered</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">fixed</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="re3"><span class="nu0">50</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">left</span><span class="sy0">:</span> <span class="re3"><span class="nu0">50</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-top</span><span class="sy0">:</span> <span class="re3">-50px</span><span class="sy0">;</span> <span class="coMULTI">/* 50% высоты */</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">-100px</span><span class="sy0">;</span> &nbsp;<span class="coMULTI">/* 50% ширины */</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3">100px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">200px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Начнём с того, что <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a> <code>position: fixed</code> очень плохо понимает. Для него нужно добавить небольшой <a href="http://blog.sjinks.pro/tag/hack/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  хак">хак</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5948">
        <div class="code css" id="p59code48">
<span class="sy0">*</span> html <span class="re1">.centered</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">absolute</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Теперь о минусах:</p>
<ul>
<li>размеры блока должны быть известны;</li>
<li>при уменьшении окна так, чтобы оно перекрывало отцентрированный объект, скроллер хотя и появляется, но прокрутить отцентрированный объект не сможет (из-за <code>position: fixed</code>);</li>
<li>при уменьшении ширины окна можно дойти до такого размера, когда у объекта границы станут отрицательными.</li>
</ul>
<p>Теперь о реализации центрирования в общем виде (считаем, что высота объекта нам неизвестна; ширина же должна быть известной, так как блочный элемент, не имеющий явно заданной ширины автоматически получает <code>width: 100%</code>). Решение основывается на идеях, представленных в следующих статьях:</p>
<ul>
<li><a href="http://blog.sjinks.pro/css/24-vertical-align-without-tables/"><strong>Вертикальное выравнивание без таблиц</strong></a>;</li>
<li><a href="http://blog.sjinks.pro/css/15-footer-in-the-very-bottom/"><strong>Нижний колонтитул&nbsp;&mdash;&nbsp;в нижней части страницы</strong></a>;</li>
<li><a href="http://blog.sjinks.pro/css/55-css-hacks-and-filters-for-different-browsers/"><strong>Подборка CSS-хаков для различных браузеров</strong></a>.</li>
</ul>
<p>Разметка:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5949">
        <div class="code xhtml" id="p59code49">
<span class="sc2">&lt;<span class="kw2">body</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;outer&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;middle&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;inner&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ego autem quem timeam lectorem, cum ad te ne Graecis quidem cedentem in philosophia audeam scribere?<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">body</span>&gt;</span>
        </div>
    </div>
</div>

<p>Прочитавшим статью "<a href="http://blog.sjinks.pro/css/24-vertical-align-without-tables/">Вертикальное выравнивание без таблиц</a>" должно быть ясно, откуда "растут ноги" у этой разметки.</p>
<p>Стили будут почти аналогичными приведённым в той статье, но с небольшими изменениями для IE.<br />
Начнём со стилей для нормальных браузеров:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5950">
        <div class="code css" id="p59code50">
html <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
html<span class="sy0">,</span> body <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#outer</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span> <span class="coMULTI">/* В этом случае нельзя использовать min-height. Для таблиц (элементов с display: table) мир устроен иначе */</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> table<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">vertical-align</span><span class="sy0">:</span> <span class="kw2">middle</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">600px</span><span class="sy0">;</span> <span class="coMULTI">/* Если ширина не задана явно, будет 100% */</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> 0 <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#middle</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">table-row</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">vertical-align</span><span class="sy0">:</span> <span class="kw2">middle</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#inner</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">table-cell</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">vertical-align</span><span class="sy0">:</span> <span class="kw2">middle</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Теперь стили для Ишака. Я бы поместил их в условный комментарий, например, так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5951">
        <div class="code xhtml" id="p59code51">
<span class="sc-2">&lt;!--[if lte IE 7]&gt;</span><br />
<span class="sc-2"> &nbsp; &nbsp;&lt;style type=&quot;text/css&quot;&gt;...&lt;/style&gt;</span><br />
<span class="sc-2">&lt;![endif]--&gt;</span>
        </div>
    </div>
</div>

<p>Вышеприведённый условный комментарий <strong>не должен</strong> работать для <a href="http://blog.sjinks.pro/tag/ie8/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE8">IE8</a>, и это сделано специально: во-первых, <a href="http://blog.sjinks.pro/tag/ie8/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE8">IE8</a> поддерживает <code>display: table</code>, <code>display: table-row</code> и <code>display: table-cell</code>; во-вторых, будучи <a href="http://blog.sjinks.pro/css/27-why-microsoft-calls-alpha-beta-or-what-acid-tests-are-for/">бетой</a>, он не поддерживает <code>vertical-align</code> ни в каком виде. В общем, когда Microsoft выпустит полноценный браузер, тогда и будем думать <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Стили для Internet Explorer:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5952">
        <div class="code css" id="p59code52">
<span class="sy0">*</span> <span class="sy0">&gt;</span> html body <span class="br0">&#123;</span> <span class="coMULTI">/* Выравниваем блок по центру для IE4-IE5.5 */</span><br />
&nbsp; &nbsp; <span class="kw1">text-align</span><span class="sy0">:</span> <span class="kw2">center</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#outer</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#middle</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="re3"><span class="nu0">50</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span> <span class="coMULTI">/* Не используем абсолютное позиционирование, чтобы избежать проблем с прокруткой */</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#inner</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="re3">-<span class="nu0">50</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Если посмотреть на то, что <a href='http://static.sjinks.info/wp-content/uploads/2008/04/center0.html'>получилось</a>, можно заметить, что это один из тех случаев, когда код работает корректно в IE6, но не в <a href="http://blog.sjinks.pro/tag/ie7/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE7">IE7</a> (последний будет показывать совершенно ненужный отступ снизу). Если вспомнить статью "<a href="http://blog.sjinks.pro/css/24-vertical-align-without-tables/">Вертикальное выравнивание без таблиц</a>"), то там мы ставили <code>overflow: hidden</code> элементу <code>#outer</code>, чтобы избежать подобного рода неприятностей в IE6/7. И, хотя в IE6 можно обойтись и без этого (перейдя от абсолютного позиционирования к относительному), с IE7 всё не так просто. В качестве быстрого исправления можно предложить такой вариант:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5953">
        <div class="code css" id="p59code53">
<span class="sy0">*</span><span class="re2">:first-child</span><span class="sy0">+</span>html <span class="re0">#outer</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; overflow-x<span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Что характерно, будет работать хоть <code>overflow-x</code>, хоть <code>overflow-y</code>.</p>
<p>В <a href='http://static.sjinks.info/wp-content/uploads/2008/04/center1.html'>результате</a> получаем код, который работает нормально везде, кроме IE7: в IE7 при уменьшении размера окна по вертикали полоса прокрутки появляться не будет. Сделать <em>нормальную</em> прокрутку непосредственно для элемента <code>#outer</code> также представляется проблематичным&nbsp;&mdash;&nbsp;нижний отступ будет слишком большим. Поэтому остаётся одно решение&nbsp;&mdash;&nbsp;таблица. Причём можно сделать так, что таблицу будет видеть только IE7:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5954">
        <div class="code xhtml" id="p59code54">
<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; class=&quot;outer&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp;<span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;outer&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;middle&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;inner&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ego autem quem timeam lectorem, cum ad te ne Graecis quidem cedentem in philosophia audeam scribere? quamquam a te ipso id quidem facio provocatus gratissimo mihi libro, quem ad me de virtute misisti. Sed ex eo credo quibusdam usu venire; ut abhorreant a Latinis, quod inciderint in inculta quaedam et horrida, de malis Graecis Latine scripta deterius. quibus ego assentior, dum modo de isdem rebus ne Graecos quidem legendos putent. res vero bonas verbis electis graviter ornateque dictas quis non legat? nisi qui se plane Graecum dici velit, ut a Scaevola est praetore salutatus Athenis Albucius.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;![endif]--&gt;</span>
        </div>
    </div>
</div>

<p>По большому счёту, это извращение&nbsp;&mdash;&nbsp;ибо проще всего использовать таблицу для всех браузеров. Но проще не значит лучше, ибо очень часто встречаются ситуации, когда заказчики требуют, чтобы вёрстка была семантической (а когда видят "незапланированную таблицу", начинают громко ругаться). Правда, в этом случае для IE7 семантика теряется, но, как заметил <cite><a href="http://pokrovskii.com/">Максим Покровский</a></cite>, <q cite="http://blog.sjinks.pro/css/53-cross-browser-hybrid-css-menu-without-javascript/#comment-26">для него [IE], вообще, много чего теряется&hellip;</q>.</p>
<p>Итак, для комбинированного решения у нас получаются следующие стили для IE:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5955">
        <div class="code css" id="p59code55">
<span class="sy0">*</span> <span class="sy0">&gt;</span> html body <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">text-align</span><span class="sy0">:</span> <span class="kw2">center</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#outer</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#middle</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="re3"><span class="nu0">50</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#inner</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="re3">-<span class="nu0">50</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span><span class="re2">:first-child</span><span class="sy0">+</span>html table<span class="re1">.outer</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">600px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> 0 <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span><span class="re2">:first-child</span><span class="sy0">+</span>html table<span class="re1">.outer</span> tbody <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">vertical-align</span><span class="sy0">:</span> <span class="kw2">middle</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Результат можно посмотреть на <a href='http://static.sjinks.info/wp-content/uploads/2008/04/center.html'>этой странице</a>.</p>
<p>Есть еще один вариант решения, но он полагается на использование JavaScript в IE:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5956">
        <div class="code xhtml" id="p59code56">
<span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">html</span> xmlns<span class="sy0">=</span><span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">head</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">title</span>&gt;</span>Centering<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">title</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">style</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;text/css&quot;</span>&gt;</span><br />
html, body {<br />
&nbsp; &nbsp; margin: 0;<br />
&nbsp; &nbsp; padding: 0;<br />
&nbsp; &nbsp; height: 100%;<br />
&nbsp; &nbsp; width: 100%;<br />
}<br />
<br />
html {<br />
&nbsp; &nbsp; display: table;<br />
&nbsp; &nbsp; overflow: auto;<br />
}<br />
<br />
body {<br />
&nbsp; &nbsp; display: table-cell;<br />
&nbsp; &nbsp; vertical-align: middle;<br />
}<br />
<br />
.item {<br />
&nbsp; &nbsp; margin: 0 auto;<br />
&nbsp; &nbsp; width: 600px;<br />
}<br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">style</span>&gt;</span><br />
<span class="sc-2">&lt;!--[if lte IE 7]&gt;</span><br />
<span class="sc-2">&lt;style type=&quot;text/css&quot;&gt;</span><br />
<span class="sc-2">* &gt; html body {</span><br />
<span class="sc-2"> &nbsp; &nbsp;text-align: center;</span><br />
<span class="sc-2">}</span><br />
<br />
<span class="sc-2">.item {</span><br />
<span class="sc-2"> &nbsp; &nbsp;margin-top: expression(this.offsetHeight &lt; this.parentNode.offsetHeight ? parseInt((this.parentNode.offsetHeight - this.offsetHeight) / 2) + 'px' : 0);</span><br />
<span class="sc-2">}</span><br />
<span class="sc-2">&lt;/style&gt;</span><br />
<span class="sc-2">&lt;![endif]--&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">head</span>&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">body</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;item&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Ego autem quem timeam lectorem, cum ad te ne Graecis quidem cedentem in philosophia audeam scribere? quamquam a te ipso id quidem facio provocatus gratissimo mihi libro, quem ad me de virtute misisti. Sed ex eo credo quibusdam usu venire; ut abhorreant a Latinis, quod inciderint in inculta quaedam et horrida, de malis Graecis Latine scripta deterius. quibus ego assentior, dum modo de isdem rebus ne Graecos quidem legendos putent. res vero bonas verbis electis graviter ornateque dictas quis non legat? nisi qui se plane Graecum dici velit, ut a Scaevola est praetore salutatus Athenis Albucius.<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">body</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">html</span>&gt;</span>
        </div>
    </div>
</div>

<p>Результат можно посмотреть <a href='http://static.sjinks.info/wp-content/uploads/2008/04/center2.html'>здесь</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/59-placing-object-of-unknown-size-in-the-center-of-the-page/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/css/59-placing-object-of-unknown-size-in-the-center-of-the-page/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Кросс-браузерное всплывающее гибридное меню на CSS без использования JavaScript</title>
		<link>http://blog.sjinks.pro/css/53-cross-browser-hybrid-css-menu-without-javascript/</link>
		<comments>http://blog.sjinks.pro/css/53-cross-browser-hybrid-css-menu-without-javascript/#comments</comments>
		<pubDate>Sun, 23 Mar 2008 04:33:58 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[кросс-браузерное решение]]></category>
		<category><![CDATA[меню]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/css/53-cross-browser-hybrid-css-menu-without-javascript/</guid>
		<description><![CDATA[Реализация кросс-браузерного горизонтального меню на чистом CSS 3 без использования JavaScript Ранее я уже говорил о причинах, побудивших меня сделать меню на чистом CSS без использования JavaScript. Борясь с IE6, у меня получилась красивая версия вертикального меню &#8212; его реализация оказалась проще. Теперь обещанное горизонтальное меню. Требования, которые я поставил: Нельзя использовать JavaScript; Полученный код [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/53-cross-browser-hybrid-css-menu-without-javascript/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Реализация кросс-браузерного горизонтального <a href="http://blog.sjinks.pro/tag/menu/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  меню">меню</a> на чистом <a href="http://blog.sjinks.pro/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CSS">CSS</a> 3 без использования JavaScript</em></h2>
<p><a href="http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/">Ранее</a> я уже говорил о причинах, побудивших меня сделать меню на чистом CSS без использования JavaScript. Борясь с <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a>, у меня получилась красивая версия <a href="http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/">вертикального меню</a> &mdash; его реализация оказалась проще. Теперь обещанное горизонтальное меню.<span id="more-53"></span></p>
<p>Требования, которые я поставил:</p>
<ol>
<li>Нельзя использовать JavaScript;</li>
<li>Полученный код (CSS и <a href="http://blog.sjinks.pro/tag/xhtml/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XHTML">XHTML</a>) должен успешно проходить валидацию.</li>
</ol>
<p>Разметка для тестового примера была взята из <a href="http://pokrovskii.com/vsplyivayuschee-gibridnoe-menyu-na-css-hybrid-css-dropdowns/">этой статьи</a> (которая и сподвигла меня на написание своего меню). В <a href="http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/">предыдущей статье</a> код пришлось немного переработать (а всё из-за необходимости поддерживать IE6), и именно эту переработанную версию кода мы будем использовать.</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5361">
        <div class="code xhtml" id="p53code61">
<span class="sc2">&lt;<span class="kw2">ul</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;menu&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Renaissance<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Brunelleschi<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Alberti<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Palladio<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Michelangelo<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Bramante<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Art Nouveau<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Mackintosh<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Guimard<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Horta<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>van de Velde<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;on&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Modern<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Sullivan<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Le Corbusier<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Mies<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Gropius<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Yamasaki<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Postmodern<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Venturi<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Eisenman<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Stern<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Graves<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Gehry<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Digital<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Xenakis<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Lynn<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Diller+Scofidio<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Zellner<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Hadid<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span>
        </div>
    </div>
</div>

<p>Таблица стилей для браузеров, поддерживающих CSS&nbsp;2.1:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5362">
        <div class="code css" id="p53code62">
<span class="re0">#menu</span><span class="sy0">,</span> <span class="re0">#menu</span> li<span class="sy0">,</span> <span class="re0">#menu</span> ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">list-style</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw1">left</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3">2em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">line-height</span><span class="sy0">:</span> <span class="re3">2em</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw1">left</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="kw2">red</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">vertical-align</span><span class="sy0">:</span> <span class="kw2">middle</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> 0 <span class="re3">.5em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">100px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">absolute</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="re3">2em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">left</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-top</span><span class="sy0">:</span> <span class="re3">1px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="re0">#FFF</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li<span class="re1">.on</span> ul<span class="sy0">,</span> <span class="re0">#menu</span> li<span class="re2">:hover </span>ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">z-index</span><span class="sy0">:</span> <span class="nu0">10</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li<span class="re2">:hover </span>ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">z-index</span><span class="sy0">:</span> <span class="nu0">100</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li li a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="kw2">red</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">vertical-align</span><span class="sy0">:</span> <span class="kw2">middle</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> 0 <span class="re3">.5em</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Презентационные стили:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5363">
        <div class="code css" id="p53code63">
<span class="re0">#menu</span> <span class="sy0">&gt;</span> li <span class="sy0">+</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">-1px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li ul li <span class="sy0">+</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">-1px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">outline</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">text-decoration</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li<span class="re1">.on</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="kw2">yellow</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li<span class="re2">:hover </span>a<span class="sy0">,</span> <span class="re0">#menu</span> li a<span class="re2">:hover</span><span class="sy0">,</span> <span class="re0">#menu</span> li a<span class="re2">:hover </span>a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="re0">#EEE</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li ul li<span class="re2">:hover</span><span class="sy0">,</span> <span class="re0">#menu</span> li ul li a<span class="re2">:hover </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="re0">#EAFBFC</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Более детально это всё объяснено в <a href="http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/">предыдущей статье</a>.</p>
<p>Теперь будем лечить IE6. У меня этот процесс занял несколько часов, но результат стоил того &mdash; <em>оно работает</em>!!!</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5364">
        <div class="code css" id="p53code64">
<span class="sy0">*</span> html <span class="re0">#menu</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; overflow-x<span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span> <span class="coMULTI">/* Скрыть побочный эффект следующего исправления */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#menu</span> li ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">z-index</span><span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-top</span><span class="sy0">:</span> <span class="re3">2px</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">visible</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="coMULTI">/* Это исправляет неверное определение ширины - абсолютное значение width: 100% без этих строк было бы равно ширине родительского &lt;a&gt; */</span><br />
&nbsp; &nbsp; <span class="kw1">padding-right</span><span class="sy0">:</span> <span class="re3">1000em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-right</span><span class="sy0">:</span> <span class="re3">-1000em</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#menu</span> li<span class="re1">.on</span> a table<span class="sy0">,</span><br />
<span class="sy0">*</span> html <span class="re0">#menu</span> li a<span class="re2">:hover </span>table<br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">visibility</span><span class="sy0">:</span> <span class="kw2">visible</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#menu</span> li<span class="re1">.on</span> a table ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">z-index</span><span class="sy0">:</span> -<span class="nu0">1</span><span class="sy0">;</span> <span class="coMULTI">/* Ключевое исправление - без него меню правильно работать не будет. Предназначено для исправления последствий многочисленных багов в реализации z-index. Благодаря этому исправлению, все li a:hover table, находящиеся перед li.on table, будут нормально отображаться (не будут перекрываться li.on table) */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#menu</span> li a<span class="re2">:hover </span>table ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">z-index</span><span class="sy0">:</span> <span class="nu0">100</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#menu</span> li a<span class="re2">:hover </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">static</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/* У таблицы теперь статическая позиция. Абсолютное/относительное позиционирование вносит ужасный бедлам в и без того глючную реализацию z-index в IE6. */</span><br />
<span class="sy0">*</span> html <span class="re0">#menu</span> table <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border-collapse</span><span class="sy0">:</span> <span class="kw2">collapse</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">visibility</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p><strong>Замечания по реализации:</strong></p>
<ol>
<li>Из-за плохой поддержки <code>z-index</code> Ишаком возможны проблемы с <code>border-top/bottom</code> у крайних правых элементов меню;</li>
<li>Из-за того, что пришлось использовать overflow-x, CSS не валидируется в рамках спецификации CSS&nbsp;2.1 (но проходит валидацию CSS&nbsp;3).</li>
</ol>
<p>Тестовая страница лежит <a href='http://static.sjinks.info/wp-content/uploads/2008/03/hybrid-horizontal.html' title='hybrid-horizontal.html'>здесь</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/53-cross-browser-hybrid-css-menu-without-javascript/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/css/53-cross-browser-hybrid-css-menu-without-javascript/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Кросс-браузерное одноуровневое вертикальное меню без JavaScript</title>
		<link>http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/</link>
		<comments>http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/#comments</comments>
		<pubDate>Sun, 23 Mar 2008 01:45:46 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[whatever:hover]]></category>
		<category><![CDATA[кросс-браузерное решение]]></category>
		<category><![CDATA[меню]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[разметка]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/</guid>
		<description><![CDATA[Создание вертикального кросс-браузерного меню без использования JavaScript &#8212; чистый CSS! Так случилось, что срочно понадобилось сделать горизонтальное меню, причем для проекта, который нужно было сдавать вчера Естественно, самому писать не было времени, нужно было взять что-то готовое. Я недавно прочитал статью «Всплывающее гибридное меню на CSS», поэтому взял код именно оттуда. Но не в этом [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Создание вертикального кросс-браузерного <a href="http://blog.sjinks.pro/tag/menu/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  меню">меню</a> без использования JavaScript &mdash; чистый <a href="http://blog.sjinks.pro/tag/css/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  CSS">CSS</a>!</em></h2>
<p>Так случилось, что срочно понадобилось сделать горизонтальное меню, причем для проекта, который нужно было сдавать вчера <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Естественно, самому писать не было времени, нужно было взять что-то готовое. Я недавно прочитал статью «<a href="http://pokrovskii.com/vsplyivayuschee-gibridnoe-menyu-na-css-hybrid-css-dropdowns/">Всплывающее гибридное меню на CSS</a>», поэтому взял код именно оттуда. Но не в этом дело. У подавляющего большинства меню камнем преткновения становится <a href="http://blog.sjinks.pro/tag/ie6/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE6">IE6</a> — а всё из-за того, что он понимает <code>:hover</code> только для тэга <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">a</span>&gt;</span></code></span>. Когда-то у меня был заказчик, требовавший, чтобы всё одинаково работало с выключенным JavaScript'ом; вспомнив его, я решил попробовать сделать меню, работающее безо всякого JavaScript. Так получилось, что попутно я нашел еще один очень интересный глюк в IE6 (о нём далее), в борьбе с которым у меня получилось вертикальное меню.<span id="more-49"></span><br />
<script type="text/javascript">odl.register(initLightbox);</script><br />
Друг заметил, что смысла уродоваться не было, ибо есть <a href="http://www.xs4all.nl/~peterned/csshover.html">whatever:hover</a>, который применяется многими разработчиками. Для всех, кто такого же мнения, отмечу, что <a href="http://blog.sjinks.pro/tag/whateverhover/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  whatever:hover">whatever:hover</a> — это HTC-компонент, суть JavaScript, вследствие чего при выключенном JavaScript работать не будет. Помимо этого, <a href="http://blog.sjinks.pro/tag/whateverhover/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  whatever:hover">whatever:hover</a> <em>не будет</em> работать при динамическом построении меню. И еще его использование негативно сказывается на отклик IE при начальном рендеринге (в смысле, когда весь DOM уже загружен, и наступило время выполнять deferred-скрипты и грузить картинки).</p>
<p>Приступим.<br />
Разметку я взял все из той же <a href="http://pokrovskii.com/vsplyivayuschee-gibridnoe-menyu-na-css-hybrid-css-dropdowns/">статьи</a>, она (<a href="http://blog.sjinks.pro/tag/markup/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  разметка">разметка</a>) имеет следующий вид:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4971">
        <div class="code xhtml" id="p49code71">
<span class="sc2">&lt;<span class="kw2">ul</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;menu&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Renaissance<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Brunelleschi<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Alberti<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Palladio<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Michelangelo<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Bramante<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Art Nouveau<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Mackintosh<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Guimard<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Horta<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>van de Velde<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Modern<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Sullivan<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Le Corbusier<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Mies<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Gropius<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Yamasaki<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Postmodern<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Venturi<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Eisenman<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Stern<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Graves<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Gehry<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Digital<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Xenakis<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Lynn<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Diller+Scofidio<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Zellner<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Hadid<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span>
        </div>
    </div>
</div>

<p>Начнём с браузеров, поддерживающих CSS 2.1. Таблица стилей для них будет иметь следующий вид:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4972">
        <div class="code css" id="p49code72">
<span class="re0">#menu</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3">2em</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span><span class="sy0">,</span> <span class="re0">#menu</span> ul<span class="sy0">,</span> <span class="re0">#menu</span> ul li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">list-style</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw1">left</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3">2em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">line-height</span><span class="sy0">:</span> <span class="re3">2em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="kw2">red</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">vertical-align</span><span class="sy0">:</span> <span class="kw2">middle</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> 0 <span class="re3">.5em</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">absolute</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="re3">2em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">left</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="re3">1px</span> 0 0 <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="re0">#FFF</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">100px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li<span class="re2">:hover </span>ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li ul li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li ul li a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1px</span> <span class="kw2">solid</span> <span class="kw2">red</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">vertical-align</span><span class="sy0">:</span> <span class="kw2">middle</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> 0 <span class="re3">.5em</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Вся магия содержится в двух правилах:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4973">
        <div class="code css" id="p49code73">
<span class="re0">#menu</span> li ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">absolute</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="re3">2em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">left</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="re3">1px</span> 0 0 <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="re0">#FFF</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">100px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li<span class="re2">:hover </span>ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Первое задаёт размеры/позицию выпадающего меню; позиция вычисляется относительно родительского элемента <span class="codebox"><code class="css">&lt;li<span class="sy0">&gt;</span></code></span>. Второе же правило показывает выпадающее меню при наведении курсора мыши на заголовок. Ничего сложного.</p>
<p>Презентационные стили:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4974">
        <div class="code css" id="p49code74">
<span class="re0">#menu</span> <span class="sy0">&gt;</span> li <span class="sy0">+</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">-1px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li ul li <span class="sy0">+</span> li <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-top</span><span class="sy0">:</span> <span class="re3">-1px</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">outline</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">text-decoration</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li<span class="re2">:hover </span>a<span class="sy0">,</span> <span class="re0">#menu</span> li a<span class="re2">:hover </span>a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="re0">#EEE</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li li a<span class="sy0">,</span> <span class="re0">#menu</span> li<span class="re2">:hover </span>li a<span class="sy0">,</span> <span class="re0">#menu</span> li a<span class="re2">:hover </span>li a <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="re0">#FFF</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#menu</span> li ul li<span class="re2">:hover </span>a<span class="sy0">,</span> <span class="re0">#menu</span> li ul li a<span class="re2">:hover </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">background</span><span class="sy0">:</span> <span class="re0">#EAFBFC</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Первые два правила позиционируют элементы списков так, чтобы <code>border-right</code> (<code>border-bottom</code>) предыдущего элемента совпадал с <code>border-left</code> (<code>border-top</code>) следующего.</p>
<p>Теперь переходим к IE6. В нём не работает второе магическое правило (<code>#menu li:hover ul</code>), так как IE6 воспринимает <code>:hover</code> только на элементах <code>&lt;a&gt;</code>.</p>
<p>Первая мысль — закрывать для IE6 <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">a</span>&gt;</span></code></span> не до списка, а после. Мысль хорошая, но просмотр дерева в IE Developer Toolbar показал, что IE как-то «криво» понимает код (в принципе, здесь Ишак прав: невалидный код каждый волен понимать так, как может). Следовательно, надо список «обернуть» во что-нибудь, но так, чтобы <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">a</span>&gt;</span></code></span> нормально работал. И совершенно случайно <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  я вспомнил один случай, когда разгребал одну ужасную табличную вёрстку (а уровень вложенности таблиц переваливал там за 16), и открытый тэг <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">a</span>&gt;</span></code></span> превратил всю таблицу в сплошную гиперссылку. Чем чёрт не шутит, я решил попробовать.</p>
<p>Код стал таким:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4975">
        <div class="code xhtml" id="p49code75">
<span class="sc2">&lt;<span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Renaissance<span class="sc-2">&lt;!--[if IE 7]&gt;&lt;!--&gt;</span><span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;</span><span class="sc-2">&lt;!--&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;![endif]--&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Brunelleschi<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Alberti<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Palladio<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Michelangelo<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">li</span>&gt;&lt;<span class="kw2">a</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;#&quot;</span>&gt;</span>Bramante<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">a</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">ul</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc-2">&lt;!--[if lte IE 6]&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/a&gt;&lt;![endif]--&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">li</span>&gt;</span>
        </div>
    </div>
</div>

<p>Получилось! Ишак нормально распарсил код и сгенерировал нормальное дерево:<br/><br />
<a href='http://static.sjinks.info/wp-content/uploads/2008/03/2008-03-23_031712.png' title='XML-дерево, сгенерированное IE' rel="lightbox"><img src='http://static.sjinks.info/wp-content/uploads/2008/03/2008-03-23_031712.thumbnail.png' alt='XML-дерево, сгенерированное IE' /></a></p>
<p>Теперь нужно немного поколдовать, чтобы заставить всё работать как надо.<br />
Первое, что приходит в голову — это такие вот стили:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4976">
        <div class="code css" id="p49code76">
<span class="sy0">*</span> html <span class="re0">#menu</span> li ul <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#menu</span> li a<span class="re2">:hover </span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">static</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#menu</span> li a<span class="re2">:hover </span>table <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span> html <span class="re0">#menu</span> table <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">absolute</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <span class="kw1">border-collapse</span><span class="sy0">:</span> <span class="kw2">collapse</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <span class="kw1">top</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">left</span><span class="sy0">:</span> <span class="re3">-1px</span><span class="sy0">;</span> <br />
&nbsp; &nbsp; <span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Иными словами, мы всю магию перенесли на уровень выше (так как теперь у нас <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">ul</span>&gt;</span></code></span> обёрнут <span class="codebox"><code class="html"><span class="sc2">&lt;<span class="kw2">table</span>&gt;</span></code></span>). Правило <span class="codebox"><code class="css"><span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">static</span></code></span> в <span class="codebox"><code class="css"><span class="sy0">*</span> html <span class="re0">#menu</span> li a<span class="sy0">:</span>hover</code></span> — это вуду, без этого не работает <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  (как вариант, можно задать <span class="codebox"><code class="css"><span class="kw1">background</span></code></span> с цветом, отличным от <span class="codebox"><code class="css"><span class="kw2">transparent</span></code></span>).</p>
<p>И тут начинаются проблемы. Я, конечно, всегда подозревал, что IE написан очень криво, но чтобы <em>так криво</em>… После нескольких наведений на меню получается такая картина:</p>
<p><a href='http://static.sjinks.info/wp-content/uploads/2008/03/2008-03-23_033307.png' title='Ошибка IE6' rel="lightbox"><img src='http://static.sjinks.info/wp-content/uploads/2008/03/2008-03-23_033307.thumbnail.png' alt='Ошибка IE6' /></a></p>
<p>То есть таблицы как бы нет (<span class="codebox"><code class="css"><span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">none</span></code></span>), но место в потоке она занимает, и при этом хотя текста дочерних элементов не видно, но <span class="codebox"><code class="css"><span class="kw1">border</span></code></span> остался. Нет таблицы, и в то же время есть. Чудеса.</p>
<p>От таких чудес невольно опускаются руки. Потратив пару часов на эксперименты, я чудом нашел рабочую комбинацию: вместо <span class="codebox"><code class="css"><span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">none</span>/<span class="kw2">block</span></code></span> нужно использовать <span class="codebox"><code class="css"><span class="kw1">visibility</span><span class="sy0">:</span> <span class="kw2">visible</span>/<span class="kw2">hidden</span></code></span>. Не знаю, почему, но оно работает. Но всё же мне интересно, что курили разработчики, писавшие Ишака?</p>
<p>Страница с рабочим кросс-браузерным меню находится <a href='http://static.sjinks.info/wp-content/uploads/2008/03/vertical-one-level.html' title='vertical-one-level.html'>здесь</a>. Никакого JavaScript, только CSS!</p>
<p><strong><ins datetime="2008-07-02T21:53:38+00:00">Update:</ins></strong> <a href="http://www.alexilin.ru/vypadayushhee-menyu-bez-javascript/" rel="external nofollow">еще одна версия</a> вертикального меню.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/css/49-cross-browser-vertical-menu-without-javascript/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Резиновый трехколоночный макет с правосторонними сайдбарами</title>
		<link>http://blog.sjinks.pro/css/48-liquid-three-column-layout-with-right-sidebars/</link>
		<comments>http://blog.sjinks.pro/css/48-liquid-three-column-layout-with-right-sidebars/#comments</comments>
		<pubDate>Sat, 22 Mar 2008 01:24:37 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[IE8]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[макет]]></category>
		<category><![CDATA[резиновый макет]]></category>
		<category><![CDATA[трёхколоночный макет]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/css/48-liquid-three-column-layout-with-right-sidebars/</guid>
		<description><![CDATA[Кросс-браузерный семантически корректный резиновый макет с тремя колонками (сайдбары справа) Очередной раз попав не туда, куда надо из Google, я натолкнулся на статью "Трехколоночный макет на CSS с одинаковой высотой колонок". Да, трехколоночные макеты (да еще и резиновые!) очень популярны, я смотрю Но, несмотря на популярность таких макетов, многие верстальщики почему-то не хотят учиться и [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/48-liquid-three-column-layout-with-right-sidebars/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Кросс-браузерный семантически корректный <a href="http://blog.sjinks.pro/tag/liquid-layout/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  резиновый макет">резиновый макет</a> с тремя колонками (сайдбары справа)</em></h2>
<p>Очередной раз попав не туда, куда надо из <a href="http://blog.sjinks.pro/tag/google/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Google">Google</a>, я натолкнулся на статью "<a href="http://dimox.name/3-column-css-layout-right-sidebars/">Трехколоночный макет на CSS с одинаковой высотой колонок</a>". Да, трехколоночные макеты (да еще и резиновые!) очень популярны, я смотрю <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Но, несмотря на популярность таких макетов, многие верстальщики почему-то <del datetime="2008-06-19T08:30:52+00:00">не хотят учиться и</del> городят целый огород на div'ах.<span id="more-48"></span></p>
<p>В указанной статье приводится следующая <a href="http://blog.sjinks.pro/tag/markup/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  разметка">разметка</a> (я убрал пустые строки и изменил форматирование):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4881">
        <div class="code xhtml" id="p48code81">
<span class="sc2">&lt;<span class="kw2">body</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;wrapper&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;header&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;container&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;sub-container&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;wrpr&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;content&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;text&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;left&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;right&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;footer&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">body</span>&gt;</span>
        </div>
    </div>
</div>

<p>Что мы видим: пример, как верстать <strong>не надо</strong>. Может быть, сказано слишком резко, но на мой взгляд, суп из div'ов (с глубиной вложенности 6) ничем не лучше табличной вёрстки (табличная вёрстка будет даже компактнее). Кроме того, б<em>о</em>льшая часть этого супа не несёт семантической нагрузки. И вообще, при верстке нужно руководствоваться принципом <abbr title="Keep It Simple, Student">KISS</abbr>, но это моё сугубо личное мнение.</p>
<p>Попробуем переделать.<br />
Начнём с разметки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4882">
        <div class="code xhtml" id="p48code82">
<span class="sc2">&lt;<span class="kw2">body</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;header&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;container&quot;</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;content&quot;</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;column&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;col1&quot;</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;column&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;col2&quot;</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;column&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<br />
&nbsp; &nbsp; <span class="sc2">&lt;<span class="kw2">div</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;footer&quot;</span>&gt;&lt;<span class="sy0">/</span><span class="kw2">div</span>&gt;</span><br />
<span class="sc2">&lt;<span class="sy0">/</span><span class="kw2">body</span>&gt;</span>
        </div>
    </div>
</div>

<p>Как я уже отмечал в предыдущих статьях, названиям классов и атрибутам <code>id</code> нужно давать семантически значимые имена, но в качестве тестового примера пойдут и такие.</p>
<p>Простая разметка&nbsp;&mdash;&nbsp;простые стили:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4883">
        <div class="code css" id="p48code83">
html<span class="sy0">,</span> body <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
html <span class="br0">&#123;</span> <span class="coMULTI">/* Для IE6 и IE7 */</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
body <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">min-width</span><span class="sy0">:</span> <span class="re3">50em</span><span class="sy0">;</span> <span class="coMULTI">/* #container.paddingRight + #col1.offsetWidth + #col2.offsetWidth */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#container</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-right</span><span class="sy0">:</span> <span class="re3">25em</span><span class="sy0">;</span> <span class="coMULTI">/* #col1.offsetWidth + #col2.offsetWidth */</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/*\*/</span><br />
<span class="sy0">*</span> html <span class="re0">#container</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3"><span class="nu0">1</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="coMULTI">/**/</span><br />
<br />
<span class="re1">.column</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw1">left</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-bottom</span><span class="sy0">:</span> <span class="re3">1002em</span> !important<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-bottom</span><span class="sy0">:</span> <span class="re3">-1000em</span> !important<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#content</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#col1</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">10em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-right</span><span class="sy0">:</span> <span class="re3">-<span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#col2</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">15em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-right</span><span class="sy0">:</span> <span class="re3">-<span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">10em</span><span class="sy0">;</span> <span class="coMULTI">/* #col1.offsetWidth */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#footer</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">clear</span><span class="sy0">:</span> <span class="kw2">both</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Для краткости презентационные стили (aka расцветка) опущены.</p>
<p>Тестовая страница доступна <a href="http://blog.sjinks.pro/test/3col/3col_simple.html">здесь</a>. Кстати, разметка получилась даже проще, чем <a href="http://trifler.ru/blog/i/users/ushablon.htm">здесь</a> <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Но <a href="http://blog.sjinks.pro/tag/layout/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  макет">макет</a> не был бы так хорош, если бы не позволял с лёгкостью добавлять отступы, границы и бордюры. В статье "<a href="http://blog.sjinks.pro/css/31-ie-and-general-case-of-two-column-liquid-layouts/"><strong>IE7/8 и общий случай двухколоночной резиновой вёрстки</strong></a>" я показывал, как получаются формулы для вычисления значений границ и иже с ними (вспоминаем про эквивалентность преобразований), поэтому здесь приведу только конечный результат:</p>
<table cellpadding="2" cellspacing="1" class="bordered">
<thead align="left">
<tr>
<th>Элемент</th>
<th>Свойство</th>
<th>Формула</th>
</tr>
</thead>
<tbody>
<tr>
<td>body</td>
<td>min-width</td>
<td><code>(#container.offsetWidth - #container.width) + (#content.offsetWidth - #content.width) + #col1.offsetWidth + #col2.offsetWidth</code></td>
</tr>
<tr>
<td>#container</td>
<td>padding-right</td>
<td><code>(#content.offsetWidth - #content.width) + #col1.offsetWidth + #col2.offsetWidth</code></td>
</tr>
<tr>
<td>#content</td>
<td>margin-left</td>
<td><code>=#container.paddingLeft</code></td>
</tr>
<tr>
<td>#col1</td>
<td>margin-left</td>
<td><code>=#content.marginRight</code></td>
</tr>
<tr>
<td>#col2</td>
<td>margin-left</td>
<td><code>#col1.offsetWidth + #col2.желаемый_marginLeft</code></td>
</tr>
<tr>
<td>#col1, #col2</td>
<td>margin-right</td>
<td><code>-100%</code></td>
</tr>
</tbody>
</table>
<p>В <code>#container.paddingRight</code> входит желаемый <code>#col2.marginRight</code> (но у Opera есть некоторые проблемы с его отображением).</p>
<p>Из-за того, что все колонки имеют равную высоту, отобразить <code>border-bottom</code> у них не представилось возможным.</p>
<p>Для <a href="http://blog.sjinks.pro/tag/ie8/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  IE8">IE8</a> добавляются следующие изменения:</p>
<ul>
<li><code>#col1.marginLeft</code> устанавливается в сумму горизонтальных отступов, границ и бордюров элемента <code>#content</code>;</li>
<li><code>#col2.marginLeft</code> увеличивается на величину <code>#col1.marginLeft</code>.</li>
</ul>
<p>Тестовая страница для экспериментов находится <a href="http://blog.sjinks.pro/test/3col/3col.html">здесь</a>.</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p4884">
        <div class="code css" id="p48code84">
html<span class="sy0">,</span> body <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">font</span><span class="sy0">:</span> <span class="re3">12px</span> Verdana<span class="sy0">,</span> Tahoma<span class="sy0">,</span> Arial<span class="sy0">,</span> Helvetica<span class="sy0">,</span> <span class="kw2">sans-serif</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
html <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">auto</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
body <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">min-width</span><span class="sy0">:</span> <span class="re3">81em</span><span class="sy0">;</span> <span class="coMULTI">/* (38.5 + 0.5 + 2*1 + 2*1) + (2*1 + 2*1 + 0.5) + (10 + 2*1 + 2*1) + (15 + 0.5 + 2*1 + 2*1) = 43 + 4.5 + 14 + 19.5 = 57 + 24 */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#container</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-right</span><span class="sy0">:</span> <span class="re3">38.5em</span><span class="sy0">;</span> <span class="coMULTI">/* (2*1 + 2*1 + 0.5) + (10 + 2*1 + 2*1) + (15 + 0.5 + 2*1 + 2*1) + желаемый margin-right для #col2 (0.5em) */</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-left</span><span class="sy0">:</span> <span class="re3">.5em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-top</span><span class="sy0">:</span> <span class="re3">.5em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-bottom</span><span class="sy0">:</span> <span class="re3">.5em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin</span><span class="sy0">:</span> <span class="re3">1em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1em</span> <span class="kw2">solid</span> <span class="kw1">black</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="coMULTI">/*\*/</span><br />
<span class="sy0">*</span> html <span class="re0">#container</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">height</span><span class="sy0">:</span> <span class="re3"><span class="nu0">1</span>%</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="coMULTI">/**/</span><br />
<br />
<span class="re1">.column</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">position</span><span class="sy0">:</span> <span class="kw2">relative</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">float</span><span class="sy0">:</span> <span class="kw1">left</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding-bottom</span><span class="sy0">:</span> <span class="re3">1002em</span> !important<span class="sy0">;</span> <span class="coMULTI">/* Фактически, padding-bottom = 2em */</span><br />
&nbsp; &nbsp; <span class="kw1">margin-bottom</span><span class="sy0">:</span> <span class="re3">-1000em</span> !important<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">overflow</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#content</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3"><span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1em</span> <span class="kw2">solid</span> <span class="kw2">green</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="re3">1em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-right</span><span class="sy0">:</span> <span class="re3">.5em</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#col1</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">10em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-right</span><span class="sy0">:</span> <span class="re3">-<span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="re3">1em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1em</span> <span class="kw2">solid</span> <span class="kw2">red</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span><span class="re2">:first-</span>child<span class="coMULTI">/**/</span><span class="sy0">+</span>html <span class="re0">#col1</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">4.5em</span><span class="sy0">;</span> <span class="coMULTI">/* #col1.paddingLeft + #col1.paddingRight + #col1.borderLeft + #col1.borderRight + #col2.желаемый_marginLeft */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#col2</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">width</span><span class="sy0">:</span> <span class="re3">15em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-right</span><span class="sy0">:</span> <span class="re3">-<span class="nu0">100</span>%</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">14.5em</span><span class="sy0">;</span> <span class="coMULTI">/* #col1.paddingLeft + #col1.paddingRight + #col1.borderLeft + #col1.borderRight + #col2.желаемый_marginLeft + #col1.width */</span><br />
&nbsp; &nbsp; <span class="kw1">padding</span><span class="sy0">:</span> <span class="re3">1em</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">border</span><span class="sy0">:</span> <span class="re3">1em</span> <span class="kw2">solid</span> <span class="kw1">blue</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="sy0">*</span><span class="re2">:first-</span>child<span class="coMULTI">/**/</span><span class="sy0">+</span>html <span class="re0">#col2</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">margin-left</span><span class="sy0">:</span> <span class="re3">19em</span><span class="sy0">;</span> <span class="coMULTI">/* #col2.marginLeft + #col1.marginLeft */</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="re0">#footer</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">clear</span><span class="sy0">:</span> <span class="kw2">both</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/48-liquid-three-column-layout-with-right-sidebars/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/css/48-liquid-three-column-layout-with-right-sidebars/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Режимы шифрования данных, или, когда сильный шифр не спасает</title>
		<link>http://blog.sjinks.pro/html/18-data-encryption-modes-when-strong-cipher-doesnt-help/</link>
		<comments>http://blog.sjinks.pro/html/18-data-encryption-modes-when-strong-cipher-doesnt-help/#comments</comments>
		<pubDate>Wed, 19 Mar 2008 01:30:37 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[ECB]]></category>
		<category><![CDATA[OFB]]></category>
		<category><![CDATA[PCBC]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[блочный шифр]]></category>
		<category><![CDATA[шифр]]></category>
		<category><![CDATA[шифрование]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/security/18-data-encryption-modes-when-strong-cipher-doesnt-help/</guid>
		<description><![CDATA[Режимы шифрования: почему простая замена небезопасна. Почему-то каждый третий мнит себя экспертом по безопасности, пишет "безопасные" программы для шифрования данных, но даже не подозревает, что существуют и другие режимы шифрования, кроме известного как ECB. И этим грешат не только студенты в своих дипломных работах (головы бы поотрывал их научрукам за такое), но и "серьёзные" разработчики. [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/html/18-data-encryption-modes-when-strong-cipher-doesnt-help/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Режимы шифрования: почему простая замена небезопасна.</em></h2>
<p>Почему-то каждый третий мнит себя экспертом по безопасности, пишет "безопасные" программы для шифрования данных, но даже не подозревает, что существуют и другие режимы шифрования, кроме известного как <a href="http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29"><abbr title="Electronic Codebook">ECB</abbr></a>. И этим грешат не только студенты в своих дипломных работах (головы бы поотрывал их научрукам за такое), но и "серьёзные" разработчики.</p>
<p>Например, программист на сайте uk-swingers.com шифровал номера кредитных карточек (!), используя простой алгоритм RC4 и постоянный ключ. Ломалось очень просто. К счастью, уже исправлено <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Другие товарищи использовали сложение по модулю два для шифрования важных данных. Третий товарищ защитил диплом по безопасности, и <a href="http://blog.sjinks.pro/tag/encryption/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  шифрование">шифрование</a> секретной базы данных опять-таки выполнялось по модулю два. Четвертый шифровал AES'ом тонны информации (в режиме <a href="http://blog.sjinks.pro/tag/ecb/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ECB">ECB</a>, разумеется), при этом не потрудившись даже ее сжать. Этот печальный список можно продолжать и продолжать&hellip;</p>
<p>Я решил провести наглядный эксперимент, чтобы выяснить, насколько эффективны различные алгоритмы шифрования в различных режимах работы.<span id="more-18"></span></p>
<p>Начнем с теории.</p>
<p>Как известно, блочные шифры оперируют блоками фиксированной длины. Так как исходные сообщения могут иметь различную длину, а шифрование одного и того же сообщения одним и тем же ключом всегда приводит к одному и тому же шифротексту, были изобретены различные режимы шифрования. Самые ранние режимы, описанные в литературе, обеспечивают только конфиденциальность передаваемых сообщений, но не их целостность; более поздние обеспечивают и целостность, и конфиденциальность.</p>
<blockquote cite="http://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F"><strong>Режим шифрования</strong> — методика, используемая в блочных шифрах, предотвращающая возможную утечку информации о повторяющихся частях шифруемых данных. В виду того, что блочные шифры шифруют данные блоками фиксированного размера, существует потенциальная возможность утечки информации о повторяющихся частях данных шифруемых на одном и том же ключе. Режимы шифрования используются для модификации процесса шифрования так, чтобы результат шифрования каждого блока был уникальным вне зависимости от шифруемых данных и не позволял сделать какие-либо выводы об их структуре.</blockquote>
<p><!--page--></p>
<h2>Режим простой замены</h2>
<p>Режим простой замены (Electronic Codebook, ECB) является простейшим режимом шифрования. Сообщение разбивается на блоки, каждый из которых шифруется (раздельно). Таким образом, <em>из идентичных блоков открытого текста получаются идентичные блоки шифротекста</em>. Данный режим шифрования не обеспечивает достаточной конфиденциальности сообщения, вследствие чего его использование в криптографических протоколах не рекомендуется.</p>
<p>Уравнение шифрования: <var>C<sub>i</sub></var>=E<sub>key</sub>(<var>P<sub>i</sub></var>).<br />
Уравнение расшифрования: <var>P<sub>i</sub></var>=D<sub>key</sub>(<var>E<sub>i</sub></var>).<br />
В вышеприведенных формулах (и далее): <var>C</var> — шифротекст; <var>P</var> — открытый текст; E<sub>KEY</sub> — операция шифрования данных с ключом <var>KEY</var>; D<sub>KEY</sub> — операция расшифрования данных с ключом <var>KEY</var>.</p>
<p>Очевидно, что операции (рас)шифрования нескольких блоков могут выполняться параллельно. Изменение одного бита открытого текста влияет на соответствующий блок шифротекста; изменение одного бита шифротекста ведет к повреждению соответствующего блока открытого текста.<br />
<!--page--></p>
<h2>Режим гаммирования</h2>
<h3>Поточное гаммирование</h3>
<p>В режиме гаммирования (также известном как Stream Mode, SM, поточный режим) открытый текст складывается по модулю два с гаммой шифра (вместо операции сложения по модулю два можно использовать любую обратимую операцию). Гамма шифра получается следующим образом: при помощи псевдослучайного генератора формируется начальная (предварительная) гамма, которая шифруется в режиме простой замены (таким образом получается основная гамма). Начальное значение псевдослучайного генератора (называемое <em>инициализационным вектором</em> (Initialization Vector, IV) или <em>синхропосылкой</em>) не является секретным и передается по каналу в открытом виде. Если последний блок неполный (его длина меньше стандартного для данного алгоритма размера блока), берется только необходимое количество бит гаммы.</p>
<p>В режиме гаммирования операции зашифрования и расшифрования являются симметричными.</p>
<h3>Гаммирование с обратной связью</h3>
<p>Режим гаммирования с обратной связью (Cipher Feedback, CFB) — «близкий родственник» режима сцепления блоков — превращает блочный <a href="http://blog.sjinks.pro/tag/cipher/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  шифр">шифр</a> в самосинхронизирующийся поточный <a href="http://blog.sjinks.pro/tag/cipher/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  шифр">шифр</a>.</p>
<p>Уравнение зашифрования: <var>C<sub>i</sub></var>=E<sub>key</sub>(<var>C<sub>i-1</sub></var>)&oplus;<var>P<sub>i</sub></var>.<br />
Уравнение расшифрования: <var>P<sub>i</sub></var>=E<sub>key</sub>(<var>C<sub>i-1</sub></var>)&oplus;<var>C<sub>i</sub></var>.<br />
В приведенных выше формулах <var>C<sub>0</sub></var> — синхропосылка.</p>
<p>Обычно размер блока обратной связи совпадает с размером буфера (рас)шифрования; в общем случае, это может быть не так. Если размеры не совпадают, то на вход следующего цикла криптографического преобразования поступает (<var>b</var>-<var>s</var>) младших бит шифротекста (при шифровании) или открытого текста (при расшифровании), дополненные s битами полученного на предыдущем шаге шифротекста или открытого текста соответственно. При получении очередных <var>s</var> бит шифротекста (открытого текста), открытый текст (шифротекст) складывается по модулю два с <var>s</var> старшими битами результата шифрования. В приведенных выше формулах <var>b</var> — размер буфера (рас)шифрования, <var>s</var> — размер буфера обратной связи.</p>
<p>В режиме гаммирования с обратной связью шифрование не может выполняться параллельно, расшифрование — может (но с некоторыми ограничениями).</p>
<p>Изменения бит открытого текста влияют на все дальнейшие блоки шифротекста. Изменение одного бита шифротекста влияет на два блока открытого текста: изменение бита в соответствующем блоке и повреждение следующего блока открытого текста.</p>
<h3>Гаммирование с обратной связью по выходу</h3>
<p>Режим гаммирования с обратной связью по выходу (Output Feedback, <a href="http://blog.sjinks.pro/tag/ofb/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  OFB">OFB</a>) преобразует <a href="http://blog.sjinks.pro/tag/block-cipher/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  блочный шифр">блочный шифр</a> в синхронный поточный шифр: генерируемые ключевые блоки складываются по модулю два с блоками открытого текста.</p>
<p>Вследствие того, что операция сложения по модулю два является симметричной, процесс шифрования и расшифрования выглядит одинаково.</p>
<p>Уравнение зашифрования: <var>C<sub>i</sub></var>=E<sub>key</sub>(<var>O<sub>i-1</sub></var>)&oplus;<var>P<sub>i</sub></var>.<br />
Уравнение расшифрования: <var>P<sub>i</sub></var>=E<sub>key</sub>(<var>O<sub>i-1</sub></var>)&oplus;<var>C<sub>i</sub></var>.<br />
В приведенных выше формулах <var>O<sub>0</sub></var> — синхропосылка.</p>
<p>Подобно гаммированию с обратной связью, данный режим предусматривает ситуацию, когда размеры буфера обратной связи и (рас)шифрования не совпадают; следует учитывать, что размер буфера обратной связи меньший, чем размер буфера (рас)шифрования, отрицательно влияет на криптостойкость.</p>
<p>Операции шифрования/расшифрования зависят от предыдущих блоков, вследствие чего не могут выполняться параллельно (если выполнить все операции шифрования заранее, то финальное сложение по модулю два все же можно выполнить параллельно).</p>
<p>Изменение одного бита открытого текста (шифротекста) приводит к изменению соответствующего бита шифротекста (открытого текста); данное свойство позволяет использовать многие корректирующие коды даже до операции шифрования.</p>
<p><!--page--></p>
<h2>Режим сцепления блоков</h2>
<h3>Простое сцепление</h3>
<p>В режиме сцепления блоков (Cipher-block Chaining, CBC) каждый блок открытого текста складывается по модулю два с предыдущим блоком шифротекста, а затем шифруется. Таким образом, <em>каждый блок шифротекста зависит от всех обработанных блоков открытого текста</em>. Чтобы каждое сообщение было уникальным, при обработке первого блока открытого текста должна использоваться синхропосылка. Режим сцепления блоков является наиболее часто используемым.</p>
<p>Уравнение шифрования: <var>C<sub>i</sub></var>=E<sub>key</sub>(<var>P<sub>i</sub></var>&oplus;<var>C<sub>i-1</sub></var>).<br />
Уравнение расшифрования: <var>P<sub>i</sub></var>=D<sub>key</sub>(<var>C<sub>i</sub></var>)&oplus;<var>C<sub>i-1</sub></var>.<br />
В приведенных выше формулах <var>C<sub>0</sub></var> — синхропосылка.</p>
<p>Очевидно, что шифрование блоков не может выполняться параллельно, а для расшифрования достаточно двух соседних блоков шифротекста (вследствие чего расшифрование может выполняться параллельно).</p>
<p>Изменение одного бита открытого текста влияет на все последующие блоки шифротекста; изменение одного бита шифротекста ведет к повреждению соответствующего блока открытого текста и инверсии соответствующего бита следующего блока открытого текста.</p>
<h3>Режим распространяющегося сцепления блоков</h3>
<p>Режим распространяющегося сцепления блоков (Propagating CBC, <a href="http://blog.sjinks.pro/tag/pcbc/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PCBC">PCBC</a>) является модификацией предыдущего метода. Основным отличием данного режима от предыдущего является то, что изменения в шифротексте распространяются на все блоки как при расшифровании, так и при шифровании, вследствие чего (рас)шифрование блоков не может выполняться параллельно.</p>
<p>Уравнение шифрования: <var>C<sub>i</sub></var>=E<sub>key</sub>(<var>P<sub>i</sub></var>&oplus;<var>P<sub>i-1</sub></var>&oplus;<var>C<sub>i-1</sub></var>).<br />
Уравнение расшифрования: <var>P<sub>i</sub></var>=D<sub>key</sub>(<var>C<sub>i</sub></var>)&oplus;<var>P<sub>i-1</sub></var>&oplus;<var>C<sub>i-1</sub></var>.</p>
<p>В приведенных выше формулах <var>P<sub>0</sub></var>&oplus;<var>C<sub>0</sub></var> — синхропосылка.</p>
<p>Изменение одного бита открытого текста влияет на все последующие блоки шифротекста; изменение одного бита шифротекста ведет к повреждению всех последующих блоков открытого текста.</p>
<p><!--page--></p>
<h2>Режим счетчика</h2>
<p>Режим счетчика (Counter, CTR) преобразует блочный шифр в поточный. Его можно рассматривать как гибрид режимов простой замены и гаммирования с обратной связью по выходу. Ключевой блок генерируется путем зашифрования последовательных значений счетчика и затем складывается по модулю два с открытым текстом или шифротекстом. Операции (рас)шифрования могут выполняться параллельно, так как для (рас)шифрования очередного блока необходимо знать только значение счетчика.</p>
<p>Вследствие того, что операция сложения по модулю два является симметричной, процесс шифрования и расшифрования выглядит одинаково.</p>
<p>Считается, что шифрование в режиме счетчика является таким же безопасным, как и используемый шифр.</p>
<p>Счетчиком может быть любая функция, которая может генерировать последовательность, не повторяющуюся в течение долгого времени (наиболее популярным является простой инкрементирующий счетчик). Обычно начальное значение счетчика смешивается с синхропосылкой, что обеспечивает уникальное начальное значение для каждого сообщения.</p>
<p>Изменение одного бита открытого текста (шифротекста) приводит к изменению соответствующего бита шифротекста (открытого текста).</p>
<h2>Синхропосылка</h2>
<p>Синхропосылка (также известная как инициализационный вектор) — это набор бит, который требуется для того, чтобы блочный или поточный шифр, выполненный в любом из режимов, выдавал уникальный выходной поток, независимый от других, полученных при помощи того же самого ключа. Размер синхропосылки зависит от алгоритма шифрования и криптографического протокола; <em>как правило, синхропосылка имеет тот же размер, что и блок или ключ шифрования</em>.</p>
<p>Синхропосылка должна быть известна получателю зашифрованной информации, для того чтобы он мог расшифровать принятые данные.</p>
<p>Как правило, синхропосылка может не быть секретной, однако в зависимости от используемого режима шифрования она должна удовлетворять некоторым требованиям. В частности, для режимов гаммирования с обратной связью по выходу и счетчика, синхропосылка должна быть одноразовым значением (nonce); для режимов сцепления блоков и гаммирования с обратной связью синхропосылка должна быть непредсказуемой и не зависеть от исходного сообщения.</p>
<p>Рекомендация NIST SP 800-38A рекомендует один из следующих подходов для генерации непредсказуемых синхропосылок:</p>
<ol>
<li>Применение функции шифрования с тем же ключом, что и для шифрования открытого текста, к одноразовому значению;</li>
<li>Использование генератора случайных чисел, одобренного FIPS (Federal Information Processing Standard, федеральный стандарт обработки информации).</li>
</ol>
<p><!--page--></p>
<h2>Эксперимент</h2>
<p><strong>Методика эксперимента:</strong> в качестве исходных данных брался <a href="http://upload.wikimedia.org/wikipedia/commons/a/af/Tux.png">этот файл</a> и переводился в формат RGB. Затем на полученный файл натравливалась тестовая программа, которая выполняла шифрование в различных режимах; результат помещался в новый файл. Ключ шифрования — слово <code>password</code>, инициализационный вектор получался путем хеширования по ГОСТ 34.311-95. Шифрованные файлы переводились в из формата RGB в PNG и просматривались на экране <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Помимо всего прочего считалась энтропия полученных файлов (сим преследовалась цель убедиться, что "сильный" шифр может использоваться в качестве хорошего источника случайных чисел). Энтропия исходного файла составляет 3.37144&nbsp;бит.</p>
<p>Результаты сведены в таблицу (<strong>внимание всем, кто будет пытаться скачать все оптом:</strong> общий размер изображений, связанных с данными, превышает <strong>50&nbsp;мегабайт</strong>).</p>
<p><script type="text/javascript">odl.register(initLightbox);</script></p>
<table class="bordered" cellpadding="2" cellspacing="1" summary="Значение энтропии зашифрованного файла">
<caption>Энтропия зашифрованного сообщения для различных шифров и режимов шифрования</caption>
<thead>
<tr>
<th>&nbsp;</th>
<th><a href="http://en.wikipedia.org/wiki/Cipher_mode#Electronic_codebook_.28ECB.29"><abbr title="Electronic Codebook">ECB</abbr></a></th>
<th><a href="http://en.wikipedia.org/wiki/Cipher_mode#Cipher-block_chaining_.28CBC.29"><abbr title="Cipher-Block Chaining">CBC</abbr></a></th>
<th><a href="http://en.wikipedia.org/wiki/Cipher_mode#Cipher_feedback_.28CFB.29"><abbr title="Cipher Feedback">CFB</abbr></a></th>
<th><abbr title="Cipertext Stealing">CTS</abbr></th>
<th><a href="http://en.wikipedia.org/wiki/Cipher_mode#Output_feedback_.28OFB.29"><abbr title="Output Feedback">OFB</abbr></a></th>
<th><a href="http://en.wikipedia.org/wiki/Cipher_mode#Counter_.28CTR.29"><abbr title="Counter">CTR</abbr></a></th>
<th><a href="http://en.wikipedia.org/wiki/Cipher_mode#Propagating_cipher-block_chaining_.28PCBC.29"><abbr title="Propagating Cipher-Block Chaining">PCBC</abbr></a></th>
</tr>
</thead>
<tbody align="center">
<tr>
<th align="right"><a href="http://www.users.zetnet.co.uk/hopwood/crypto/scan/cs.html">NULL</a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/NULL_ecb.png" title="NULL ECB">3.37144</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/NULL_cbc.png" title="NULL CBC">7.92382</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/NULL_cfb.png" title="NULL CFB">7.92382</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/NULL_cts.png" title="NULL CTS">3.53878</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/NULL_ofb.png" title="NULL OFB">3.37197</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/NULL_ctr.png" title="NULL CTR">3.65126</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/NULL_pcbc.png" title="NULL PCBC">3.37197</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/XOR"><abbr title="eXclusive OR">XOR</abbr></a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XOR_ecb.png" title="XOR ECB">5.42685</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XOR_cbc.png" title="XOR CBC">7.93968</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XOR_cfb.png" title="XOR CFB">7.94004</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XOR_cts.png" title="XOR CTS">2.19935</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XOR_ofb.png" title="XOR OFB">5.27889</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XOR_ctr.png" title="XOR CTR">5.66991</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XOR_pcbc.png" title="XOR PCBC">5.27889</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm"><abbr title="Tiny Encryption Algorithm">TEA</abbr></a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TEA_ecb.png" title="TEA ECB">6.30925</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TEA_cbc.png" title="TEA CBC">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TEA_cfb.png" title="TEA CFB">7.99973</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TEA_cts.png" title="TEA CTS">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TEA_ofb.png" title="TEA OFB">7.99974</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TEA_ctr.png" title="TEA CTR">7.99971</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TEA_pcbc.png" title="TEA PCBC">7.99977</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/XTEA"><abbr title="eXteneded TEA">XTEA</abbr></a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XTEA_ecb.png" title="XTEA ECB">6.33340</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XTEA_cbc.png" title="XTEA CBC">7.99974</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XTEA_cfb.png" title="XTEA CFB">7.99979</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XTEA_cts.png" title="XTEA CTS">7.99978</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XTEA_ofb.png" title="XTEA OFB">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XTEA_ctr.png" title="XTEA CTR">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XTEA_pcbc.png" title="XTEA PCBC">7.99975</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/XXTEA"><abbr title="Corrected Block TEA">XXTEA</abbr></a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XXTEA_ecb.png" title="XXTEA ECB">7.90143</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XXTEA_cbc.png" title="XXTEA CBC">7.99974</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XXTEA_cfb.png" title="XXTEA CFB">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XXTEA_cts.png" title="XXTEA CTS">7.99973</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XXTEA_ofb.png" title="XXTEA OFB">7.99972</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XXTEA_ctr.png" title="XXTEA CTR">7.99974</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/XXTEA_pcbc.png" title="XXTEA PCBC">7.99975</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/Q_%28cipher%29">Q128</a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Q128_ecb.png" title="Q128 ECB">6.85842</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Q128_cbc.png" title="Q128 CBC">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Q128_cfb.png" title="Q128 CFB">7.99974</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Q128_cts.png" title="Q128 CTS">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Q128_ofb.png" title="Q128 OFB">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Q128_ctr.png" title="Q128 CTR">7.99978</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Q128_pcbc.png" title="Q128 PCBC">7.99976</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/FROG">FROG</a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/FROG_ecb.png" title="FROG ECB">7.77603</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/FROG_cbc.png" title="FROG CBC">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/FROG_cfb.png" title="FROG CFB">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/FROG_cts.png" title="FROG CTS">7.99972</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/FROG_ofb.png" title="FROG OFB">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/FROG_ctr.png" title="FROG CTR">7.99972</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/FROG_pcbc.png" title="FROG PCBC">7.99975</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/CAST-128">CAST-128</a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-128_ecb.png" title="CAST-128 ECB">6.32833</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-128_cbc.png" title="CAST-128 CBC">7.99979</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-128_cfb.png" title="CAST-128 CFB">7.99973</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-128_cts.png" title="CAST-128 CTS">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-128_ofb.png" title="CAST-128 OFB">7.99973</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-128_ctr.png" title="CAST-128 CTR">7.99978</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-128_pcbc.png" title="CAST-128 PCBC">7.99974</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/CAST-256">CAST-256</a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-256_ecb.png" title="CAST-256 ECB">6.81389</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-256_cbc.png" title="CAST-256 CBC">7.99971</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-256_cfb.png" title="CAST-256 CFB">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-256_cts.png" title="CAST-256 CTS">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-256_ofb.png" title="CAST-256 OFB">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-256_ctr.png" title="CAST-256 CTR">7.99974</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/CAST-256_pcbc.png" title="CAST-256 PCBC">7.99973</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/International_Data_Encryption_Algorithm"><abbr title="International Data Encryption Algorithm">IDEA</abbr></a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/IDEA_ecb.png" title="IDEA ECB">6.30512</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/IDEA_cbc.png" title="IDEA CBC">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/IDEA_cfb.png" title="IDEA CFB">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/IDEA_cts.png" title="IDEA CTS">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/IDEA_ofb.png" title="IDEA OFB">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/IDEA_ctr.png" title="IDEA CTR">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/IDEA_pcbc.png" title="IDEA PCBC">7.99975</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/Blowfish_%28cipher%29">Blowfish</a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Blowfish_ecb.png" title="Blowfish ECB">6.28322</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Blowfish_cbc.png" title="Blowfish CBC">7.99974</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Blowfish_cfb.png" title="Blowfish CFB">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Blowfish_cts.png" title="Blowfish CTS">7.99978</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Blowfish_ofb.png" title="Blowfish OFB">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Blowfish_ctr.png" title="Blowfish CTR">7.99972</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Blowfish_pcbc.png" title="Blowfish PCBC">7.99976</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard">Rijndael</a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Rijndael_ecb.png" title="Rijndael ECB">6.74933</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Rijndael_cbc.png" title="Rijndael CBC">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Rijndael_cfb.png" title="Rijndael CFB">7.99978</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Rijndael_cts.png" title="Rijndael CTS">7.99974</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Rijndael_ofb.png" title="Rijndael OFB">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Rijndael_ctr.png" title="Rijndael CTR">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/Rijndael_pcbc.png" title="Rijndael PCBC">7.99977</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/Data_Encryption_Standard"><abbr title="Data Encryption Standard">DES</abbr></a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/DES_ecb.png" title="DES ECB">6.33022</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/DES_cbc.png" title="DES CBC">7.99982</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/DES_cfb.png" title="DES CFB">7.99970</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/DES_cts.png" title="DES CTS">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/DES_ofb.png" title="DES OFB">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/DES_ctr.png" title="DES CTR">7.99973</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/DES_pcbc.png" title="DES PCBC">7.99975</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/GOST_28147-89"><abbr title="ГОСТ 28147-89">GOST</abbr></a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST_ecb.png" title="GOST ECB">6.33646</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST_cbc.png" title="GOST CBC">7.99974</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST_cfb.png" title="GOST CFB">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST_cts.png" title="GOST CTS">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST_ofb.png" title="GOST OFB">7.99971</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST_ctr.png" title="GOST CTR">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST_pcbc.png" title="GOST PCBC">7.99972</a></td>
</tr>
<tr>
<th align="right"><abbr title="ГОСТ 28147-89 с отбеливанием ключа">GOST-X</abbr></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST-X_ecb.png" title="GOST-X ECB">6.20684</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST-X_cbc.png" title="GOST-X CBC">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST-X_cfb.png" title="GOST-X CFB">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST-X_cts.png" title="GOST-X CTS">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST-X_ofb.png" title="GOST-X OFB">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST-X_ctr.png" title="GOST-X CTR">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/GOST-X_pcbc.png" title="GOST-X PCBC">7.99974</a></td>
</tr>
<tr>
<th align="right"><a href="http://en.wikipedia.org/wiki/Triple_DES"><abbr title="Triple DES Encrypt-Decrypt-Encrypt">TripleDES EDE</abbr></a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES_ecb.png" title="TDES ECB">6.33022</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES_cbc.png" title="TDES CBC">7.99982</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES_cfb.png" title="TDES CFB">7.9997 </a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES_cts.png" title="TDES CTS">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES_ofb.png" title="TDES OFB">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES_ctr.png" title="TDES CTR">7.99973</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES_pcbc.png" title="TDES PCBC">7.99975</a></td>
</tr>
<tr>
<th align="right"><abbr title="Тройной ГОСТ 28147-89 по аналогии с TripleDES EDE">TGOST</a></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST_ecb.png" title="TGOST ECB">6.33556</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST_cbc.png" title="TGOST CBC">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST_cfb.png" title="TGOST CFB">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST_cts.png" title="TGOST CTS">7.99978</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST_ofb.png" title="TGOST OFB">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST_ctr.png" title="TGOST CTR">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST_pcbc.png" title="TGOST PCBC">7.99973</a></td>
</tr>
<tr>
<th align="right"><abbr title="TripleDES с тройным шифрованием">TripleDES3</abbr></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES3_ecb.png" title="TDES3 ECB">6.95098</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES3_cbc.png" title="TDES3 CBC">7.99975</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES3_cfb.png" title="TDES3 CFB">7.99980</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES3_cts.png" title="TDES3 CTS">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES3_ofb.png" title="TDES3 OFB">7.99973</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES3_ctr.png" title="TDES3 CTR">7.99970</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TDES3_pcbc.png" title="TDES3 PCBC">7.99974</a></td>
</tr>
<tr>
<th align="right"><abbr title="TripleGOST с тройным шифрованием">TGOST3</abbr></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST3_ecb.png" title="TGOST3 ECB">7.01890</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST3_cbc.png" title="TGOST3 CBC">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST3_cfb.png" title="TGOST3 CFB">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST3_cts.png" title="TGOST3 CTS">7.99978</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST3_ofb.png" title="TGOST3 OFB">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST3_ctr.png" title="TGOST3 CTR">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOST3_pcbc.png" title="TGOST3 PCBC">7.99972</a></td>
</tr>
<tr>
<th align="right"><abbr title="TripleGOST с тройным шифрованием и отбеливанием ключа">TGOSTX3</abbr></th>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOSTX3_ecb.png" title="TGOSTX3 ECB">6.98361</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOSTX3_cbc.png" title="TGOSTX3 CBC">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOSTX3_cfb.png" title="TGOSTX3 CFB">7.99968</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOSTX3_cts.png" title="TGOSTX3 CTS">7.99977</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOSTX3_ofb.png" title="TGOSTX3 OFB">7.99976</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOSTX3_ctr.png" title="TGOSTX3 CTR">7.99973</a></td>
<td><a rel="lightbox[cipher]" href="http://blog.sjinks.pro/test/cipher-modes/TGOSTX3_pcbc.png" title="TGOSTX3 PCBC">7.99976</a></td>
</tr>
</tbody>
</table>
<p><strong>Примечание:</strong> размерность приведённых в таблице данных&nbsp;&mdash;&nbsp;биты.</p>
<p><strong>Анализ результатов.</strong> Результаты, приведенные в таблице, являются хорошей иллюстрацией к генерации криптографически безопасных случайных чисел: изображение, зашифрованное сильным шифром во всех режимах, кроме простой замены, выглядит как случайный шум, в то время как в зашифрованном слабым шифром изображении без особого труда угадывается оригинал.</p>
<p>По результатам тестирования мы видим, что режим простой замены для шифрования данных лучше не использовать. Кстати, в стандарте шифрования ГОСТ 28147-89 отмечено, что режим простой замены может быть использован только для шифрования ключевых данных. Из таблицы видно, что каким бы ни был шифр, в режиме простой замены он не может обеспечить достаточной конфиденциальности сообщения.</p>
<p>Привлекательно выглядят результаты для режимов сцепления блоков шифротекста и гаммирования с обратной связью: даже при шифровании нулевым шифром на выходе получается практически случайный шум. Тем не менее, это иллюзия: этот «шум» создается благодаря использованию операции сложения по модулю два, изменяющейся синхропосылке и удачному подбору байт: для обоих методов при шифровании слабым шифром (XOR) исходное изображение все равно угадывается.</p>
<p>Для защиты от навязывания ложных данных хорошим вариантом является распространяющееся сцепление блоков: изменение одного бита шифротекста приводит к разрушению всех последующих блоков открытого текста. Тем не менее, такое поведение не всегда является желательным: предположим, что в канале передачи данных имеются сильные помехи. Тогда искажение одного блока шифротекста приведет к тому, что соответствующий, а также все последующие, блоки открытого текста использовать нельзя. В этом случае придется передавать большую часть сообщения заново, что может привести к большому росту нагрузки на сеть. В случае если передача данных осуществляется именно по такому каналу, имеет смысл использовать режим шифрования с обратной связью по выходу, в котором изменение одного бита шифротекста ведет к изменению соответствующего бита открытого текста. Как уже было сказано, данное свойство позволяет использовать многие корректирующие коды даже до операции шифрования.</p>
<p>Кстати, если обратить внимание на значение энтропии, то видно, что для слабых шифров режим сокрытия шифротекста приводит к ухудшению качества шифрования. Хорошими вариантами является использование шифрования в режиме счетчика и сцепления блоков шифротекста. Также прослеживается зависимость качества шифрования (в плане близости вычисленного значения энтропии к максимальному) от длины ключа — чем длиннее ключ, тем выше энтропия (для одного и того же набора данных). Интересно это проверить на файлах разного размера, но содержащих одинаковое количество блоков (то есть для шифра с большей длинной ключа будет использоваться более длинный файл); однако в этом случае будет довольно трудно обеспечить честность эксперимента — равенство исходной энтропии.</p>
<p>На закуску еще один эксперимент. Методика испытаний аналогична предыдущему случаю, но эксперимент проводился для разных файлов:</p>
<ul>
<li>представленное выше изображение;</li>
<li>файл в формате MS Word 2003;</li>
<li>фотография в формате JPEG;</li>
<li>файл из 1024 символов с кодом FF<sub>16</sub>;</li>
</ul>
<p>Результаты эксперимента представлены в таблице</p>
<table class="bordered"  cellspacing="1" cellpadding="2">
<thead align="right">
<tr>
<th>&nbsp;</th>
<th>NULL</th>
<th>XOR</th>
<th>ГОСТ 28147-89</th>
</tr>
</thead>
<tbody align="right" valign="middle">
<tr>
<th>Простая замена</th>
<td>
				3.37144<br />
				4.48239<br />
				7.95642<br />
				0
			</td>
<td>
				5.42685<br />
				5.85078<br />
				7.98966<br />
				2.75
			</td>
<td>
				6.33646<br />
				7.76984<br />
				7.99839<br />
				3
			</td>
</tr>
<tr>
<th>Сокрытие шифротекста</th>
<td>
				3.53878<br />
				5.17479<br />
				7.99782<br />
				0
			</td>
<td>
				2.19935<br />
				4.71443<br />
				7.99633<br />
				0.0873988
			</td>
<td>
				7.99977<br />
				7.99921<br />
				7.99844<br />
				7.78699
			</td>
</tr>
<tr>
<th>Гаммирование с обратной связью по выходу</th>
<td>
				3.37197<br />
				4.48239<br />
				7.95641<br />
				0
			</td>
<td>
				5.27889<br />
				5.80711<br />
				7.98579<br />
				2.375
			</td>
<td>
				7.99971<br />
				7.99930<br />
				7.99845<br />
				7.80087
			</td>
</tr>
<tr>
<th>Гаммирование с обратной связью</th>
<td>
				7.92382<br />
				7.97188<br />
				7.99839<br />
				1
			</td>
<td>
				7.94004<br />
				7.95779<br />
				7.99848<br />
				2.375
			</td>
<td>
				7.99975<br />
				7.99917<br />
				7.99829<br />
				7.80648
			</td>
</tr>
<tr>
<th>Сцепление блоков шифротекста</th>
<td>
				7.92382<br />
				7.97188<br />
				7.99839<br />
				1
			</td>
<td>
				7.93968<br />
				7.95869<br />
				7.99827<br />
				2.375
			</td>
<td>
				7.99974<br />
				7.99921<br />
				7.99864<br />
				7.82002
			</td>
</tr>
<tr>
<th>Распространяющееся сцепление блоков шифротекста</th>
<td>
				3.37197<br />
				4.48239<br />
				7.95641<br />
				0
			</td>
<td>
				5.27889<br />
				5.80711<br />
				7.98579<br />
				2.375
			</td>
<td>
				7.99972<br />
				7.99931<br />
				7.99840<br />
				7.83605
			</td>
</tr>
<tr>
<th>Счетчик</th>
<td>
				3.65126<br />
				4.63377<br />
				7.95941<br />
				0.233209
			</td>
<td>
				5.66991<br />
				6.05639<br />
				7.98633<br />
				2.89398
			</td>
<td>
				7.99976<br />
				7.99930<br />
				7.99840<br />
				7.80864
			</td>
</tr>
</tbody>
</table>
<p><strong>Примечание:</strong> размерность данных в таблице — биты.</p>
<p>Делать выводы возлагаем на читателя&hellip;</p>
<p><!--page--></p>
          
<div class="codebox">
    <div class="the_code" style="display: none" id="p1886">
        <div class="code cpp" id="p18code86">
<ol class="cpp" style="font-family:monospace;"><li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeECB</span><span class="br0">&#40;</span>uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;</span> <span class="nu0">0</span><span class="sy4">;</span> uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize, d <span class="sy2">+</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">decodeECB</span><span class="br0">&#40;</span>uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;</span> <span class="nu0">0</span><span class="sy4">;</span> uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize, d <span class="sy2">+</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>decode<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeCTR</span><span class="br0">&#40;</span>uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint64_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> REINTERPRET_CAST<span class="br0">&#40;</span>uint64_t<span class="sy2">*</span> <span class="kw4">const</span>, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>bufsize <span class="sy1">&lt;</span> <span class="kw3">sizeof</span><span class="br0">&#40;</span>uint64_t<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> STDNS<span class="sy4">::</span><span class="me2">runtime_error</span><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;AbstractCipher::encodeCTR(): buffer size must be at least 8 bytes&quot;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pVector, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;=</span> bufsize<span class="sy4">;</span> d <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy2">*</span>f <span class="sy3">^</span><span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pCounter<span class="sy2">-</span><span class="sy1">&gt;</span>getAndIncrement<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>f<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>f, d, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sy2">*</span>f <span class="sy3">^</span><span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pCounter<span class="sy2">-</span><span class="sy1">&gt;</span>getAndIncrement<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>f<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, d, uiSize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeCTS</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>d, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; s &nbsp; &nbsp; &nbsp;<span class="sy2">+</span><span class="sy1">=</span> bufsize<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; d &nbsp; &nbsp; &nbsp;<span class="sy2">+</span><span class="sy1">=</span> bufsize<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer, uiSize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeCTSMAC</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; s &nbsp; &nbsp; &nbsp;<span class="sy2">+</span><span class="sy1">=</span> bufsize<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">decodeCTS</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">const</span> uint8_t<span class="sy2">*</span> f <span class="sy1">=</span> REINTERPRET_CAST<span class="br0">&#40;</span>uint8_t<span class="sy2">*</span>, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> b &nbsp; &nbsp; &nbsp; <span class="sy1">=</span> REINTERPRET_CAST<span class="br0">&#40;</span>uint8_t<span class="sy2">*</span>, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>s <span class="sy3">!</span><span class="sy1">=</span> d<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>d, s, uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>d, f, bufsize, b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>decode<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>d, f, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; s <span class="sy1">=</span> b<span class="sy4">;</span> b <span class="sy1">=</span> CONST_CAST<span class="br0">&#40;</span>uint8_t<span class="sy2">*</span>, f<span class="br0">&#41;</span><span class="sy4">;</span> f <span class="sy1">=</span> s<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; d &nbsp; &nbsp; &nbsp;<span class="sy2">+</span><span class="sy1">=</span> bufsize<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>f <span class="sy3">!</span><span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>d, b, uiSize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>b, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, bufsize, this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeCBC</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">const</span> uint8_t<span class="sy2">*</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;</span> <span class="nu0">0</span><span class="sy4">;</span> s <span class="sy2">+</span><span class="sy1">=</span> bufsize, d <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, f, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp;<span class="co1">//d = P[i] xor C[i-1]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">//d = C[i] = E(P[i] xor C[i-1])</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; f <span class="sy1">=</span> d<span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">//f = C[i]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>f <span class="sy3">!</span><span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeCBCMAC</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;</span> <span class="nu0">0</span><span class="sy4">;</span> s <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, f, bufsize, f<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>f<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">decodeCBC</span><span class="br0">&#40;</span>uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> x<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;</span> <span class="nu0">0</span><span class="sy4">;</span> d <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, d, bufsize<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp; <span class="co1">//b = C[i]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>decode<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">//d = D(C[i])</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>d, f, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp;<span class="co1">//d = d xor f = P[i] = D(C[i]) xor C[i-1]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy1">=</span> f<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; f <span class="sy1">=</span> b<span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">//f = C[i]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; b <span class="sy1">=</span> x<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>f <span class="sy3">!</span><span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodePCBC</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;</span> <span class="nu0">0</span><span class="sy4">;</span> s <span class="sy2">+</span><span class="sy1">=</span> bufsize, d <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, s, bufsize<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp; <span class="co1">//b = s = P[i]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, f, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp;<span class="co1">//d = s xor f = P[i] xor (P[i-1] xor C[i-1])</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">//d = C[i] = Ek(P[i] xor (P[i-1] xor C[i-1]))</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>b, d, bufsize, f<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp;<span class="co1">//f = P[i] xor C[i]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodePCBCMAC</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;</span> <span class="nu0">0</span><span class="sy4">;</span> s <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, f, bufsize, b<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp;<span class="co1">//b = s xor f = P[i] xor (P[i-1] xor C[i-1])</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">//b = C[i] = Ek(P[i] xor (P[i-1] xor C[i-1]))</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b, bufsize, f<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp;<span class="co1">//f = s xor b = P[i] xor C[i]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">decodePCBC</span><span class="br0">&#40;</span>uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;=</span> bufsize<span class="sy4">;</span> d <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, d, bufsize<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp; <span class="co1">//b = C[i]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>decode<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">//d = Dk(C[i])=P[i] xor P[i-1] xor C[i-1]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>d, f, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp;<span class="co1">//d = P[i]=Dk(C[i]) xor P[i-1] xor C[i-1]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>b, d, bufsize, f<span class="br0">&#41;</span><span class="sy4">;</span> &nbsp;<span class="co1">//f = b xor d = C[i] xor P[i]</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/**</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* @note FIPS 800-38A says that the Plaintext must be XOR'ed with the</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* &nbsp; &nbsp; &nbsp; most significant bits of the encrypted block, hence we have to add</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* &nbsp; &nbsp; &nbsp; (bufsize - fbsize) to b when invoking xor_buffers</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* @see FIPS 800-38A, Page 11</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeCFB</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> fbsize &nbsp;<span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getFeedbackSize<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy1">&gt;&gt;</span> <span class="nu0">3</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;=</span> bufsize<span class="sy4">;</span> d <span class="sy2">+</span><span class="sy1">=</span> fbsize, s <span class="sy2">+</span><span class="sy1">=</span> fbsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> fbsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b <span class="sy2">+</span> bufsize <span class="sy2">-</span> fbsize, fbsize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>f, f <span class="sy2">+</span> fbsize, bufsize <span class="sy2">-</span> fbsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> fbsize, d, fbsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, uiSize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>f, f <span class="sy2">+</span> uiSize, bufsize <span class="sy2">-</span> uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, d, uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeCFBMAC</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> fbsize &nbsp;<span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getFeedbackSize<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy1">&gt;&gt;</span> <span class="nu0">3</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;=</span> bufsize<span class="sy4">;</span> s <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b <span class="sy2">+</span> bufsize <span class="sy2">-</span> fbsize, fbsize, b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>f, f <span class="sy2">+</span> fbsize, bufsize <span class="sy2">-</span> fbsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> fbsize, b, fbsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, uiSize, b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>f, f <span class="sy2">+</span> uiSize, bufsize <span class="sy2">-</span> uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, b, uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">decodeCFB</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> fbsize &nbsp;<span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getFeedbackSize<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy1">&gt;&gt;</span> <span class="nu0">3</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;=</span> bufsize<span class="sy4">;</span> d <span class="sy2">+</span><span class="sy1">=</span> fbsize, s <span class="sy2">+</span><span class="sy1">=</span> fbsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> fbsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>f, f <span class="sy2">+</span> fbsize, bufsize <span class="sy2">-</span> fbsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> fbsize, s, fbsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b <span class="sy2">+</span> bufsize <span class="sy2">-</span> fbsize, fbsize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>f, f <span class="sy2">+</span> uiSize, bufsize <span class="sy2">-</span> uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, s, uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, uiSize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/**</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* @note It is assumed that Feedback size is equal Block Size</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeCFB_fast</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;=</span> bufsize<span class="sy4">;</span> d <span class="sy2">+</span><span class="sy1">=</span> bufsize, s <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>f<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, f, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f, d, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, uiSize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>f, f <span class="sy2">+</span> uiSize, bufsize <span class="sy2">-</span> uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, d, uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeCFBMAC_fast</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;=</span> bufsize<span class="sy4">;</span> s <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b, bufsize, f<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, uiSize, b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>f, f <span class="sy2">+</span> uiSize, bufsize <span class="sy2">-</span> uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, b, uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/**</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;* @note It is assumed that Feedback size is equal Block Size</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">&nbsp;*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">decodeCFB_fast</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> b <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pBuffer<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;=</span> bufsize<span class="sy4">;</span> d <span class="sy2">+</span><span class="sy1">=</span> bufsize, s <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f, s, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>b, f, bufsize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>b<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memmove</span><span class="br0">&#40;</span>f, f <span class="sy2">+</span> uiSize, bufsize <span class="sy2">-</span> uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw3">memcpy</span><span class="br0">&#40;</span>f <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, s, uiSize<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, b <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, uiSize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//---------------------------------------------------------------------------</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">void</span> AbstractCipher<span class="sy4">::</span><span class="me2">encodeOFB</span><span class="br0">&#40;</span><span class="kw4">const</span> uint8_t<span class="sy2">*</span> s, uint8_t<span class="sy2">*</span> d, STDNS<span class="sy4">::</span><span class="kw4">size_t</span> uiSize<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; STDNS<span class="sy4">::</span><span class="kw4">size_t</span> bufsize <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>getBufSize<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; uint8_t<span class="sy2">*</span> <span class="kw4">const</span> f <span class="sy1">=</span> this<span class="sy2">-</span><span class="sy1">&gt;</span>m_pFeedback<span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span> <span class="sy4">;</span> uiSize <span class="sy1">&gt;=</span> bufsize<span class="sy4">;</span> d <span class="sy2">+</span><span class="sy1">=</span> bufsize, s <span class="sy2">+</span><span class="sy1">=</span> bufsize, uiSize <span class="sy2">-</span><span class="sy1">=</span> bufsize<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>f<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, f, bufsize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>uiSize <span class="sy1">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy2">-</span><span class="sy1">&gt;</span>encode<span class="br0">&#40;</span>f<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; xor_buffers<span class="br0">&#40;</span>s, f <span class="sy2">+</span> bufsize <span class="sy2">-</span> uiSize, uiSize, d<span class="br0">&#41;</span><span class="sy4">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/html/18-data-encryption-modes-when-strong-cipher-doesnt-help/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/html/18-data-encryption-modes-when-strong-cipher-doesnt-help/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

