日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript 渐变效果

發布時間:2023/12/31 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript 渐变效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序集合了寬度、高度、透明度、top、left的漸變,可以自定義漸變項目和各個項目的初始值結束值,還能以任意點(定點)為中心漸變。

使用該程序能實現很多常見的動畫特效,包括大小變換、位置變換、漸顯漸隱等等。

?

效果:

?

?

程序說明:


漸變效果的原理就是利用定時器不斷設置值,如果要減速效果就設置一個步長(詳細看JavaScript 彈簧效果) 。
這里只是把能漸變的屬性(透明度、寬、高、left、top)整合在一起,使用相同的漸變級數(Step)使漸變同步,形成多個屬性同時漸變的效果。

下面說說有用的地方:


【最終樣式】
在JavaScript 圖片切割效果的邊寬獲取中也說到了最終樣式,在使用offset獲取的數據設置寬度高度的時候,必須先減去最終樣式中的邊框寬度。
在這里我使用了muxrwc的在FF下實現currentStyle方法,這樣在ff和ie都可以從currentStyle獲取最終樣式了:

Code
if(!isIE){
????HTMLElement.prototype.__defineGetter__(
"currentStyle",?function?()?{
????????
return?this.ownerDocument.defaultView.getComputedStyle(this,?null);
????});
}


使用這個獲取邊框寬度:

this._xBorder?=?function(){?return?(parseInt(obj.currentStyle.borderLeftWidth)?+?parseInt(obj.currentStyle.borderRightWidth));?}
this._yBorder?=?function(){?return?(parseInt(obj.currentStyle.borderTopWidth)?+?parseInt(obj.currentStyle.borderBottomWidth));?}


【寬度或高度優先】
寬度或高度優先其實就是先執行其中一個漸變,在完成后再執行另一個漸變。
漸變程序中在執行完一次漸變之后會返回一個bool值表示是否漸變完成,利用這個可以這樣:

this.SetWidth()?&&?this.SetHeight();


由于&&的特性,當this.SetWidth()返回true時才會去執行this.SetHeight(),這也是不錯的技巧。
同時為了同步漸變,另外的漸變使用了兩倍的步長:

Code
this.Step?=?2*this.Step;
this.SetOpacity();?this.SetTop();?this.SetLeft();
this.Step?=?this.Step/2;


這樣就能做出寬度或高度優先的效果了。

【定點漸變】
先說說原理,例如以寬度中點為參照點,可以想象如果寬度減少n,那只要left相對增加n*0.5(即n/2),
那么就可以做出以中點為中心變換的效果(當然要先把變換對象設為相對或絕對定位)。
那這個“0.5”怎么來的呢?有點數理知識應該知道就是漸變對象左邊到變換點跟漸變對象總寬度的比
程序里用Width.pos保存這個值,在變換前先計算好變換點的位置:

this._x?=?this._obj.offsetLeft?+?this._obj.offsetWidth?*?this.Width.pos;

每次變換都根據這個位置和寬度來重新設置left:

this._obj.style.left?=?this._x?-?this._obj.offsetWidth?*?this.Width.pos?+?"px";


可能有人會說直接在原有left基礎上加上變換寬度*Width.pos不是一樣嗎?
但問題是經過多次的變換計算(到達目標值前會有多次計算)之后得到的值已經不準確了。
因為在變換計算過程中很多小數會被忽略,隨著計算次數增多結果的出入也越大,
所以先定好變換位置參照值(_x),這樣不論經過多少次計算變換位置都不會走位了。

同理只要設置不同的Width.pos(包括負數和大于1的數)和Height.pos就可以以任意點為中心漸變了。

還有就是程序的設計也花了不少心思,為了提高整合度,做了一個FadeStruct的結構,其中run、start、end、target屬性分別是是否漸變、開始值、結束值、目標值。
用了兩次的Object.extend來設置默認值,詳細可以看程序。


使用說明:


必要的參數只有一個,就是漸變對象,不過只有漸變對象是沒有效果的,必須設置其他屬性:
Opacity:透明漸變參數
Height:高度漸變參數
Width:寬度漸變參數
Top:Top漸變參數
Left:Left漸變參數
Step:10,//變化率
Time:10,//變化間隔
Mode:"both",//漸變順序
Show:false,//是否默認打開狀態
onFinish:function(){}//完成時執行

其中Opacity、Height、Width、Top、Left比較特別,是FadeStruct結構

