欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript實(shí)現(xiàn)彈性導(dǎo)航效果

 更新時(shí)間:2021年11月07日 16:04:21   作者:小白小白從不日白  
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)彈性導(dǎo)航效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了JavaScript實(shí)現(xiàn)彈性導(dǎo)航效果的具體代碼,供大家參考,具體內(nèi)容如下

主要利用offsetX

1.先搭架子:

* {
      margin: 0;
      padding: 0;
        }
        
        .nav {
            width: 900px;
            height: 63px;
            background: url(images/doubleOne.png) no-repeat right center;
            border: 1px solid #ccc;
            margin: 100px auto;
            position: relative;
        }
        
        ul {
            position: relative;
            z-index: 999;
        }
        
        ul>li {
            list-style: none;
            float: left;
            width: 88px;
            height: 63px;
            line-height: 63px;
            text-align: center;
        }
        
        span {
            display: inline-block;
            width: 88px;
            height: 63px;
            background: url("images/tMall.png") no-repeat;
            position: absolute;
            left: 0;
            top: 0;
}
<div class="nav">
        <ul>
            <li>雙11狂歡</li>
            <li>服裝會(huì)場(chǎng)</li>
            <li>數(shù)碼家電</li>
            <li>家居建材</li>
            <li>母嬰童裝</li>
            <li>手機(jī)會(huì)場(chǎng)</li>
            <li>美妝會(huì)場(chǎng)</li>
            <li>進(jìn)口會(huì)場(chǎng)</li>
            <li>飛豬旅行</li>
        </ul>
        <span></span>
</div>

2.編寫邏輯部分

//1.拿到需要操作的元素
const oItems = document.querySelectorAll("li");
 let oSpan = document.querySelector("span");
 
//2.監(jiān)聽每個(gè)菜單的點(diǎn)擊事件
for (let i = 0; i < oItems.length; i++) {
            let item = oItems[i];
            item.onclick = function() {
                //offsetLeft 得到被點(diǎn)擊的元素距離第一個(gè)定位祖先元素的偏移位
                // console.log(this.offsetLeft);
                // oSpan.style.left = this.offsetLeft + 'px';
                //調(diào)用函數(shù)
                easeAnimation(oSpan, {
                    "left": this.offsetLeft
                });
            };
        }

animation.js

