淺析Javascript透明特效的可控式實現
可控式Javascript透明特效也就是透明度可以自行設置,但是這種方法在IE7下極有可能失效,不過這些東西對大家了解Javascript透明特效還是有所幫助的。
Javascript透明特效是script.aculo.us提到的特效中最簡單的特效之一。既然是特效,必須涉及時間與空間的概念。時間我們可以用setTimeout與setInterval,個人比較喜歡setTimeout,雖然它每次調用都重復注冊,但可控性比較好。空間就全憑CSS的絕對定位實現位移了。在開始之前,我們練習一下setTimeout的遞歸用法(用來模擬setInterval)。
01.
function
text(el){
02.
var
node = (
typeof
el ==
"string"
)? document.getElementById(el) : el;
03.
var
i = 0;
04.
var
repeat =
function
(){
05.
setTimeout(
function
(){
06.
node.innerHTML =
"<h1>"
+i+
"</h1>"
;
07.
i++;
08.
if
(i <= 100){
09.
setTimeout(arguments.callee, 100);
10.
}
11.
},100)
12.
}
13.
repeat();
14.
}
我們來試一下最簡單的淡入特效,就是把node.innerHTML那一行改成透明度的設置。
01.
function
fadeIn(el){
02.
var
node = (
typeof
el ==
"string"
)? document.getElementById(el) : el;
03.
var
i = 0;
04.
var
fade =
function
(){
05.
setTimeout(
function
(){
06.
!+
"\v1"
? (node.style.filter=
"alpha(opacity="
+i+
")"
): (node.style.opacity = i / 100);
07.
i++;
08.
if
(i <= 100){
09.
setTimeout(arguments.callee, 100);
10.
}
11.
},100)
12.
}
13.
fade();
14.
}
但是這樣并不完美,因為IE的濾鏡可能會在IE7中失效,我們必須要用zoom=1來激活hasLayout。我們再添加一些可制定參數擴充它。注釋已經非常詳細,不明白在留言里再問我吧。
01.
function
opacity(el){
02.
//必選參數
03.
var
node = (
typeof
el ==
"string"
)? document.getElementById(el) : el,
04.
//可選參數
05.
options = arguments[1] || {},
06.
//變化的持續時間
07.
duration = options.duration || 1.0,
08.
//開始時透明度
09.
from = options.from || 0.0 ,
10.
//結束時透明度
11.
to = options.to || 0.5,
12.
operation = 1,
13.
init = 0;
14.
if
(to - from < 0){
15.
operation = -1,
16.
init = 1;
17.
}
18.
//內部參數
19.
//setTimeout執行的間隔時間,單位毫秒
20.
var
frequency = 100,
21.
//設算重復調用的次數
22.
count = duration * 1000 / frequency,
23.
// 設算每次透明度的遞增量
24.
detal = Math.abs(to - from) /count,
25.
// 正在進行的次數
26.
i = 0;
27.
var
main =
function
(){
28.
setTimeout(
function
(){
29.
if
(!+
"\v1"
){
30.
if
(node.currentStyle.hasLayout) node.style.zoom = 1;
//防止濾鏡失效
31.
node.style.filter=
"alpha(opacity="
+ (init * 100 + operation * detal * i * 100).toFixed(1) +
")"
32.
}
else
{
33.
node.style.opacity = (init + operation * detal * i).toFixed(3)
34.
}
35.
node.innerHTML = (init + operation * detal * i).toFixed(3)
36.
i++;
37.
if
(i <= count){
38.
setTimeout(arguments.callee, frequency);
39.
}
40.
},frequency)
41.
}
42.
main();
43.
}
1.
<
div
class
=
"text"
onclick
=
"opacity(this,{duration:4.0,from:0.0,to:1})"
></
div
>
2.
<
div
class
=
"text"
onclick
=
"opacity(this,{duration:4.0,from:1.0,to:0})"
></
div
>
但上面并不盡善盡美,有一個Bug。我們是通過短路運算符來決定是否使用默認參數還是我們傳入的參數,但在Javascript中,數字0甚至0.0都會自動轉換為false。因此在第個例子,如果我們在to中傳入0,它永遠不會用到這個0,而是默認的0.5。解決方法讓它變成字符串“0”。另,參數i也不是必須的,我們可以省去它,用count負責所有的循環,但這樣一來,我們的思維就要逆過來想了。原來是加的,我們要變成減的。
01.
function
opacity(el){
02.
//必選參數
03.
var
node = (
typeof
el ==
"string"
)? document.getElementById(el) : el,
04.
//可選參數
05.
options = arguments[1] || {},
06.
//變化的持續時間
07.
duration = options.duration || 1.0,
08.
//開始時透明度
09.
from = options.from || 0.0 ,
10.
//結束時透明度
11.
to = (options.to && options.to +
""
) || 0.5,
12.
operation = -1,
13.
init = 1;
14.
if
(to - from < 0){
15.
operation = 1,
16.
init = 0;
17.
}
18.
//內部參數
19.
//setTimeout執行的時間,單位
20.
var
frequency = 100,
21.
//設算重復調用的次數
22.
count = duration * 1000 / frequency,
23.
// 設算每次透明度的遞增量
24.
detal = operation * Math.abs(to - from) /count;
25.
var
main =
function
(){
26.
setTimeout(
function
(){
27.
if
(!+
"\v1"
){
28.
if
(node.currentStyle.hasLayout) node.style.zoom = 1;
//防止濾鏡失效
29.
node.style.filter=
"alpha(opacity="
+ (init * 100 + detal * count * 100).toFixed(1) +
")"
30.
}
else
{
31.
node.style.opacity = (init + detal * count).toFixed(3)
32.
}
33.
count--;
34.
if
(count + 1){
35.
setTimeout(arguments.callee, frequency);
36.
}
37.
},frequency)
38.
}
39.
main();
40.
}
進一步優化,利用原型共享方法。
01.
function
Opacity(el){
02.
var
node = (
typeof
el ==
"string"
)? document.getElementById(el) : el,
03.
options = arguments[1] || {},
04.
duration = options.duration || 1.0,
05.
from = options.from || 0.0 ,
06.
to = (options.to && options.to +
""
) || 0.5,
07.
operation = -1,
08.
init = 1;
09.
if
(to - from < 0){
10.
operation = 1,
11.
init = 0;
12.
}
13.
var
frequency = 100,
14.
count = duration * 1000 / frequency,
15.
detal = operation * Math.abs(to - from) /count;
16.
this
.main(node,init,detal,count,frequency);
17.
}
18.
Opacity.prototype = {
19.
main :
function
(node,init,detal,count,frequency){
20.
setTimeout(
function
(){
21.
if
(!+
"\v1"
){
22.
if
(node.currentStyle.hasLayout) node.style.zoom = 1;
//防止濾鏡失效
23.
node.style.filter=
"alpha(opacity="
+ (init * 100 + detal * count * 100).toFixed(1) +
")"
24.
}
else
{
25.
node.style.opacity = (init + detal * count).toFixed(3)
26.
}
27.
node.innerHTML = (init + detal * count).toFixed(3)
28.
count--;
29.
if
(count + 1){
30.
setTimeout(arguments.callee, frequency);
31.
}
32.
},frequency)
33.
}
34.
}
1.
<
div
class
=
"text"
onclick
=
"new Opacity(this,{duration:4.0,from:0.0,to:1})"
></
div
>
2.
<
div
class
=
"text"
onclick
=
"new Opacity(this,{duration:4.0,from:1.0,to:0})"
></
div
>
原文標題:javascript的可控式透明特效
鏈接:http://www.cnblogs.com/rubylouvre/archive/2009/09/14/1566532.html
【編輯推薦】