例子里實例化這個對象:

Code
var?f?=?new?Fade("idFade",?{?Show:?true,
????Opacity:?{?run:?
true?},
????Height:?{?run:?
true?},
????Width:?{?run:?
true,?pos:?.5?},
????Top:?{?run:?
true,?end:?70?}
});


設置run為true就表示開啟這個變換,start和end是開始和結束值,pos是Height和Width特有的變換位置屬性。

更詳細的應用可以看實例。?

程序代碼:

Code
var?isIE?=?(document.all)???true?:?false;

var?$?=?function?(id)?{
????
return?"string"?==?typeof?id???document.getElementById(id)?:?id;
};

if(!isIE){
????HTMLElement.prototype.__defineGetter__(
"currentStyle",?function?()?{
????????
return?this.ownerDocument.defaultView.getComputedStyle(this,?null);
????});
}

var?Class?=?{
??create:?
function()?{
????
return?function()?{
??????
this.initialize.apply(this,?arguments);
????}
??}
}

Object.extend?
=?function(destination,?source)?{
????
for?(var?property?in?source)?{
????????destination[property]?
=?source[property];
????}
????
return?destination;
}


var?FadeStruct?=?function(options){
????
this.run?=?false;//是否漸變
????this.start?=?0;//開始值
????this.end?=?0;//結束值
????this.target?=?0;//目標值
????Object.extend(this,?options?||?{});
}

