一个很简单的淡入淡出相册 (转)
不知题目是否妥当,总之就是在相册中使用fade效果,让图片切换变得非常自然舒服。
1.
<
div
id
=
"album"
>
2.
<
img
src
=
"http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type1.jpg"
/>
3.
<
img
src
=
"http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type2.jpg"
/>
4.
<
img
src
=
"http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type3.jpg"
/>
5.
<
img
src
=
"http://images.cnblogs.com/cnblogs_com/rubylouvre/202906/t_type4.jpg"
/>
6.
</
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.
}
下面详细讲解一下淡入谈出相册的运作。尽管相册有许多相片,每次运行都是执行两张相片的透明度设置。并且当上面一张(我们看到的那张)正准备淡出时,下面那张已淡入得差不多。换言之,我们要想办法错开两张图片的出场时间。由于淡入淡出(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.
}
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.
}
好了本文就到止了,简单的结构层与表现层注定了行为层不会有多大作为。相册如果要做得很漂亮,通常需要动用到定义列表与伪类,随之而来的是几百行javascript代码,显然这与我的题目不符。另,基于时间轴来编写代码太考验人的思维能力,没有可视化界面吓跑一堆人,都跑去做Flash了。