現(xiàn)在網(wǎng)上已經(jīng)有很多很不錯(cuò)的優(yōu)秀Javascript庫(kù)或者效果庫(kù),我們是否有 " /> 福利在线看,少妇裸体淫交免费视频,在线观看va

中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

如何寫一個(gè)通用的JavaScript效果庫(kù)!(1/2)

JavaScript的動(dòng)態(tài)效果最基本的是 動(dòng)態(tài)改變大小,移動(dòng)位置,改變透明度,改變顏色等等。
而其他一些比較炫的效果無(wú)非是對(duì)這些最基本效果的組合和運(yùn)用。

現(xiàn)在網(wǎng)上已經(jīng)有很多很不錯(cuò)的優(yōu)秀Javascript庫(kù)或者效果庫(kù),我們是否有必要再造輪子呢?
放眼望去,Yahoo UI, 基于Prototype的scriptaculous, Rico, JQuery, Dojo,還有很多很多。
這些庫(kù)都帶有很不錯(cuò)很優(yōu)秀的動(dòng)態(tài)效果。我們可以直接使用。
但是對(duì)于一些中小型項(xiàng)目來(lái)說(shuō),只是偶爾用到一兩個(gè)特效,就沒(méi)有必要引用整個(gè)框架,要知道
這些家伙體積都不小哦. prototype.js 50K, scripttaculous的 effects.js也有40-50k  dojo,yui 更大。

在大多數(shù)情況下我們需要一個(gè)小巧獨(dú)立(300行代碼以內(nèi)),無(wú)侵入性的效果庫(kù)。.即使有現(xiàn)有的輪子,
我們不但要學(xué)會(huì)怎么使用輪子,更要學(xué)會(huì)如何親手造一個(gè)輪子。
基于以上原因,我們今天來(lái)重寫一個(gè)靈活的,擴(kuò)展性強(qiáng)的,小巧的,跨瀏覽器的動(dòng)態(tài)效果庫(kù)。

考慮到prototype.js 用戶群的廣泛性,我的部分代碼引用了prototype.js,當(dāng)然,我說(shuō)過(guò) ,我們要做一個(gè)獨(dú)立
的效果庫(kù),即使在沒(méi)有prototype.js的情況下,也要讓代碼正常工作。

先做一些準(zhǔn)備工作。下面這些代碼是任何效果庫(kù)中必不可少的,因?yàn)樗?fù)責(zé)一些類似取位置坐標(biāo),
設(shè)置,獲取element的透明度等這些基礎(chǔ)工作。

代碼:

復(fù)制代碼 代碼如下:
/* 
    這個(gè)函數(shù)的代碼來(lái)自 Prototype.js  http://prototype.conio.NET
    如果頁(yè)面引用了prototype.js ,則可以刪除下面這個(gè)函數(shù), 
    當(dāng)然,即使不刪除也沒(méi)關(guān)系,因?yàn)樽髁撕?jiǎn)單的兼容性判斷 
*/ 
(function(){    
    if     (!("Prototype" in window)){ 
        Prototype={emptyFunction:function(){}}; 
        Class ={ 
            create: function(){return function(){this.initialize.apply(this, arguments)}} 
        };         
        $ = function(element){ 
            return typeof(element)=="string"?document.getElementById(element):element 
        }; 
        $A= function(arrLike){ 
            for(var i=0,ret=[];i<arrLike.length;i++) ret[i]=arrLike[i]; 
            return ret 
        };     

        Number.prototype.toColorPart =function(){return String("00"+this.toString(16)).slice(-2)};         
        Function.prototype.bind = function() { 
             var __method = this, args = $A(arguments), object = args.shift(); 
            return function(){return __method.apply(object, args.concat($A(arguments)))} 
        } 

        Position={  
             cumulativeOffset: function(element) { 
                var valueT = 0, valueL = 0; 
                do { 
                  valueT += element.offsetTop  || 0; 
                  valueL += element.offsetLeft || 0; 
                  element = element.offsetParent; 
                } while (element); 
                return [valueL, valueT]; 
            } 
        }         
    } 
})() 


