<?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>刘钢的博客 - 我是UED &#187; 透明度</title>
	<atom:link href="http://www.iamued.com/tag/%e9%80%8f%e6%98%8e%e5%ba%a6/feed" rel="self" type="application/rss+xml" />
	<link>http://www.iamued.com</link>
	<description>http://www.IamUED.com</description>
	<lastBuildDate>Wed, 18 Jan 2012 02:51:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>即拷即用动画函数：透明度渐变、位置移动、尺寸变化</title>
		<link>http://www.iamued.com/qianduan/1382.html</link>
		<comments>http://www.iamued.com/qianduan/1382.html#comments</comments>
		<pubDate>Wed, 31 Mar 2010 02:31:22 +0000</pubDate>
		<dc:creator>RichieLiu</dc:creator>
				<category><![CDATA[JavaScript脚本]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[位置]]></category>
		<category><![CDATA[前端]]></category>
		<category><![CDATA[动画函数]]></category>
		<category><![CDATA[尺寸]]></category>
		<category><![CDATA[透明度]]></category>

		<guid isPermaLink="false">http://www.iamued.com/?p=1382</guid>
		<description><![CDATA[首先感谢一下 51js的 abeet 同学 给我们提取出这么简洁的函数 和大家分享一下吧 查看Demo 这三个函数适用于以下情况 1、在做前端页面时，只需要简单的动画效果，不想引入整个动画类，使用本函数。 2、在写js类时，需要用到简单的动画，为了降低藕合性，使用本函数。 使用方法如下： 核心代码分析 1、获取一个元素的透明度 如果是IE浏览器，则攻取最终样式的滤镜filter的值，再通过正则表达式获取到透明度滤镜alpha的值，如果不存在透明度滤镜值，则透明度为100。 如果是非IE浏览器，那么可以获取最终样式的opacity属性， 2、设置透明度 这个就简单了，不用管浏览器，通通的设置opacity及filter， element.style.opacity = start / 100; element.style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;; 实际上这儿我偷了个懒，真正无懈可击的写法，应该是判断一下是否IE浏览器，因为在一些情况下可能使用多个滤镜，这时应该用正则替换alpha滤镜的值，而不是直接设置style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;; 3、element.offsetWidth、element.offsetHeight与element.style.width、element.style.height的关系 只有在IE的border-content式盒模型情况下，这两个值才是相等的，即elementoffsetWidth==element.style.width+element.style.paddingLeft+element.style.paddingRight+element.style.borderLeftWidth+element.style.borderRightWidth 而我认为border-content式盒模型是符合修改元素尺寸时的心理预期的，对非border-content式盒模型情况下要作一个尺寸的修正。 在其它情况下应该对该值加以修正 有人认为以上的修正中默认了padding值的单位是px并且为整数，是不对的， 实际上经由我在ie及firefox下的测试，引用最终样式的padding值，必然是整数，并以px为单位。 4、关于把三个函数合并成一个通用动画函数 以上三个函数的主要逻辑都是一样的： 通过setInterval每隔一定时间修改元素的style属性，以达到动画效果。 所以，把三个函数合并成一个函数是可以的 只是需要在修改特定的属性时出于兼容性，必须作些处理， 因为不同的属性其值类型及单位不一样，不同浏览器下也有区别 如透明度 在非ie下为小数，在ie下是一个特别的滤镜设置 如颜色 一般是用16进制，并有#号前缀 预计这个通用的动画函数的参数会有点多，接口类下 function animator(element, [...]]]></description>
			<content:encoded><![CDATA[<p>首先感谢一下 51js的 abeet 同学 给我们提取出这么简洁的函数<br />
和大家分享一下吧 <a href="http://www.iamued.com/demo/AmFun/Amfun.htm" target="_blank">查看Demo</a><br />
<strong>这三个函数适用于以下情况<br />
</strong>1、在做前端页面时，只需要简单的动画效果，不想引入整个动画类，使用本函数。<br />
2、在写js类时，需要用到简单的动画，为了降低藕合性，使用本函数。</p>
<p>使用方法如下：</p>
<pre class="brush: jscript; title: ; notranslate">
var fade = function(element, transparency, speed, callback){……}
透明度渐变：transparency:透明度 0(全透)-100(不透)；speed:速度1-100，默认为1
例&lt;input onclick=&quot;fade('testDiv', 40)&quot; type=&quot;button&quot; value=&quot;透明度变化&quot; /&gt;

var move = function(element, position, speed, callback){……}
//移动到指定位置，position:移动到指定left及top 格式{left:120, top:340}或{left:120}或{top:340}；speed:速度 1-100，默认为10
例&lt;input onclick=&quot;move('testDiv', {top:400})&quot; type=&quot;button&quot; value=&quot;垂直移动&quot; /&gt;

var resize = function(element, size, speed, callback){……}
//长宽渐变：size:要改变到的尺寸 格式 {width:400, height:250}或{width:400}或{height:250}；speed:速度 1-100，默认为10
例&lt;input onclick=&quot;resize('testDiv', {height:300})&quot; type=&quot;button&quot; value=&quot;改变高度&quot; /&gt;
</pre>
<p><strong>核心代码分析<br />
1、获取一个元素的透明度</strong><br />
如果是IE浏览器，则攻取最终样式的滤镜filter的值，再通过正则表达式获取到透明度滤镜alpha的值，如果不存在透明度滤镜值，则透明度为100。<br />
如果是非IE浏览器，那么可以获取最终样式的opacity属性，</p>
<pre class="brush: jscript; title: ; notranslate">
function getOpacity(elem){
var alpha;
if(navigator.userAgent.toLowerCase().indexOf('msie') != -1){
alpha=elem.currentStyle.filter.indexOf(&quot;opacity=&quot;) &amp;gt;= 0?(parseFloat( elem.currentStyle.filter.match(/opacity=([^)]*)/)[1] )) + '':
'100';
}else{
alpha=100*elem.ownerDocument.defaultView.getComputedStyle(elem,null)['opacity'];
}
return alpha;
};
</pre>
<p><strong>2、设置透明度</strong><br />
这个就简单了，不用管浏览器，通通的设置opacity及filter，<br />
element.style.opacity = start / 100;<br />
element.style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;;<br />
实际上这儿我偷了个懒，真正无懈可击的写法，应该是判断一下是否IE浏览器，因为在一些情况下可能使用多个滤镜，这时应该用正则替换alpha滤镜的值，而不是直接设置style.filter = &#8216;alpha(opacity=&#8217; + start + &#8216;)&#8217;;</p>
<p><strong>3、element.offsetWidth、element.offsetHeight与element.style.width、element.style.height的关系</strong><br />
只有在IE的border-content式盒模型情况下，这两个值才是相等的，即elementoffsetWidth==element.style.width+element.style.paddingLeft+element.style.paddingRight+element.style.borderLeftWidth+element.style.borderRightWidth<br />
而我认为border-content式盒模型是符合修改元素尺寸时的心理预期的，对非border-content式盒模型情况下要作一个尺寸的修正。<br />
在其它情况下应该对该值加以修正</p>
<pre class="brush: jscript; title: ; notranslate">
if(!(navigator.userAgent.toLowerCase().indexOf('msie') != -1&amp;&amp;document.compatMode == 'BackCompat')){
//除了ie下border-content式盒模型情况外，需要对size加以修正
var CStyle=document.defaultView?document.defaultView.getComputedStyle(element,null):element.currentStyle;
if(typeof(size.width)=='number'){
size.width=size.width-CStyle.paddingLeft.replace(/D/g,'')-CStyle.paddingRight.replace(/D/g,'');
}
if(typeof(size.height)=='number'){
size.height=size.height-CStyle.paddingTop.replace(/D/g,'')-CStyle.paddingBottom.replace(/D/g,'');
}
}
</pre>
<p>有人认为以上的修正中默认了padding值的单位是px并且为整数，是不对的，<br />
实际上经由我在ie及firefox下的测试，引用最终样式的padding值，必然是整数，并以px为单位。</p>
<p><strong>4、关于把三个函数合并成一个通用动画函数</strong><br />
以上三个函数的主要逻辑都是一样的：<br />
通过setInterval每隔一定时间修改元素的style属性，以达到动画效果。<br />
所以，把三个函数合并成一个函数是可以的<br />
只是需要在修改特定的属性时出于兼容性，必须作些处理，<br />
因为不同的属性其值类型及单位不一样，不同浏览器下也有区别<br />
如透明度 在非ie下为小数，在ie下是一个特别的滤镜设置<br />
如颜色 一般是用16进制，并有#号前缀<br />
预计这个通用的动画函数的参数会有点多，接口类下<br />
function animator(element, interval, start, end, style, speed, tmp, callback){……}<br />
说明<br />
function animator(元素或元素ID, 计时器句柄,起始值,目标值,需修改的属性, 步进值(增量),值转换过滤方法(用于修改非普通递增递减形的数据，比如16进制颜色递增、前缀符号后缀单位修正), 回调函数)<br />
function animator(&#8216;testdiv&#8217;,'bgcolor&#8217;,'#336699&#8242;,&#8217;#aabbcc&#8217;,'backgroundColor&#8217;,2,changeColor,callback)<br />
颜色修改方法示例（仅供参考，未测试）</p>
<pre class="brush: jscript; title: ; notranslate">
changeColor=function(start,end,speed){
var _10to16 = function(color){
function tmp(index){
var tmp = color[index].toString(16);
return tmp.length == 1 ? &quot;0&quot; + tmp : tmp;
};
return &quot;#&quot; + tmp(0) + tmp(1) + tmp(2);
};
var x16to10 = function(color){
if(!/^#[0-9A-Fa-f]{3,6}$/i.test(color))retun color;
function tmp(index){
return color.charAt(index);
};
color = color.substring(1);
if(color.length == 3)
color = tmp(0) + tmp(0) + tmp(1) + tmp(1) + tmp(2) + tmp(2);
return [parseInt(tmp(0) + tmp(1), 16), parseInt(tmp(2) + tmp(3), 16), parseInt(tmp(4) + tmp(5), 16)];
};
var color = x16to10(start),
var end = x16to10(end),
var index = 3;
while(index--)
color[index] = color[index] &lt; end[index] ? min(color[index] + speed, end[index]) : max(color[index] - speed, end[index]);
reutn color;
}
</pre>
<p>原文见：<a href="http://bbs.51js.com/viewthread.php?tid=86901">http://bbs.51js.com/viewthread.php?tid=86901</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.iamued.com/qianduan/1382.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