var?Fade?=?Class.create();
Fade.prototype?
=?{
??initialize:?
function(obj,?options)?{
????
????
var?obj?=?$(obj);
????obj.style.overflow?
=?"hidden";
????
this._obj?=?obj;
????
????
this._timer?=?null;//定時器
????this._finish?=?true;//是否執行完成
????this._fun?=?function(){};//漸變程序
????this._x?=?this._y?=?0;//變換點位置
????
????
//設置獲取透明度程序
????this._setOpacity?=?isIE???function(opacity){?obj.style.filter?=?"alpha(opacity:"?+?opacity?+?")";?}?:?function(opacity){?obj.style.opacity?=?opacity?/?100;?};
????
this._getOpacity?=?isIE???function(){?return?parseInt(obj.filters["alpha"].opacity);?}?:?function(opacity){?return?100?*?parseFloat(obj.currentStyle.opacity);?};
????
????
//獲取邊框寬度程序
????this._xBorder?=?function(){?return?(parseInt(obj.currentStyle.borderLeftWidth)?+?parseInt(obj.currentStyle.borderRightWidth));?}
????
this._yBorder?=?function(){?return?(parseInt(obj.currentStyle.borderTopWidth)?+?parseInt(obj.currentStyle.borderBottomWidth));?}
????
????
this.SetOptions(options);
????
????
this.Mode?=?this.options.Mode;
????
this.Time?=?Math.abs(this.options.Time);
????
this.onFinish?=?this.options.onFinish;
????
????
//先設置特殊默認值
????this.Opacity?=?new?FadeStruct({?end:?100?});
????
this.Top?=?new?FadeStruct({?start:?this._obj.offsetTop,?end:?this._obj.offsetTop?});
????
this.Left?=?new?FadeStruct({?start:?this._obj.offsetLeft,?end:?this._obj.offsetLeft?});
????
this.Height?=?new?FadeStruct({?end:?this._obj.offsetHeight?-?this._yBorder()?});
????
this.Width?=?new?FadeStruct({?end:?this._obj.offsetWidth?-?this._xBorder()?});
????
????
//再設置用戶默認值
????Object.extend(this.Opacity,?this.options.Opacity);
????Object.extend(
this.Top,?this.options.Top);
????Object.extend(
this.Left,?this.options.Left);
????Object.extend(
this.Height,?this.options.Height);
????Object.extend(
this.Width,?this.options.Width);
????
????
//變換位置參數
????this.Height.pos?=?Number(this.options.Height.pos);
????
this.Width.pos?=?Number(this.options.Width.pos);
????
????
//設置成默認狀態
????this.Show?=?!this.options.Show;
????
this.Step?=?1;
????
this.Start();
????
//重新設置Step
????this.Step?=?Math.abs(this.options.Step);
??},
??
//設置默認屬性
??SetOptions:?function(options)?{
????
this.options?=?{//默認值
????????Opacity:????{},//透明漸變參數
????????Height:????????{},//高度漸變參數
????????Width:????????{},//寬度漸變參數
????????Top:????????{},//Top漸變參數
????????Left:????????{},//Left漸變參數
????????Step:????????10,//變化率
????????Time:????????10,//變化間隔
????????Mode:????????"both",//漸變順序
????????Show:????????false,//是否默認打開狀態
????????onFinish:????function(){}//完成時執行
????};
????Object.extend(
this.options,?options?||?{});
??},????????
??
//觸發
??Start:?function()?{
????clearTimeout(
this._timer);
????
//取反表示要設置的狀態
????this.Show?=?!this.Show;
????
//為避免透明度為null值,需要先設置一次透明度
????if(this.Opacity.run){?this._setOpacity(this.Show???this.Opacity.start?:?this.Opacity.end);?}
????
//根據狀態設置目標值
????if(this.Show){
????????
this.Opacity.target?=?this.Opacity.end;
????????
this.Top.target?=?this.Top.end;
????????
this.Left.target?=?this.Left.end;
????????
this.Height.target?=?this.Height.end;
????????
this.Width.target?=?this.Width.end;
????}?
else{
????????
this.Opacity.target?=?this.Opacity.start;
????????
this.Top.target?=?this.Top.start;
????????
this.Left.target?=?this.Left.start;
????????
this.Height.target?=?this.Height.start;
????????
this.Width.target?=?this.Width.start;
????}
????
//設置漸變程序
????switch?(this.Mode.toLowerCase())?{
????????
case?"width"?:
????????????
this._fun?=?function(){
????????????????
this.SetWidth()?&&?this.SetHeight();
????????????????
//由于分了兩步,下面的步長變成兩倍
????????????????this.Step?=?2*this.Step;
????????????????
this.SetOpacity();?this.SetTop();?this.SetLeft();
????????????????
this.Step?=?this.Step/2;
????????????}
????????????
break;
????????
case?"height"?:
????????????
this._fun?=?function(){
????????????????
this.SetHeight()?&&?this.SetWidth();
????????????????
//由于分了兩步,下面的步長變成兩倍
????????????????this.Step?=?2*this.Step;
????????????????
this.SetOpacity();?this.SetTop();?this.SetLeft();
????????????????
this.Step?=?this.Step/2;
????????????}
????????????
break;
????????
case?"both"?:
????????
default?:
????????????
this._fun?=?function(){?this.SetHeight();?this.SetWidth();?this.SetOpacity();?this.SetTop();?this.SetLeft();}
????}
????
//獲取變換點位置
????//由于設置變換點后與top和left變換有沖突只能執行其一
????if(this.Height.pos){?this._y?=?this._obj.offsetTop?+?this._obj.offsetHeight?*?this.Height.pos;?this.Top.run?=?false;?}
????
if(this.Width.pos){?this._x?=?this._obj.offsetLeft?+?this._obj.offsetWidth?*?this.Width.pos;?this.Left.run?=?false;?}
????
????
this.Run();
??},
??
//執行
??Run:?function()?{
????clearTimeout(
this._timer);
????
this._finish?=?true;
????
//執行漸變
????this._fun();
????
//未完成繼續執行
????if?(this._finish)?{?this.onFinish();?}
????
else?{?var?oThis?=?this;?this._timer?=?setTimeout(function(){?oThis.Run();?},?this.Time);?}
??},
??
//設置高度漸變
??SetHeight:?function()?{
????
var?iGet?=?this.Get(this.Height,?this._obj.offsetHeight?-?this._yBorder());
????
if(isNaN(iGet))?return?true;
????

????
this._obj.style.height?=?iGet?+?"px";
????
//如果有變換點設置
????if(this.Height.pos){?this._obj.style.top?=?this._y?-?this._obj.offsetHeight?*?this.Height.pos?+?"px";?}
????
return?false;
??},
??
//設置寬度漸變
??SetWidth:?function()?{
????
var?iGet?=?this.Get(this.Width,?this._obj.offsetWidth?-?this._xBorder());
????
if(isNaN(iGet))?return?true;
????
????
this._obj.style.width?=?iGet?+?"px";
????
if(this.Width.pos){?this._obj.style.left?=?this._x?-?this._obj.offsetWidth?*?this.Width.pos?+?"px";?}
????
return?false;
??},
??
//設置top漸變
??SetTop:?function()?{
????
var?iGet?=?this.Get(this.Top,?this._obj.offsetTop);
????
if(isNaN(iGet))?return?true;
????
????
this._obj.style.top?=?iGet?+?"px";
????
return?false;
??},
??
//設置left漸變
??SetLeft:?function()?{
????
var?iGet?=?this.Get(this.Left,?this._obj.offsetLeft);
????
if(isNaN(iGet))?return?true;
????
????
this._obj.style.left?=?iGet?+?"px";
????
return?false;
??},
??
//設置透明漸變
??SetOpacity:?function()?{
????
var?iGet?=?this.Get(this.Opacity,?this._getOpacity());
????
if(isNaN(iGet))?return?true;
????
????
this._setOpacity(iGet);
????
return?false;
??},
??
//獲取設置值
??Get:?function(o,?now){
????
if(o.run){
????????
var?iStep?=?(o.target?-?now)?/?this.Step;
????????
if(iStep){????????
????????????
this._finish?=?false;
????????????
if(Math.abs(iStep)?<?1){?iStep?=?iStep?>?0???1?:?-1;?}
????????????
return?now?+?iStep;
????????}
????}
??}
};