/* 
    1.讀取/設(shè)置 透明度, 
    2.如果只傳了一個(gè)參數(shù)element,則返回 element的透明度 (0<value<1) 
    3.如果傳了兩個(gè)參數(shù) element和value 則把element的透明度設(shè)置為value  value范圍 0-1 
*/ 
function Opacity(element,value){ 
// by Go_Rush(阿舜) from http://ashun.cnblogs.com/ 
    var ret; 
    if (value===undefined){   //讀取 
        if (!/msie/i.test(navigator.userAgent)) 
            if (ret=element.style.opacity) return parseFloat(ret);           
        try{return element.filters.item('alpha').opacity/100}catch(x){return 1.0} 
    }else{                   //設(shè)置         
        value=Math.min(Math.max(value,0.00001),0.999999)    //這句修復(fù)一些非ie瀏覽器opacity不能設(shè)置為1的bug 
        if (/msie/i.test(navigator.userAgent)) return element.style.filter="alpha(opacity="+value*100+")" 
        return element.style.opacity=value         
    } 


那么怎么設(shè)計(jì)這個(gè)Effect效果庫(kù)呢。
首先,它的入口應(yīng)該簡(jiǎn)潔。 
    1.一個(gè)是要使用效果的元素 element 
    2.另一個(gè)是將要使用什么效果 options 
       options應(yīng)該是擴(kuò)展性強(qiáng)的,方便用戶使用的。我們把它設(shè)計(jì)成哈稀結(jié)構(gòu)。
比如 options={x:100,y:100} 表示 將element移動(dòng)到坐標(biāo) 100,100
options={w:200,h:200} 表示將element的大小改變?yōu)?nbsp;width=200,height=200
他們可以重疊,也可以確省 比如 options={h:20,y:20} 這表示將element移動(dòng)到 top=20的位置,而且在移動(dòng)的過(guò)程中讓他的大小改變?yōu)?nbsp;height=20 ,同時(shí),原來(lái)的left坐標(biāo)和寬度都不發(fā)生改變,這是不是在做QQ的滑動(dòng)效果呢?
還有控制效果的幾個(gè)關(guān)鍵因素 duration(整個(gè)效果的時(shí)間),delay(延遲幾秒才開(kāi)始效果),fps(頻率快慢) 都通過(guò)options傳進(jìn)來(lái)

復(fù)制代碼 代碼如下:
 Effect          =Class.create(); 
 Effect.Fn     =new Object(); 
 Effect.Init   =new Object(); 
               //  By Go_Rush(阿舜) from http://ashun.cnblogs.com/ 
 Effect.prototype={ 
     initialize: function(element,options) { 
         this.element  = $(element); 
         this.options  = options || {}; 
         this.duration   = (this.options.duration || 2) * 1000;   //效果執(zhí)行時(shí)間 
         this.fps            = this.options.fps || 40;                 //頻率 
         //當(dāng)前步長(zhǎng),注: 這個(gè)變量是遞減的,當(dāng)它0的時(shí)候意味著整個(gè)效果結(jié)束 
         this.steps        = Math.floor(this.duration/this.fps);    
         this.maxSteps = this.steps;             //整個(gè)效果的步長(zhǎng) 
         this.setting     = new Object();   
         this.timer         = null;         

      if (this.options.delay){    // 延時(shí)處理 
                var _this=this; 
              setTimeout(function(){ 
                        _this.setup(_this); 
                        (_this.options.onStart || Prototype.emptyFunction)(_this); 
                        _this.run(); 
                 }, _this.options.delay*1000); 
         }else{ 
                  this.setup(this); 
                 (this.options.onStart || Prototype.emptyFunction)(this);         
                 this.run();       
         } 
    }, 
    run: function() { 
         if (this.isFinished())  return (this.options.onComplete || Prototype.emptyFunction)(this); 
         if (this.timer)   clearTimeout(this.timer); 
         this.duration -= this.fps; 
         this.steps--;                            
         var pos=1-this.steps/this.maxSteps    ;    //總進(jìn)度的百分比 
         this.loop(this,pos);     
         (this.options.onUpdate || Prototype.emptyFunction)(this,pos);       
         this.timer = setTimeout(this.run.bind(this), this.fps); 
    }, 
    isFinished: function() {  
            return this.steps <= 0; 
    }, 
    setup:function(effect){       //初始化設(shè)置所有效果單元 
            for(var key in Effect.Init){ 
             if (typeof(Effect.Init[key])!="function") continue; 
             try{Effect.Init[key](this)}catch(x){} 
         } 
     }, 
    loop:function(effect,pos){           //執(zhí)行所有效果單元 
         for(var key in Effect.Fn){ 
             if (typeof(Effect.Fn[key])!="function") continue; 
             try{Effect.Fn[key](effect,pos)}catch(x){} 
         } 
    } 
 } 