(function() {
    /**
     * 勻速動(dòng)畫
     * @param {*} ele 執(zhí)行動(dòng)畫元素
     * @param {*} obj 該元素的哪些屬性需要執(zhí)行動(dòng)畫
     * @param {*} fn  動(dòng)畫執(zhí)行完成后可能還需要執(zhí)行的操作
     * 
     * 調(diào)用方式參考
     * linearAnimation(oDiv, {
                "marginTop": 500,
                "marginLeft": 300
        });
     */
    function linearAnimation(ele, obj, fn) {
        clearInterval(ele.timerId);
        ele.timerId = setInterval(function() {
            // flag變量用于標(biāo)記是否所有的屬性都執(zhí)行完了動(dòng)畫
            let flag = true;
 
            for (let key in obj) {
                let target = obj[key];
 
                // 1.拿到元素當(dāng)前的位置
                // let begin = parseInt(ele.style.width) || 0;
                let style = getComputedStyle(ele);
                // let begin = parseInt(style.width) || 0;
                let begin = parseFloat(style[key]) || 0;
 
                // 2.定義變量記錄步長(zhǎng)
                let step = (begin - target) > 0 ? -13 : 13;
 
                // 3.計(jì)算新的位置
                begin += step;
                // console.log(Math.abs(target - begin), Math.abs(step));
                if (Math.abs(target - begin) > Math.abs(step)) { //未執(zhí)行完動(dòng)畫
                    flag = false;
                } else { //執(zhí)行完動(dòng)畫
                    begin = target;
                }
 
                // 4.重新設(shè)置元素的位置
                // ele.style.width = begin + "px";
                ele.style[key] = begin + "px";
            }
 
            //判斷動(dòng)畫是否執(zhí)行完
            if (flag) {
                //動(dòng)畫執(zhí)行完后關(guān)閉定時(shí)器
                clearInterval(ele.timerId);
 
                //判斷是否傳入fn函數(shù),有才執(zhí)行反之不執(zhí)行
                // if(fn){
                //     fn();
                // }
                fn && fn();
            }
        }, 100);
    }
 
    //緩動(dòng)動(dòng)畫
    function easeAnimation(ele, obj, fn) {
        clearInterval(ele.timerId);
        ele.timerId = setInterval(function() {
            // flag變量用于標(biāo)記是否所有的屬性都執(zhí)行完了動(dòng)畫
            let flag = true;
 
            for (let key in obj) {
                let target = obj[key];
 
                // 1.拿到元素當(dāng)前的位置
                let style = getComputedStyle(ele);
                let begin = parseInt(style[key]) || 0;
 
                // 2.定義變量記錄步長(zhǎng)
                // 公式: (結(jié)束位置 - 開始位置) * 緩動(dòng)系數(shù)(0 ~1)
                let step = (target - begin) * 0.3;
 
                // 3.計(jì)算新的位置
                begin += step;
                if (Math.abs(Math.floor(step)) > 1) {
                    flag = false;
                } else {
                    begin = target;
                }
                // 4.重新設(shè)置元素的位置
                ele.style[key] = begin + "px";
            }
 
            //判斷動(dòng)畫是否執(zhí)行完
            if (flag) {
                //動(dòng)畫執(zhí)行完后關(guān)閉定時(shí)器
                clearInterval(ele.timerId);
 
                //判斷是否傳入fn函數(shù),有才執(zhí)行反之不執(zhí)行
                fn && fn();
            }
        }, 100);
    }
 
    // 將函數(shù)綁定到window對(duì)象上, 這樣全局就可以使用了
    window.linearAnimation = linearAnimation;
    window.easeAnimation = easeAnimation;
})();

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ES6新特性之?dāng)?shù)組、Math和擴(kuò)展操作符用法示例

    ES6新特性之?dāng)?shù)組、Math和擴(kuò)展操作符用法示例

    這篇文章主要介紹了ES6新特性之?dāng)?shù)組、Math和擴(kuò)展操作符用法,結(jié)合實(shí)例形式分析了ES6中數(shù)組、Math和擴(kuò)展操作符的新特性、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • 簡(jiǎn)潔短小的 JavaScript IE 瀏覽器判定代碼

    簡(jiǎn)潔短小的 JavaScript IE 瀏覽器判定代碼

    IE瀏覽器不管是什么版本,總是跟Web標(biāo)準(zhǔn)有些不太兼容。對(duì)于代碼工作者來說,自然是苦不堪言,為了考慮IE的兼容問題,不管是寫 CSS 還是 JS,往往都要對(duì) IE 特別對(duì)待,這就少不了做些判斷。本文不討論如何區(qū)分 IE 的樣式,僅是 JS 判定 IE 瀏覽器。
    2010-03-03
  • 屏蔽script注入小例子

    屏蔽script注入小例子

    有關(guān)script注入想必大家也有所了解,在本文將為大家介紹下如何屏蔽script注入,下面有個(gè)不錯(cuò)的示例大家可以感受下
    2013-11-11
  • JS中跳出循環(huán)的示例代碼

    JS中跳出循環(huán)的示例代碼

    for循環(huán)中我們使用continue;終止本次循環(huán)計(jì)入下一個(gè)循環(huán),使用break終止整個(gè)循環(huán)。下面小編通過本文給大家分享JS中跳出循環(huán)的示例代碼,需要的朋友參考下吧
    2017-09-09
  • 微信小程序?qū)崿F(xiàn)上傳視頻功能

    微信小程序?qū)崿F(xiàn)上傳視頻功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)上傳視頻功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 淺談js閉包理解

    淺談js閉包理解

    這篇文章主要介紹了對(duì)js閉包理解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 推薦發(fā)幾個(gè)常用控件(新加DHTML控件)

    推薦發(fā)幾個(gè)常用控件(新加DHTML控件)

    推薦發(fā)幾個(gè)常用控件(新加DHTML控件)...
    2007-08-08
  • JS實(shí)現(xiàn)table表格數(shù)據(jù)排序功能(可支持動(dòng)態(tài)數(shù)據(jù)+分頁效果)

    JS實(shí)現(xiàn)table表格數(shù)據(jù)排序功能(可支持動(dòng)態(tài)數(shù)據(jù)+分頁效果)

    這篇文章主要介紹了JS實(shí)現(xiàn)table表格數(shù)據(jù)排序功能(可支持動(dòng)態(tài)數(shù)據(jù)+分頁效果) 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友一起看看吧
    2016-05-05
  • bootstrap多層模態(tài)框滾動(dòng)條消失的問題

    bootstrap多層模態(tài)框滾動(dòng)條消失的問題

    本篇文章主要介紹了bootstrap多層模態(tài)框滾動(dòng)條消失的問題,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • js實(shí)現(xiàn)數(shù)組和對(duì)象的深淺拷貝

    js實(shí)現(xiàn)數(shù)組和對(duì)象的深淺拷貝

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)數(shù)組和對(duì)象的深淺拷貝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評(píng)論