一个很简单的淡入淡出相册 (转)

本文介绍了一种使用HTML、CSS及JavaScript实现相册图片切换时的Fade效果的方法。通过设置图片的透明度并利用定时器逐步调整透明度,使得图片在切换时能够平滑过渡。

不知题目是否妥当,总之就是在相册中使用fade效果,让图片切换变得非常自然舒服。

<div id="album"> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type1.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type2.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type3.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type4.jpg" /> </div>

运行代码

添加样式,目标是让所有图片像叠罗汉一样摞在一起。

01. #album{
02.   position:relative;
03.   border:10px solid #000;
04.   width:90px;
05.   height:120px;
06.   overflow:hidden;
07. }
08. #album img{
09.   position:absolute;
10.   top:0;
11.   left:0;
12. }
<div id="album"> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type1.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type2.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type3.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type4.jpg" /> </div> <style type="text/css"> #album{ position:relative; border:10px solid #000; width:90px; height:120px; overflow:hidden; } #album img{ position:absolute; top:0; left:0; } </style>

运行代码

下面详细讲解一下淡入谈出相册的运作。尽管相册有许多相片,每次运行都是执行两张相片的透明度设置。并且当上面一张(我们看到的那张)正准备淡出时,下面那张已淡入得差不多。换言之,我们要想办法错开两张图片的出场时间。由于淡入淡出(fade)其实是透明特效加display的切换,如何取得opacity样式值呢?要知道,设置样式与获取样式,完全不是一回事。获取样式远比设置样式复杂,如果不是内联样式,在IE中就要调用currentStyle加遍历父级元素。一个取巧的办法,就是不要在获取opacity中下工夫,直接设置一个自定义属性opacity(非style.opacity),每次执行透明度设置时用这个opacity赋值,并每次一点点改变这个opacity的值。正在淡出的图片对象的opacity呈递减状态,反之亦然。

01. var album = function(el){
02.   var node = (typeof el == "string")? document.getElementById(el):el;
03.   var images = node.getElementsByTagName("img");
04.   var length = images.length;
05.   for(var i=1;i<length;i++) images[i].opacity = 0;//为所有图片设置一个自定义属性opacity
06.   images[0].opacity = 0.99;
07.   var current = 0;
08.   (function(){
09.     setTimeout(function(){
10.       var cOpacity = images[current].opacity,
11.       next = images[current+1]?current+1:0;//下一张图片的索引,如果没有就回到第一张
12.       var nOpacity = images[next].opacity;
13.       cOpacity-=.05;
14.       nOpacity+=.05;
15.       images[current].opacity = cOpacity;
16.       images[next].opacity = nOpacity;
17.       images[next].style.display = "block";//确保肯定有一张图片是可见的
18.       setOpacity(images[current]);
19.       setOpacity(images[next]);
20.       if(cOpacity<=0) {
21.         images[current].style.display = "none";
22.         current = next;
23.         setTimeout(arguments.callee,1000);
24.       }else{
25.         setTimeout(arguments.callee,50);
26.       }
27.     },100)
28.   })()
29. }
30. var setOpacity =function(obj) {
31.   if(obj.opacity>.99) {
32.     obj.opacity = .99;
33.   }
34.   obj.style.opacity = obj.opacity;
35.   obj.style.filter = "alpha(opacity=" + (obj.opacity*100) + ")";
36. }
<!doctype html> <html dir="ltr" lang="zh-CN" > <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=8"> <title>相册</title> </head> <body> <div id="album" > <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type1.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type2.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type3.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type4.jpg" /> </div> <style type="text/css"> #album{ position:relative; border:10px solid #000; width:85px; height:120px; overflow:hidden; } #album img{ position:absolute; top:0; left:0; } </style> <script type="text/javascript"> var album = function(el){ var node = (typeof el == "string")? document.getElementById(el):el; var images = node.getElementsByTagName("img"); var length = images.length; for(var i=1;i<length;i++) images[i].opacity = 0;//为所有图片设置一个自定义属性opacity images[0].opacity = 0.99; images[0].style.display = "block"; var current = 0; (function(){ setTimeout(function(){ var cOpacity = images[current].opacity, next = images[current+1]?current+1:0;//下一张图片的索引,如果没有就回到第一张 var nOpacity = images[next].opacity; cOpacity-=.05; nOpacity+=.05; images[current].opacity = cOpacity; images[next].opacity = nOpacity; images[next].style.display = "block";//确保肯定有一张图片是可见的 setOpacity(images[current]); setOpacity(images[next]); if(cOpacity<=0) { images[current].style.display = "none"; current = next; setTimeout(arguments.callee,1000); }else{ setTimeout(arguments.callee,50); } },100) })() } var setOpacity =function(obj) { if(obj.opacity>.99) { obj.opacity = .99; } obj.style.opacity = obj.opacity; obj.style.filter = "alpha(opacity=" + (obj.opacity*100) + ")"; } window.onload = function(){ var el = document.getElementById("album"); album(el); } </script> <p>请稍等4秒………………</p> </body> </html>

