最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js 彈簧效果代碼

 更新時(shí)間:2008年09月15日 10:53:21   作者:  
上次做圖片滑動(dòng)展示效果時(shí)做了減速效果,就想做一個(gè)加速效果。結(jié)合起來就想到了下面這個(gè)東西,當(dāng)然只是類似彈簧,而不是真正的彈簧。
雖然說的是彈簧效果,但實(shí)際上要實(shí)現(xiàn)的是定點(diǎn)坐標(biāo)之間的加速和減速移動(dòng)。
點(diǎn)到點(diǎn)的移動(dòng)應(yīng)該都知道怎么做,這里是通過設(shè)置滑動(dòng)對(duì)象的left來實(shí)現(xiàn)的。
而減速效果,一般的做法是通過用目標(biāo)值減當(dāng)前值除以一個(gè)系數(shù)(一般為正整數(shù)),得到一個(gè)步長。
然后當(dāng)前值加上這個(gè)步長作為新的當(dāng)前值,然后反復(fù)取值直到當(dāng)前值等于目標(biāo)值。
由于這樣得到的步長是越來越小的,而步長就是移動(dòng)的值,所以就做成減速效果。
那如何做加速效果呢?
由于取不到能對(duì)應(yīng)減速步長的加速的步長(或者有方法我想不到),所以我想了個(gè)方法,
一開始先把所有減速的步長算出來,放到一個(gè)數(shù)組中,作為減速時(shí)的步長,那加速的步長就是這個(gè)數(shù)組的反轉(zhuǎn)了(即倒過來)。
這個(gè)部分主要在SetStep()函數(shù)中,可參照代碼。
其他部分在代碼中都有說明。

程序代碼:
Code
復(fù)制代碼 代碼如下:

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


function addEventHandler(oTarget, sEventType, fnHandler) {
if (oTarget.addEventListener) {
oTarget.addEventListener(sEventType, fnHandler, false);
} else if (oTarget.attachEvent) {
oTarget.attachEvent("on" + sEventType, fnHandler);
} else {
oTarget["on" + sEventType] = fnHandler;
}
};

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 Bounce = Class.create();
Bounce.prototype = {
//容器對(duì)象,滑動(dòng)對(duì)象,原始位置,移動(dòng)范圍
initialize: function(container, obj, iOrigin, iRange, options) {

this._obj = $(obj);//滑動(dòng)對(duì)象
this._xo = parseInt(iOrigin);//中軸坐標(biāo)(即原來坐標(biāo))
this._xt = 0;//目標(biāo)坐標(biāo)
this._xs = [];//目標(biāo)坐標(biāo)集合
this._steps = [];//步長集合
this._fast = true;//是否加速

this.Range = iRange || 0;//滑動(dòng)范圍(寬度)

this.SetOptions(options);

this.Step = parseInt(this.options.Step);
this.Time = parseInt(this.options.Time);
this.Zoom = parseInt(this.options.Zoom);
this.Reduce = !!this.options.Reduce;
this.Min = parseInt(this.options.Min);
this.Max = parseInt(this.options.Max);
this.onMin = this.options.onMin;
this.onMax = this.options.onMax;
this.onSide = this.options.onSide;

//樣式設(shè)置
$(container).style.position = "relative";
this._obj.style.position = "absolute";
this._obj.style.left = this._xo + "px";

if(this.Range > 0) this.Start();
},
//設(shè)置默認(rèn)屬性
SetOptions: function(options) {
this.options = {//默認(rèn)值
Step: 10,//滑動(dòng)變化率
Time: 10,//滑動(dòng)延時(shí)
Zoom: 0,//縮放變化率
Reduce: true,//是否縮小
Min: 0,//最小范圍
Max: 0,//最大范圍
onMin: function(){},//到達(dá)最小時(shí)執(zhí)行
onMax: function(){},//到達(dá)最大時(shí)執(zhí)行
onSide: function(){}//到達(dá)邊界時(shí)執(zhí)行
};
Object.extend(this.options, options || {});
},
//從軸點(diǎn)開始
Start: function(iRange) {
clearTimeout(this._timer);
//iRange有值的話重新設(shè)置滑動(dòng)范圍
if(iRange) this.Range = iRange;
//是否到了最小點(diǎn)
if(this.Reduce && (this.Range <= 0 || this.Range <= this.Min)) { this.onMin(); return; }
//是否到了最大點(diǎn)
if(!this.Reduce && (this.Max > 0 && this.Range >= this.Max)) { this.onMax(); return; }
//重置位置
this._obj.style.left = this._xo + "px";
//設(shè)置目標(biāo)坐標(biāo)集合(iRange可能會(huì)變化所以每次都要設(shè)置)
this._xs = [this._xo + this.Range, this._xo, this._xo - this.Range, this._xo];
//設(shè)置為加速狀態(tài)
this._fast = false;
//開始分段移動(dòng)
this.Set();
},
//從分段開始
Set: function() {
//目標(biāo)坐標(biāo)都到達(dá)后返回
if(this._xs.length <= 0){
//縮放變化率有值的話重新設(shè)置范圍
if(this.Zoom > 0) { this.Range += (this.Reduce ? -1 : 1) * this.Zoom; }
this.Start(); return;
}
//取得目標(biāo)坐標(biāo)
this._xt = this._xs.shift();
//目標(biāo)坐標(biāo)是中軸點(diǎn)說明現(xiàn)在是在邊界上
if(this._xt == this._xo) this.onSide();
//設(shè)置步長
this.SetStep();
//開始移動(dòng)
this.Move();
},
//移動(dòng)
Move: function() {
clearTimeout(this._timer);
//步長走完即到達(dá)目標(biāo)坐標(biāo)就返回
if (this._steps.length <= 0) { this.Set(); return; }
//執(zhí)行移動(dòng)
this._obj.style.left = (parseInt(this._obj.style.left) + this._steps.shift()) + "px";
//循環(huán)移動(dòng)
var oThis = this; this._timer = setTimeout(function(){ oThis.Move(); }, this.Time);
},
//設(shè)置步長
SetStep: function() {
var iTemp = parseInt(this._obj.style.left);

//注意是從大到小排的
this._steps = [];

if(this.Step >= 1){
var i = 0;
do{
i = (this._xt - iTemp) / this.Step;
//步長不能包含0
if (i == 0) { break; } else if (Math.abs(i) < 1) { i = i > 0 ? 1 : -1; }
this._steps.push(i = parseInt(i));
iTemp += i;
} while (true);
//如果是加速的話反轉(zhuǎn)步長集合
if(this._fast) this._steps.reverse();
}
//加速減速是交替進(jìn)行的所以每次都要取反
this._fast = !this._fast;
}
};

