javascript底部具有跟隨效果的橫向導航選單
本章節分享一段程式碼例項,它實現了底部具有跟隨效果的導航選單功能。
下面就給出程式碼,並且詳細介紹一下它的實現過程。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style type="text/css"> *{ margin:0; padding:0; } body { font:12px "\5B8B\4F53",san-serif; color:#808080; padding-top:6px; } a { text-decoration:none; color:#808080 } a:hover { text-decoration:underline; color:#ba2636 } ul, li { list-style:none; } #nav{ padding:41px 0 0 0; height:27px; width:542px; overflow:hidden; float:right; margin-right:17px; position:relative; } #nav ul{ height:27px; width:100%; } #nav ul li{ width:67px; height:24px; float:left; padding-right:28px; display:inline; cursor:pointer; overflow:hidden } #nav a{ background:#999; width:100%; height:24px; display:block; float:left; outline:none; color:#fff; line-height:24px; text-align:center; font-size:16px; font-weight:bold; overflow:hidden } #navCur{ position:absolute; left:0; bottom:0; height:3px; color:#F00; width:67px; margin:0; padding:0; display:block; float:none; background:#FF0000; cursor:pointer; overflow:hidden } </style> <script type="text/javascript"> var done=function(){ var curPostion,thisLeft, curPostion_1; var obj = getId('nav').getElementsByTagName('ul')[0], timer = null , navCur = getId('navCur'), liArr = getId('nav').getElementsByTagName('li'), liLength = liArr.length-1; for (var x=0;x<liArr.length; x++ ){ liArr[liLength].style.paddingRight = "0"; var li = liArr[x],curPostion = navCur.offsetLeft; if(li.className == "cur"){ navCur.style.left = li.offsetLeft + "px"; } li.onmouseover=function(){ clearTimeout(timer); thisLeft = this.offsetLeft; if (thisLeft > navCur.offsetLeft) { hover(); } else { curPostion_1 = this.offsetLeft; out(); } }; li.onmouseout=function(){ clearTimeout(timer); if (curPostion < navCur.offsetLeft) { curPostion_1 = curPostion; out(); } else { thisLeft = curPostion; hover(); } }; } function hover(){ if (navCur.offsetLeft <= thisLeft) { var a = Math.max(parseInt((thisLeft - navCur.offsetLeft) / 15), 3); navCur.style.left = navCur.offsetLeft + a + "px"; timer = setTimeout(arguments.callee, 5); } else{ navCur.style.left = thisLeft + "px"; clearTimeout(timer); } } function out(){ if (navCur.offsetLeft >= curPostion_1) { var a = Math.max(parseInt((navCur.offsetLeft - curPostion_1) / 15), 3); navCur.style.left = navCur.offsetLeft - a + "px"; timer = setTimeout(arguments.callee, 5); } else { navCur.style.left = curPostion_1 + "px"; clearTimeout(timer); } } function getId(id){ return document.getElementById(id) } } window.onload=function(){ done(); } </script> </head> <body> <div id="nav"> <ul class="cf"> <li><a href="" hidefocus="true">1</a></li> <li><a href="1" hidefocus="true">2</a></li> <li class="cur"><a href="2" hidefocus="true">3</a></li> <li><a href="3" hidefocus="true">4</a></li> <li><a href="4" hidefocus="true">5</a></li> <li><a href="5" hidefocus="true">6</a></li> </ul> <span id="navCur"></span> </div> </body> </html>
上面的程式碼實現了我們的要求,下面介紹一下它的實現過程。
一.程式碼註釋:
(1).var done=function(){},此函式實現了跟隨效果。
(2).var curPostion,thisLeft, curPostion_1,生命了三個變數,是用來儲存元素的offsetLeft屬性值,後面會用到。
(3).var obj = getId('nav').getElementsByTagName('ul')[0],getId()模擬實現了類似於jQuery的id選擇器功能。這段程式碼是獲取ul元素集合中的第一個ul元素,當然在此例中只有一個ul元素。
(4).timer = null,宣告一個變數並賦值為null,用作定時器函式的標識。
(5).navCur = getId('navCur'),獲取id屬性值為navCur的元素物件。
(6).liArr = getId('nav').getElementsByTagName('li'),獲取指定ul元素下的li元素集合。
(7).liLength = liArr.length-1,獲取li元素集合最大索引值,因為索引是從0開始計算的。
(8).for (var x=0;x<liArr.length; x++ ){},遍歷集合中的每一個元素。
(9).liArr[liLength].style.paddingRight = "0",設定最後一個li元素的右內邊距是0,否則的話最後一個li會掉到第二行。
(10).var li = liArr[x],curPostion = navCur.offsetLeft,第一個賦值語句是將當前li元素物件賦值給變數li,第二個是將navCur物件(底部跟隨元素)的offsetLeft屬性值賦值給變數curPostion。
(11).if(li.className == "cur"){
navCur.style.left = li.offsetLeft + "px";
},如果當前li元素的class屬性值是cur,那麼就將跟隨條的left屬性值設定為當前li元素的offsetLeft值,也就是將跟隨條設定在此li元素的下面。
(12).li.onmouseover=function(){},為當前li元素註冊onmouseover事件處理函式。
(13).clearTimeout(timer),停止當前定時器函式的執行,這一點很重要,如果連續兩次快速移動到同一個導航欄目上,如果不停止前一個定時器函式的執行,難麼就會造成兩個定時器函式重合執行的情況。
(14).thisLeft = this.offsetLeft,將當前的元素的offsetLeft值賦值給變數thisLeft。
(15).if (thisLeft > navCur.offsetLeft) {
hover();
},如果當前的元素的offsetLeft大於跟隨元素的offsetLeft值,也就是跟隨條在當前li元素的左邊,那麼就呼叫hover()。
(16).else {
curPostion_1 = this.offsetLeft;
out();
},如果不大於的話,就將當前元素的offsetLeft賦值給變數curPostion_1,然後呼叫out()函式。
(17).function hover(){},此函式實現了跟隨條從左側彈性跟隨到當前li元素底部。
(18).if (navCur.offsetLeft <= thisLeft) {
var a = Math.max(parseInt((thisLeft - navCur.offsetLeft) / 15), 3);
navCur.style.left = navCur.offsetLeft + a + "px";
timer = setTimeout(arguments.callee, 5);
},如果當前跟隨元素的offsetLeft屬性值小於當前li元素的offsetLeft屬性值。
那麼就通過var a = Math.max(parseInt((thisLeft - navCur.offsetLeft) / 15), 3)獲取跟隨條每次移動的幅度,因為跟隨條的navCur.offsetLeft值會越來越大,那麼差就越來越小,就出現了彈性運動效果。
timer = setTimeout(arguments.callee, 5),通過遞迴的方式不斷執行hover()方法。
(19).else{
navCur.style.left = thisLeft + "px";
clearTimeout(timer);
},否則,將跟隨元素的left屬性值設定為li元素的thisLeft值,這樣就完成跟隨效果。
最後停止定時器函式的執行。
二.相關閱讀:
(1).getElementsByTagName()可以參閱document.getElementsByTagName()一章節。
(2).offsetLeft屬性可以參閱js offsetLeft一章節。
(3).className屬性可以參閱js className一章節。
(4).onmouseover事件可以參閱javascript mouseover事件一章節。
(5).onmouseout事件可以參閱javascript mouseout事件一章節。
(6).setTimeout()可以參閱setTimeout()一章節。
相關文章
- JavaScript橫向二級導航選單效果JavaScript
- 一側具有滑鼠跟隨效果的垂直導航選單
- jQuery底部跟隨水平導航選單jQuery
- 滑鼠懸浮具有背景動畫跟隨效果的導航選單動畫
- CSS3橫向導航選單效果CSSS3
- css實現立體效果橫向導航選單CSS
- 具有響應式效果的導航選單
- 滑鼠懸浮底部有橫條伸展的導航選單
- 具有彈性效果的右鍵導航選單
- 滑鼠懸浮導航選單底部出現動畫橫線動畫
- jQuery背景滑動跟隨的導航選單jQuery
- 透明層滑動跟隨導航選單
- CSS製作橫向導航選單例項程式碼CSS單例
- 滑鼠懸浮中英文切換橫向導航選單
- HTML橫向導航欄HTML
- SVG導航下劃線游標跟隨效果SVG
- js橫向滑動摺疊導航選單程式碼例項JS
- 實現左側導航和橫向導航
- CSS多級導航選單效果CSS
- JavaScript 三級導航選單JavaScript
- JavaScript二級導航選單JavaScript
- 不可思議的純 CSS 導航欄下劃線跟隨效果CSS
- 不可思議的純CSS導航欄下劃線跟隨效果CSS
- PbootCMS導航選單-導航選單的使用教程boot
- JavaScript slide下拉導航選單效果JavaScriptIDE
- 純css實現固定在網頁底部選單導航CSS網頁
- 具有淡入淡出效果的下拉導航選單例項程式碼單例
- js頂部可以伸縮的導航選單效果JS
- js實現的響應式導航選單效果JS
- vue2.0實現底部導航切換效果Vue
- jQuery 緩衝效果二級導航下拉選單jQuery
- css3水平滑動導航選單效果CSSS3
- JavaScript 跟隨滑鼠指標的粒子效果JavaScript指標
- JavaScript下拉摺疊導航選單講解JavaScript
- JavaScript可摺疊屬性導航選單JavaScript
- 採用JavaScript+XML實現具有樹形選單功能的論壇側邊導航欄JavaScriptXML
- css具有傾斜效果的橫條CSS
- css橫向導航欄製作流程詳解CSS