下載完整測試代碼

總結

以上是生活随笔為你收集整理的JavaScript 渐变效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色一区二区三区四区 | 噜噜吧噜噜色 | 伊人狠狠干 | 亚洲第一黄 | 91视频在线看 | 亚州av网站 | 亲子乱aⅴ一区二区三区 | 成人性生交大免费看 | 亚洲一区二区三区网站 | 天天综合视频 | 色校园| 在线免费观看一级片 | 一级黄色片看看 | 亚洲毛片一区二区三区 | 国产精品久久久久影院老司 | 日本在线一区 | 亚洲小说区图片区都市 | 亚洲av久久久噜噜噜熟女软件 | 日韩av成人在线 | 国产视频播放 | 成人久久精品人妻一区二区三区 | 高h调教冰块play男男双性文 | 久久伊人操| 黄色三级视频网站 | 黑丝一区二区三区 | 国产三级午夜理伦三级 | 狠狠躁日日躁夜夜躁2022麻豆 | 香蕉视频三级 | 欧美一级黄色片 | 亚洲精品国产精品乱码在线观看 | 青青草华人在线 | 成人激情社区 | 特黄aaaaaaaaa毛片免费视频 | 青青在线视频 | 国产精品久久久久蜜臀 | 久久久啊啊啊 | 日本中文字幕在线不卡 | 男女涩涩视频 | 亚洲成a人v欧美综合天堂麻豆 | 成人美女视频 | 最近免费中文字幕中文高清百度 | 精品人妻伦一二三区免费 | 天堂av亚洲av国产av电影 | 亚洲无限码 | 九九精品免费 | 精品黄色 | 黄色在线观看视频网站 | 国产福利免费 | 日韩第一页| 看一级黄色片 | 少妇2做爰交换朴银狐 | av爱爱| 成人深夜电影 | 亚洲无人区码一码二码三码的含义 | 91精品久久久久 | 欧美 亚洲 激情 一区 | 91国产视频在线观看 | 国产视频一区二区三区在线播放 | 超碰在线免费 | 日韩国产在线一区 | 日批在线观看视频 | 欧美激情videos | 成人精品福利 | 在线视频一区二区三区四区 | 黄色最新网址 | xxxxx国产| 成人午夜高清 | 大尺度做爰无遮挡露器官 | 动漫美女被到爽 | 美女久久精品 | 亚洲av永久无码精品三区在线 | 欧美香蕉视频 | 黄色a一级 | 调教丰满的已婚少妇在线观看 | 亚洲麻豆一区 | 欧美在线一级视频 | 大陆av在线播放 | 欧美乱欲视频 | av在线不卡观看 | 草久在线观看视频 | 在线观看亚洲大片短视频 | 精品视频在线观看 | 国产熟女高潮一区二区三区 | 国产伦子伦对白视频 | 嫩草午夜少妇在线影视 | 极品另类 | 亚洲毛片在线观看 | 色七七在线 | 人操人人 | av片免费看 | 521a人成v香蕉网站 | 欧美一区二区三区影院 | 国产第一草草影院 | 色呦呦免费视频 | 亚洲av成人无码久久精品 | 激情小视频 | 插入综合网 | 国产精品免费视频一区二区 | 懂色av蜜臀av粉嫩av分 |