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

<channel>
	<title>Петька Сокольников &#187; CSS3</title>
	<atom:link href="http://blog.xyz.net.ua/tag/css3/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xyz.net.ua</link>
	<description>блог программиста</description>
	<lastBuildDate>Sat, 17 Apr 2010 08:34:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Плавная смена изображений на JavaScript</title>
		<link>http://blog.xyz.net.ua/2009/05/06/css3_javascript_opacity/</link>
		<comments>http://blog.xyz.net.ua/2009/05/06/css3_javascript_opacity/#comments</comments>
		<pubDate>Wed, 06 May 2009 16:30:09 +0000</pubDate>
		<dc:creator>Петька Сокольников</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[opacity]]></category>

		<guid isPermaLink="false">http://blog.xyz.net.ua/?p=24</guid>
		<description><![CDATA[Как то появилась задача сделать плавную смену изображений в web-странице. Решением задачи решил поделиться с вами. Некоторые используют для этого CSS-свойство filter, но понимает его только Internet Explorer, поэтому пришлось искать реализацию, которая работала бы в разных браузерах. Сначала немного теории. Используя абсолютное позиционирование, набрасываем в разные слои несколько изображений. И только одно из них [...]]]></description>
			<content:encoded><![CDATA[<p>Как то появилась задача сделать плавную смену изображений в web-странице. Решением задачи решил поделиться с вами. Некоторые используют для этого CSS-свойство <strong>filter</strong>, но понимает его только <strong>Internet Explorer</strong>, поэтому пришлось искать реализацию, которая работала бы в разных браузерах.</p>
<p><span id="more-24"></span><br />
<strong>Сначала немного теории. </strong><br />
Используя абсолютное позиционирование, набрасываем в разные слои несколько изображений. И только одно из них должно отображаться сразу, а остальные проявляться со временем.<br />
Чтобы сделать плавную смену одного изображения другим, надо играться со свойствами прозрачности. Любой нормальный браузер понимает CSS3-свойство <a href="http://www.htmlbook.ru/css/opacity.html" target=_blank>opacity</a> (принимает значение от 0 до 1), любой но только не Internet Explorer, для него тоже самое приходится делать при помощи <strong>filter: alpha(opacity)</strong> (принимает значение от 0 до 100).<br />
Мы разобрались с инструментарием для изменения прозрачности, далее надо подумать как сделать смену одного изображения другим. Для этого нам надо через определенный промежуток времени запускать механизм плавного изменения свойств <strong>opacity</strong> и <strong>filter: alpha(opacity)</strong> для одного изображения в сторону уменьшения, для другого же в сторону увеличения. Для этого будет использоваться JavaScript-функция <a href="https://developer.mozilla.org/En/Window.setInterval" target=_blank>setInterval();</a>. Само же плавное изменение уровня прозрачности мы будем делать пошагово пересчитывая значение соответствующих CSS3-свойств, задавая задержку между шагами при помощи JavaScript-функции <a href="https://developer.mozilla.org/en/DOM/window.setTimeout" target=_blank>setTimeout();</a><br />
Процесс работы скрипта будет выглядеть примерно так:<br />
Имеем три изображения, наложенных одно на другое. Но два из них с минимальным значением прозрачности, и таким образом отображается только одно изображение.<br />
Одновременно изменяя в сторону уменьшения значения прозрачности первого изображения мы увеличиваем значение прозрачности второго.<br />
То же самое повторяем с изображением 2 и 3, потом между 3 и 1, и так далее по кругу.<br />
Вот примерно таким образом должно всё происходить. </p>
<p><strong>Ну и наконец сам листинг скрипта: </strong></p>
<blockquote><p>&lt;script language=JavaScript&gt;<br />
var total_pics_num = 3;&nbsp; // колличество изображений<br />
var interval = 4000;&nbsp;&nbsp;&nbsp;&nbsp; // интервал между изображениями<br />
var time_out = 10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // задержка кадров</p>
<p>var i = 0;<br />
var timeout;<br />
var opacity = 100;</p>
<p>function fade_to_next()<br />
&nbsp;{<br />
&nbsp; opacity&#8211;;<br />
&nbsp; var k = i + 1;<br />
&nbsp; var image_now = &#8216;image_&#8217; + i;<br />
&nbsp; if (i == total_pics_num)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp; &nbsp;k = 1;<br />
&nbsp;&nbsp; }<br />
&nbsp; var image_next = &#8216;image_&#8217; + k;<br />
&nbsp; document.getElementById(image_now).style.opacity = opacity/100;<br />
&nbsp; document.getElementById(image_now).style.filter = &#8216;alpha(opacity=&#8217;+ opacity +&#8217;)';<br />
&nbsp; document.getElementById(image_next).style.opacity = (100-opacity)/100;<br />
&nbsp; document.getElementById(image_next).style.filter = &#8216;alpha(opacity=&#8217;+ (100-opacity) +&#8217;)';</P><P><br />
&nbsp; timeout = setTimeout(&laquo;fade_to_next()&raquo;,time_out);<br />
&nbsp; if (opacity==1)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; opacity = 100;<br />
&nbsp;&nbsp;&nbsp; clearTimeout(timeout);<br />
&nbsp;&nbsp; }<br />
&nbsp;}</p>
<p>setInterval(function () {<br />
&nbsp;&nbsp;  i++;<br />
&nbsp;&nbsp;  if (i > total_pics_num) i=1;<br />
&nbsp;&nbsp;  fade_to_next();<br />
&nbsp; },interval);</p>
<p>&lt;/script&gt;</p>
<p>&lt;img src=&#8217;1.jpg&#8217; id=&raquo;image_1&#8243; style=&raquo;position: absolute;&raquo;&gt;<br />
&lt;img src=&#8217;2.jpg&#8217; id=&raquo;image_2&#8243; style=&raquo;opacity: 0; filter: alpha(opacity=0); position: absolute;&raquo;&gt;<br />
&lt;img src=&#8217;3.jpg&#8217; id=&raquo;image_3&#8243; style=&raquo;opacity: 0; filter: alpha(opacity=0); position: absolute;&raquo;&gt;
</p></blockquote>
<p><strong>Как это работает можно посмотреть тут:</strong><br />
<a href="http://tutorials.xyz.net.ua/css_javascript_opacity/" target=_blank>http://tutorials.xyz.net.ua/css_javascript_opacity/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xyz.net.ua/2009/05/06/css3_javascript_opacity/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