當(dāng)動(dòng)態(tài)效果改變的時(shí)候,比如淡出,我們讓一個(gè)element慢慢的變淡變小,并消失。
在不用效果庫(kù)的情況下 只用 element.style.display="none" 就做到了。
用效果庫(kù)后,element.style  的 透明度 opacity, 尺寸 width,height 甚至位置 left,top都發(fā)生了改變。
直到 element的大小改變?yōu)?nbsp;0或者opactiy為0的時(shí)候他才會(huì)消失 display="none"
那么,當(dāng)下次再讓他出現(xiàn)的時(shí)候,怎么恢復(fù)他的原始信息呢。比如 width.height,opacity等。

在上面的代碼中 我們用 effect.setting 保存效果發(fā)生前的所有element信息.

注意以上三個(gè)自定義函數(shù) onStart,onUpdate,onComplete 他們都是通過(guò) options傳進(jìn)來(lái)的調(diào)用者自定義函數(shù)。
分別在效果發(fā)生以前,效果發(fā)生時(shí),效果發(fā)生完畢后執(zhí)行。傳入的參數(shù)可以查閱effect的所有對(duì)象。

看到這里,細(xì)心的看官可能注意到,這個(gè)效果庫(kù)實(shí)際上什么效果都沒(méi)有做,他只是搭了一個(gè)空架子。
Effect.Init 給我們留了一個(gè)空接口供 setup方法調(diào)用,Effect.Fn也是一個(gè)空接口供loop方法調(diào)用。
下面我們要做的是擴(kuò)展 Effect.Init和 Effect.Fn 來(lái)充實(shí)效果庫(kù)。

先來(lái)一個(gè)大家最熟悉的 淡入淡出
Effect.Init 里面的所有成員函數(shù)都會(huì)被 effect.setup 執(zhí)行, 這個(gè)執(zhí)行動(dòng)作在效果開(kāi)始之前,因此這里
適合做一些初始化的動(dòng)作。 比如把一些初始信息保存到 effect.setting里面供以后使用。

Effect.Fn 里面的所有成員函數(shù)都會(huì)被 effect.loop 執(zhí)行, 這個(gè)執(zhí)行動(dòng)作在效果運(yùn)行中,因此這里
就要放核心效果代碼,比如計(jì)算,改變效果增量等等。 

復(fù)制代碼 代碼如下:
 if (effect.options.opacity===undefined) return; 
 effect.setting.opacity=Opacity(effect.element);  


Effect.Fn.opacity=function(effect,pos){ 
 if (effect.options.opacity===undefined) return; 
 Opacity(effect.element,effect.setting.opacity+(effect.options.opacity-effect.setting.opacity)*pos);  




下面貼出可調(diào)試代碼(空效果庫(kù)和淡入淺出插件):(可以拷貝到一個(gè)html運(yùn)行,測(cè)試)

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
這一頁(yè)挺長(zhǎng)的,明天新開(kāi)一個(gè)隨筆,再把擴(kuò)展的插件 size, move,zoom,color等等全部貼出來(lái),還有一些示范代碼

JavaScript技術(shù)如何寫一個(gè)通用的JavaScript效果庫(kù)!(1/2),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 综合久久综合久久 | 成年人黄色一级片 | 自拍视频在线观看 | 亚洲一级毛片 | 国产精品污www在线观看 | av大片| 久久久日韩精品一区二区三区 | 大象视频一区二区 | 亚洲成人一区二区 | 久久另类| 久热久热 | 天天色天天| 男女羞羞视频免费 | 国产一极毛片 | 全免费a级毛片免费看视频免 | 日本超碰 | av网站免费观看 | 国产欧美日韩二区 | 成人av资源在线 | 香蕉一区 | 国产毛片av | 亚洲国产精久久久久久久 | 国产精品一区网站 | 国产精品一区二区久久久久 | 成人h视频在线 | 色综合久久天天综合网 | 亚洲高清视频在线观看 | 99亚洲精品视频 | 99精品视频网 | 亚洲一区二区视频 | 亚洲国产免费 | 国产免费色 | 另类二区 | 久久激情视频 | 国产精品成人在线播放 | 日本大香伊一区二区三区 | 国产视频一区二区三区四区五区 | 欧美一级二级视频 | 日韩精品免费在线观看 | 中文字幕一区二区三区四区五区 | 国产精品99久久久久 |