JavaScript實(shí)現(xiàn)彈性導(dǎo)航效果
本文實(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ò)展操作符用法,結(jié)合實(shí)例形式分析了ES6中數(shù)組、Math和擴(kuò)展操作符的新特性、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04簡(jiǎn)潔短小的 JavaScript IE 瀏覽器判定代碼
IE瀏覽器不管是什么版本,總是跟Web標(biāo)準(zhǔn)有些不太兼容。對(duì)于代碼工作者來說,自然是苦不堪言,為了考慮IE的兼容問題,不管是寫 CSS 還是 JS,往往都要對(duì) IE 特別對(duì)待,這就少不了做些判斷。本文不討論如何區(qū)分 IE 的樣式,僅是 JS 判定 IE 瀏覽器。2010-03-03JS實(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-05bootstrap多層模態(tài)框滾動(dòng)條消失的問題
本篇文章主要介紹了bootstrap多層模態(tài)框滾動(dòng)條消失的問題,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07js實(shí)現(xiàn)數(shù)組和對(duì)象的深淺拷貝
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)數(shù)組和對(duì)象的深淺拷貝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09