測試html: 
復(fù)制代碼 代碼如下:

<style type="text/css">
.container{border:1px solid #000000;height:50px; width:500px;}
.bounce{width:10px; height:10px; background:#000000;top:20px;}
</style>
固定范圍反彈:
<div id="idContainer" class="container">
<div id="idBounce" class="bounce"> </div>
</div>
<br />
范圍漸變反彈:
<div id="idContainer1" class="container">
<div id="idBounce1" class="bounce"> </div>
</div>
<br />
自定范圍反彈:
<div id="idContainer2" class="container">
<div id="idBounce2" class="bounce"> </div>
</div>
<br />
范圍:
<input id="aa" name="" type="text" value="200" size="8" />
<input id="bb" name="" type="button" value=" 開始 " />
<input id="idFast" name="" type="button" value=" 加速 + " />
<input id="idSlow" name="" type="button" value=" 減速 - " />
<input id="idZoom" name="" type="button" value=" 漸 小 " />

測試代碼:
復(fù)制代碼 代碼如下:

new Bounce("idContainer", "idBounce", 250, 200);
var o = new Bounce("idContainer1", "idBounce1", 250, 200, {
Zoom: 20, Max: 200,
onMax: function(){ o.Reduce = true; o.Start(200); },
onMin: function(){ o.Reduce = false; o.Start(0); }
});

var o2 = new Bounce("idContainer2", "idBounce2", 250);
$("bb").onclick = function(){ o2.Start(parseInt($("aa").value) || 200); }
$("idFast").onclick = function(){ if(--o2.Step<2){o2.Step=2} }
$("idSlow").onclick = function(){ if(++o2.Step>20){o2.Step=20} }
$("idZoom").onclick = function(){ o2.Zoom=50; }


[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]

相關(guān)文章

  • javascript小數(shù)計(jì)算出現(xiàn)近似值的解決辦法

    javascript小數(shù)計(jì)算出現(xiàn)近似值的解決辦法

    在javascript里面,小數(shù)只能進(jìn)行相似計(jì)算,例如:5.06+1.30,你得到的結(jié)果會(huì)是6.359999999999999,但有的小數(shù)計(jì)算又是正確的,如果計(jì)算出現(xiàn)了近似值,你可以用如下的方法計(jì)算。
    2010-02-02
  • JS數(shù)組splice操作實(shí)例分析

    JS數(shù)組splice操作實(shí)例分析

    這篇文章主要介紹了JS數(shù)組splice操作,結(jié)合實(shí)例形式分析了javascript使用splice方法刪除數(shù)組元素相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • Json按某個(gè)鍵的值進(jìn)行排序

    Json按某個(gè)鍵的值進(jìn)行排序

    這篇文章主要介紹了json按某個(gè)鍵的值進(jìn)行排序的相關(guān)資料,代碼簡單易懂,非常不錯(cuò),需要的朋友可以參考下
    2016-12-12
  • JavaScript生成指定范圍的時(shí)間列表

    JavaScript生成指定范圍的時(shí)間列表

    這篇文章主要介紹了JavaScript生成指定范圍的時(shí)間列表思路詳解,需要的朋友可以參考下
    2018-03-03
  • JavaScript設(shè)計(jì)模式手寫示例講解

    JavaScript設(shè)計(jì)模式手寫示例講解

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式手寫示例,設(shè)計(jì)模式(Design pattern) 是解決軟件開發(fā)某些特定問題而提出的一些解決方案也可以理解成解決問題的一些思路。通過設(shè)計(jì)模式可以幫助我們?cè)鰪?qiáng)代碼的可重用性、可擴(kuò)充性、 可維護(hù)性、靈活性好
    2022-12-12
  • JavaScript實(shí)現(xiàn)彈出模態(tài)窗體并接受傳值的方法

    JavaScript實(shí)現(xiàn)彈出模態(tài)窗體并接受傳值的方法

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)彈出模態(tài)窗體并接受傳值的方法,涉及JavaScript模態(tài)窗體的實(shí)現(xiàn)及基于URL的傳值操作技巧,需要的朋友可以參考下
    2016-02-02
  • 微信小程序在web-view頁面增加一個(gè)按鈕具體代碼

    微信小程序在web-view頁面增加一個(gè)按鈕具體代碼

    web-view是一個(gè)可以用來承載網(wǎng)頁的容器,會(huì)自動(dòng)鋪滿整個(gè)小程序頁面,這篇文章主要給大家介紹了關(guān)于微信小程序在web-view頁面增加一個(gè)按鈕的具體代碼,需要的朋友可以參考下
    2023-10-10
  • 深入理解js promise chain

    深入理解js promise chain

    下面小編就為大家?guī)硪黄钊肜斫鈐s promise chain。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • 使用Xcache緩存器加速PHP網(wǎng)站的配置方法

    使用Xcache緩存器加速PHP網(wǎng)站的配置方法

    從訪問速度上來看,一般要比放于國內(nèi)的網(wǎng)站慢2-3倍,所以便想辦法對(duì)網(wǎng)站做了一些簡單的優(yōu)化,比如使用緩存系統(tǒng)來提升網(wǎng)站頁面訪問速度
    2017-04-04
  • Bootstrap CSS組件之按鈕下拉菜單

    Bootstrap CSS組件之按鈕下拉菜單

    這篇文章主要為大家詳細(xì)介紹了Bootstrap CSS組件之按鈕下拉菜單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評(píng)論

鄂伦春自治旗| 旬邑县| 西和县| 偃师市| 清远市| 许昌县| 阜新市| 双城市| 饶阳县| 尖扎县| 都江堰市| 余干县| 德州市| 行唐县| 尖扎县| 长顺县| 永安市| 福建省| 金塔县| 康平县| 平远县| 芷江| 杭州市| 大洼县| 利津县| 罗山县| 建始县| 林州市| 子长县| 阳城县| 长沙县| 手机| 农安县| 滦南县| 肃宁县| 安顺市| 隆子县| 屯门区| 卓资县| 临沧市| 确山县|