javascript 可控式透明特效實(shí)現(xiàn)代碼
function text(el){
var node = (typeof el == "string")? document.getElementById(el) : el;
var i = 0;
var repeat = function(){
setTimeout(function(){
node.innerHTML = "<h1>"+i+"</h1>";
i++;
if(i <= 100){
setTimeout(arguments.callee, 100);
}
},100)
}
repeat();
}
我們來(lái)試一下最簡(jiǎn)單的淡入特效,就是把node.innerHTML那一行改成透明度的設(shè)置。
function fadeIn(el){
var node = (typeof el == "string")? document.getElementById(el) : el;
var i = 0;
var fade = function(){
setTimeout(function(){
!+"\v1"? (node.style.filter="alpha(opacity="+i+")"): (node.style.opacity = i / 100);
i++;
if(i <= 100){
setTimeout(arguments.callee, 100);
}
},100)
}
fade();
}
但是這樣并不完美,因?yàn)镮E的濾鏡可能會(huì)在IE7中失效,我們必須要用zoom=1來(lái)激活hasLayout。我們?cè)偬砑右恍┛芍贫▍?shù)擴(kuò)充它。注釋已經(jīng)非常詳細(xì),不明白在留言里再問我吧。
function opacity(el){
//必選參數(shù)
var node = (typeof el == "string")? document.getElementById(el) : el,
//可選參數(shù)
options = arguments[1] || {},
//變化的持續(xù)時(shí)間
duration = options.duration || 1.0,
//開始時(shí)透明度
from = options.from || 0.0 ,
//結(jié)束時(shí)透明度
to = options.to || 0.5,
operation = 1,
init = 0;
if(to - from < 0){
operation = -1,
init = 1;
}
//內(nèi)部參數(shù)
//setTimeout執(zhí)行的間隔時(shí)間,單位毫秒
var frequency = 100,
//設(shè)算重復(fù)調(diào)用的次數(shù)
count = duration * 1000 / frequency,
// 設(shè)算每次透明度的遞增量
detal = Math.abs(to - from) /count,
// 正在進(jìn)行的次數(shù)
i = 0;
var main = function(){
setTimeout(function(){
if(!+"\v1"){
if(node.currentStyle.hasLayout) node.style.zoom = 1;//防止濾鏡失效
node.style.filter="alpha(opacity="+ (init * 100 + operation * detal * i * 100).toFixed(1) +")"
}else{
node.style.opacity = (init + operation * detal * i).toFixed(3)
}
node.innerHTML = (init + operation * detal * i).toFixed(3)
i++;
if(i <= count){
setTimeout(arguments.callee, frequency);
}
},frequency)
}
main();
}
效果演示:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
<div class="text" onclick="opacity(this,{duration:4.0,from:0.0,to:1})"></div>
<div class="text" onclick="opacity(this,{duration:4.0,from:1.0,to:0})"></div>
但上面并不盡善盡美,有一個(gè)Bug。我們是通過短路運(yùn)算符來(lái)決定是否使用默認(rèn)參數(shù)還是我們傳入的參數(shù),但在javascript中,數(shù)字0甚至0.0都會(huì)自動(dòng)轉(zhuǎn)換為false。因此在第個(gè)例子,如果我們?cè)趖o中傳入0,它永遠(yuǎn)不會(huì)用到這個(gè)0,而是默認(rèn)的0.5。解決方法讓它變成字符串“0”。另,參數(shù)i也不是必須的,我們可以省去它,用count負(fù)責(zé)所有的循環(huán),但這樣一來(lái),我們的思維就要逆過來(lái)想了。原來(lái)是加的,我們要變成減的。
function opacity(el){
//必選參數(shù)
var node = (typeof el == "string")? document.getElementById(el) : el,
//可選參數(shù)
options = arguments[1] || {},
//變化的持續(xù)時(shí)間
duration = options.duration || 1.0,
//開始時(shí)透明度
from = options.from || 0.0 ,
//結(jié)束時(shí)透明度
to = (options.to && options.to + "") || 0.5,
operation = -1,
init = 1;
if(to - from < 0){
operation = 1,
init = 0;
}
//內(nèi)部參數(shù)
//setTimeout執(zhí)行的時(shí)間,單位
var frequency = 100,
//設(shè)算重復(fù)調(diào)用的次數(shù)
count = duration * 1000 / frequency,
// 設(shè)算每次透明度的遞增量
detal = operation * Math.abs(to - from) /count;
var main = function(){
setTimeout(function(){
if(!+"\v1"){
if(node.currentStyle.hasLayout) node.style.zoom = 1;//防止濾鏡失效
node.style.filter="alpha(opacity="+ (init * 100 + detal * count * 100).toFixed(1) +")"
}else{
node.style.opacity = (init + detal * count).toFixed(3)
}
count--;
if(count + 1){
setTimeout(arguments.callee, frequency);
}
},frequency)
}
main();
}
進(jìn)一步優(yōu)化,利用原型共享方法。
function Opacity(el){
var node = (typeof el == "string")? document.getElementById(el) : el,
options = arguments[1] || {},
duration = options.duration || 1.0,
from = options.from || 0.0 ,
to = (options.to && options.to + "") || 0.5,
operation = -1,
init = 1;
if(to - from < 0){
operation = 1,
init = 0;
}
var frequency = 100,
count = duration * 1000 / frequency,
detal = operation * Math.abs(to - from) /count;
this.main(node,init,detal,count,frequency);
}
Opacity.prototype = {
main : function(node,init,detal,count,frequency){
setTimeout(function(){
if(!+"\v1"){
if(node.currentStyle.hasLayout) node.style.zoom = 1;//防止濾鏡失效
node.style.filter="alpha(opacity="+ (init * 100 + detal * count * 100).toFixed(1) +")"
}else{
node.style.opacity = (init + detal * count).toFixed(3)
}
node.innerHTML = (init + detal * count).toFixed(3)
count--;
if(count + 1){
setTimeout(arguments.callee, frequency);
}
},frequency)
}
}
演示代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
<div class="text" onclick="new Opacity(this,{duration:4.0,from:0.0,to:1})"></div>
<div class="text" onclick="new Opacity(this,{duration:4.0,from:1.0,to:0})"></div>
- javascript實(shí)現(xiàn)帶節(jié)日和農(nóng)歷的日歷特效
- javascript實(shí)例分享---具有立體效果的圖片特效
- 一個(gè)JavaScript的求愛小特效
- 純JavaScript實(shí)現(xiàn)HTML5 Canvas六種特效濾鏡示例
- 23個(gè)Javascript彈出窗口特效整理
- javascript 打字效果的文字特效
- JavaScript妙味課堂 物體平滑移動(dòng)特效
- javascript:google 向上向下滾動(dòng)特效,兼容IE6,7,8,FF
- JavaScript 地震特效
- 同一個(gè)網(wǎng)頁(yè)中實(shí)現(xiàn)多個(gè)JavaScript特效的方法
相關(guān)文章
JScript實(shí)現(xiàn)表格的簡(jiǎn)單操作
這篇文章主要為大家詳細(xì)介紹了JScript實(shí)現(xiàn)簡(jiǎn)單的表格操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
紅黑樹的插入詳解及Javascript實(shí)現(xiàn)方法示例
這篇文章主要給大家介紹了關(guān)于紅黑樹的插入的相關(guān)資料,以及Javascript實(shí)現(xiàn)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。2018-03-03
一個(gè)無(wú)限級(jí)XML綁定跨框架菜單(For IE)
一個(gè)無(wú)限級(jí)XML綁定跨框架菜單(For IE)...2007-01-01
js核心基礎(chǔ)之構(gòu)造函數(shù)constructor用法實(shí)例分析
這篇文章主要介紹了js核心基礎(chǔ)之構(gòu)造函數(shù)constructor用法,結(jié)合具體實(shí)例形式分析了javascript構(gòu)造函數(shù)constructor概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-05-05
JavaScript 轉(zhuǎn)義字符JSON parse錯(cuò)誤研究
這篇文章主要為大家介紹了JavaScript 轉(zhuǎn)義字符JSON parse錯(cuò)誤研究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
javascript實(shí)現(xiàn)電腦和手機(jī)版樣式切換
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)電腦和手機(jī)版樣式切換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
JS動(dòng)畫定時(shí)器知識(shí)總結(jié)
這篇文章給大家總結(jié)了關(guān)于JS動(dòng)畫中定時(shí)器的相關(guān)用法以及相關(guān)知識(shí)點(diǎn)總結(jié),有需要的朋友可以參考學(xué)習(xí)下。2018-03-03
利用JavaScript實(shí)現(xiàn)春節(jié)倒計(jì)時(shí)效果(移動(dòng)端和PC端)
這篇文章主要介紹了通過Html+Css+js如何實(shí)現(xiàn)春節(jié)倒計(jì)時(shí)效果,本文同時(shí)介紹了移動(dòng)端和PC端兩種效果,感興趣的同學(xué)可以跟隨小編一起動(dòng)手試試2022-01-01
無(wú)阻塞加載js,防止因js加載不了影響頁(yè)面顯示的問題
下面小編就為大家?guī)?lái)一篇無(wú)阻塞加載js,防止因js加載不了影響頁(yè)面顯示的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)2016-12-12