运行代码

ablum函数中的闭包相当于:

01. var repeat = function(){
02.   setTimeout(function(){
03.     //*************略*************
04.     if(cOpacity<=0) {
05.       images[current].style.display = "none";
06.       current = next;
07.       setTimeout(repeat,1000);
08.     }else{
09.       setTimeout(repeat,50);
10.     }
11.   },100)
12.   repeat();

闭包让我们少写许多东西,程序变得更紧凑。我们甚至可以搞个点击停顿效果,不过说实话,只是个假象而已,只能让它多停留两秒。你多点击几下,这张图片就静止久一点。我可不想点击一下整个相册就不动了。

01. var album = function(el){
02.   var node = (typeof el == "string")? document.getElementById(el):el;
03.   var images = node.getElementsByTagName("img");
04.   var length = images.length;
05.   var current = 0;
06.   for(var i=1;i<length;i++){
07.     images[i].opacity = 0;//为所有图片设置一个自定义属性opacity
08.     images[i].onclick = (function(i){//点击停顿效果
09.       return function(){
10.         current = i + 1;
11.         if(current > 3)
12.           current = 3
13.       }
14.     })(i);
15.   }
16.   images[0].opacity = 0.99;
17.   (function(){
18.     setTimeout(function(){
19.       var cOpacity = images[current].opacity,
20.       next = images[current+1]?current+1:0;//下一张图片的索引,如果没有就回到第一张
21.       var nOpacity = images[next].opacity;
22.       cOpacity-=.05;
23.       nOpacity+=.05;
24.       images[current].opacity = cOpacity;
25.       images[next].opacity = nOpacity;
26.       images[next].style.display = "block";//确保肯定有一张图片是可见的
27.       setOpacity(images[current]);
28.       setOpacity(images[next]);
29.       if(cOpacity<=0) {
30.         images[current].style.display = "none";
31.         current = next;
32.         setTimeout(arguments.callee,1000);
33.       }else{
34.         setTimeout(arguments.callee,50);
35.       }
36.     },100)
37.   })()
38. }
39. var setOpacity =function(obj) {
40.   if(obj.opacity>.99) {
41.     obj.opacity = .99;
42.   }
43.   obj.style.opacity = obj.opacity;
44.   obj.style.filter = "alpha(opacity=" + (obj.opacity*100) + ")";
45. }
<!doctype html> <html dir="ltr" lang="zh-CN"> <head> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=8"> <title>相册</title> </head> <body> <div id="album" > <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type1.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type2.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type3.jpg" /> <img src="http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type4.jpg" /> </div> <style type="text/css"> #album{ position:relative; border:10px solid #000; width:85px; height:120px; overflow:hidden; } #album img{ position:absolute; top:0; left:0; } </style> <script type="text/javascript"> var album = function(el){ var node = (typeof el == "string")? document.getElementById(el):el; var images = node.getElementsByTagName("img"); var length = images.length; var current = 0; for(var i=1;i<length;i++){ images[i].opacity = 0;//为所有图片设置一个自定义属性opacity images[i].onclick = (function(i){ return function(){ current = i + 1; if(current > 3) current = 3 } })(i); } images[0].opacity = 0.99; (function(){ setTimeout(function(){ var cOpacity = images[current].opacity, next = images[current+1]?current+1:0;//下一张图片的索引,如果没有就回到第一张 var nOpacity = images[next].opacity; cOpacity-=.05; nOpacity+=.05; images[current].opacity = cOpacity; images[next].opacity = nOpacity; images[next].style.display = "block";//确保肯定有一张图片是可见的 setOpacity(images[current]); setOpacity(images[next]); if(cOpacity<=0) { images[current].style.display = "none"; current = next; setTimeout(arguments.callee,1000); }else{ setTimeout(arguments.callee,50); } },100) })() } var setOpacity =function(obj) { if(obj.opacity>.99) { obj.opacity = .99; } obj.style.opacity = obj.opacity; obj.style.filter = "alpha(opacity=" + (obj.opacity*100) + ")"; } window.onload = function(){ var el = document.getElementById("album"); album(el); } </script> </body> </html>

运行代码

好了本文就到止了,简单的结构层与表现层注定了行为层不会有多大作为。相册如果要做得很漂亮,通常需要动用到定义列表与伪类,随之而来的是几百行javascript代码,显然这与我的题目不符。另,基于时间轴来编写代码太考验人的思维能力,没有可视化界面吓跑一堆人,都跑去做Flash了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值