本文實例為大家分享jquery實現百度新聞導航選單滑動動畫,供大家參考,具體內容如下
思路與步驟
1.利用UL創建簡單橫向導航;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns= "http://www.w3.org/1999/xhtml" >
<head>
<title>仿百度新闻菜单滑动动画</title>
<style type= "text/css" >
body, div, ul, li, a
{
margin: 0px;
padding: 0px;
font-size: 20px;
color: #FFF;
border: 0;
}
.div-nav-container
{
margin-top: 50px;
width: 100%;
background-color: #01204F;
}
.div-nav
{
width: 870px;
margin: 0px auto;
}
ul
{
list-style: outside none none;
width: 100%;
height: 50px;
}
ul li
{
float: left;
}
ul li a
{
line-height: 50px;
display: block;
padding: 0px 15px;
text-align: center;
text-decoration: none;
}
</style>
</head>
<body>
<div class = "div-nav-container" >
<div class = "div-nav" >
<ul>
<li><a href= "javascript:void(0)" >网站首页</a></li>
<li><a href= "javascript:void(0)" >热点</a> </li>
<li><a href= "javascript:void(0)" >国际新闻</a> </li>
<li><a href= "javascript:void(0)" >国内新闻</a> </li>
<li><a href= "javascript:void(0)" >国家政策</a> </li>
<li><a href= "javascript:void(0)" >体育新闻</a> </li>
<li><a href= "javascript:void(0)" >娱乐新闻</a> </li>
<li><a href= "javascript:void(0)" >名人</a> </li>
<li><a href= "javascript:void(0)" >古迹</a> </li>
</ul>
</div>
</div>
</body>
</html>
|
登入後複製
2.新增一個脫離層的div,命名div-hover,用於選單滑動動畫,設定CSS樣式;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <style type= "text/css" >
.div-hover
{
background-color: Red;height: 50px;
left: 0px;
top: 0px;
width: 0px;
}
</style>
<div class = "div-nav" >
<!--添加滑动背景-->
<div class = "div-hover" >
</div>
<ul>
...
</ul>
</div>
|
登入後複製
3.新增選單項目的滑動事件,計算div-hover的滑動要素,左,上邊距以及寬度;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <script type= "text/javascript" >
var divHoverLeft = 0;
var aWidth = 0;
$(document).ready( function () {
$( "a" ).on({
'mouseover' : function () {
SetDivHoverWidthAndLeft(this);
$( ".div-hover" ).stop().animate({ width: aWidth, left: divHoverLeft }, 150);
}
});
});
function SetDivHoverWidthAndLeft(element) {
divHoverLeft = GetLeft(element);
aWidth = GetWidth(element);
}
function GetWidth(ele) {
return $(ele).parent().width();
}
function GetLeft(element) {
var menuList = $(element).parent().prevAll();
var left = 0;
$.each(menuList, function (index, ele) {
left += $(ele).width();
});
return left;
}
</script>
|
登入後複製
效果預覽

從預覽效果可以看出,div-hover的定位是有問題的,div-hover應該以父級元素絕對定位,所以修改程式碼(註解部分為修改點)如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <style type= "text/css" >
.div-nav
{
width: 870px;
margin: 0px auto;
position: relative;
}
.div-hover
{
background-color: Red;
height: 50px;
left: 0px;
top: 0px;
width: 0px;
position: absolute;
}
</style>
|
登入後複製

雖然解決了定位問題,但背景圖片還是浮於文字上方,所以調整程式碼,將文字浮動於紅色div之上:
1 2 3 4 5 6 7 8 9 10 | <style type= "text/css" >
ul li
{
float: left;
position: relative;
z-index: 4;
}
</style>
|
登入後複製
效果預覽

4.新增選單點擊,以及載入頁面預設選單選取;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <style type= "text/css" >
.active
{
background-color: Red;
}
</style>
<script type= "text/javascript" >
var divHoverLeft = 0;
var aWidth = 0;
$(document).ready( function () {
$( "a" ).on({
'mouseover' : function () {
SetDivHoverWidthAndLeft(this);
$( ".div-hover" ).stop().animate({ width: aWidth, left: divHoverLeft }, 150);
},
'click' : function () {
SetDivHoverWidthAndLeft(this);
$( 'a' ).removeClass();
$(this).addClass( 'active' );
}
});
});
</script>
</head>
<body>
<div class = "div-nav-container" >
<div class = "div-nav" >
<!--添加滑动背景-->
<div class = "div-hover" >
</div>
<ul>
<--默认菜单激活-->
<li><a class = "active" href= "javascript:void(0)" >网站首页</a></li>
…………
</ul>
</div>
</div>
</body>
</html>
|
登入後複製
效果預覽

5.新增滑鼠移出範圍,自動定位目前啟動元素功能;
在做此功能之前,先理下思路,滑鼠移出操作,我們可以想到mouseout,mouseleave事件,那麼隨之就會有以下幾個疑問:
①這地方選用哪個事件可以滿足這個條件呢?
②那所選擇的事件又定位在哪一個元素呢?
③移出滑鼠之後又如何知道目前啟動的是哪個元素呢?
④如何知道div-hover的左邊距和width等值呢?
實踐出真知,那就實踐:
首先,以mouseout為例,第一個問題自然就解決了;
其次,事件定位在哪一個元素?透過上面GIF圖,分析,如果定位在A標籤或Li標籤,那麼滑鼠移出操作在A標籤或Li標籤之間切換也會觸發自動定位到啟動元素(假設自動定位已做),就會出現如下圖所示情況:

所以不能定位在A或Li標籤上,再想一下,滑鼠應該是移出整個導航的範圍才可以,那麼定位在哪個元素就很容易出來了,應該定位在UL或者UL的父級元素,他們兩個的大小範圍都是一致的,所以兩個元素都可以,若兩個元素大小不一致,就應該定位在UL上面了。於是就有了類似如下程式碼:
1 2 3 4 5 | $( "ul" ).on({
'mouseout' : function (event) {
}
});
|
登入後複製
然後,如何知道目前啟動為何元素呢,可以在點擊事件時,用隱藏域或其他display方式儲存目前點擊的元素寬度和左邊距,待滑鼠移出操作,重新讀取儲存的數據,進而進行animate定位;從而解決以上③④問題;部分代碼如下:
(當然,想知道菜單激活元素,也可以用class為active的方式來查找,不過這種方式,相對來說麻煩一些,首先獲得active的元素,然後通過遍歷li,重新計算一遍寬度和左邊距,最後進行賦值和添加滑動定位;此處暫用隱藏域方式處理,原因是方便簡單,群友如有興趣可以用active方式試驗)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <script type= "text/javascript" >
var divHoverLeft = 0;
var aWidth = 0;
$(document).ready( function () {
$( "a" ).on({
'mouseover' : function () {
SetDivHoverWidthAndLeft(this);
$( ".div-hover" ).stop().animate({ width: aWidth, left: divHoverLeft }, 150);
}
'click' : function () {
SetDivHoverWidthAndLeft(this);
$( 'a' ).removeClass();
$(this).addClass( 'active' );
$( ".h-width" ).val(aWidth);
$( ".h-left" ).val(divHoverLeft);
}
});
$( "ul" ).on({
'mouseout' : function (event) {
$( ".div-hover" ).stop().animate({ width: $( ".h-width" ).val(), left: $( ".h-left" ).val() }, 150);
}
});
});
function SetDivHoverWidthAndLeft(element) {
divHoverLeft = GetLeft(element);
aWidth = GetWidth(element);
}
............
</script>
</head>
<body>
<div class = "div-nav-container" >
<div class = "div-nav" >
<!--添加滑动背景-->
<div class = "div-hover" >
</div>
<ul>
<li><a class = "active" href= "javascript:void(0)" >网站首页</a></li>
...........
</ul>
</div>
</div>
<input type= "hidden" class = "h-width" value= "110" />
<input type= "hidden" class = "h-left" value= "0" />
</body>
</html>
|
登入後複製
效果展示:

看图发现依旧出现之前类似定位在A或Li的问题,出现这种情况的原因:
jquery中mouseout如果定位在一个元素上,例如div,那么此div之下的元素都会具有mouseout事件,也就是常说的,事件冒泡机制;与此类似的事件如mousedown,mouseover等,那么是不是阻止事件冒泡就行了呢? 理论上是这样的。通常阻止冒泡有两种方式: event.stopPropagation();和return false;当然他们之间也是有区别的。
相关代码修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <script type= "text/javascript" >
..........
$(document).ready( function () {
$( "ul" ).on({
'mouseout' : function (event) {
$( ".div-hover" ).stop().animate({ width: $( ".h-width" ).val(), left: $( ".h-left" ).val() }, 150);
event.stopPropagation();
}
});
});
.......
</script>
|
登入後複製
无论何种阻止方式,都没有卵用,依旧阻止不了冒泡,效果可想而知,与上面Gif图所示无异;
由此证明,mouseover在实现此功能方面是有问题的;
那换mouseleave呢,除了将mouseover修改为mouseleave和去除冒泡代码外,其他代码不做改动,实验效果如下:

从上图可以看出,效果与百度新闻导航滑动基本无异,至此大功告成;
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns= "http://www.w3.org/1999/xhtml" >
<head>
<title>仿百度新闻菜单滑动动画</title>
<style type= "text/css" >
body, div, ul, li, a
{
margin: 0px;
padding: 0px;
font-size: 20px;
color: #FFF;
border: 0;
}
.div-nav-container
{
margin-top: 50px;
width: 100%;
background-color: #01204F;
}
.div-nav
{
position: relative;
width: 870px;
margin: 0px auto;
}
.div-hover
{
background-color: Red;
position: absolute;
height: 50px;
left: 0px;
top: 0px;
width: 0px;
}
ul
{
list-style: outside none none;
width: 100%;
height: 50px;
}
ul li
{
float: left;
position: relative;
z-index: 4;
}
ul li a
{
line-height: 50px;
display: block;
padding: 0px 15px;
text-align: center;
text-decoration: none;
}
.active
{
background-color: Red;
}
</style>
<script src= "../js/jquery-1.11.3.min.js" type= "text/javascript" ></script>
<script type= "text/javascript" >
var divHoverLeft = 0;
var aWidth = 0;
$(document).ready( function () {
$( "a" ).on({
'mouseenter' : function () {
SetDivHoverWidthAndLeft(this);
$( ".div-hover" ).stop().animate({ width: aWidth, left: divHoverLeft }, 150);
},
'click' : function () {
SetDivHoverWidthAndLeft(this);
$( 'a' ).removeClass();
$(this).addClass( 'active' );
$( ".h-width" ).val(aWidth);
$( ".h-left" ).val(divHoverLeft);
}
});
$( "ul" ).on({
'mouseleave' : function (event) {
$( ".div-hover" ).stop().animate({ width: $( ".h-width" ).val(), left: $( ".h-left" ).val() }, 150);
}
});
});
function SetDivHoverWidthAndLeft(element) {
divHoverLeft = GetLeft(element);
aWidth = GetWidth(element);
}
function GetWidth(ele) {
return $(ele).parent().width();
}
function GetLeft(element) {
var menuList = $(element).parent().prevAll();
var left = 0;
$.each(menuList, function (index, ele) {
left += $(ele).width();
});
return left;
}
</script>
</head>
<body>
<div class = "div-nav-container" >
<div class = "div-nav" >
<!--添加滑动背景-->
<div class = "div-hover" >
</div>
<ul>
<li><a class = "active" href= "javascript:void(0)" >网站首页</a></li>
<li><a href= "javascript:void(0)" >热点</a> </li>
<li><a href= "javascript:void(0)" >国际新闻</a> </li>
<li><a href= "javascript:void(0)" >国内新闻</a> </li>
<li><a href= "javascript:void(0)" >国家政策</a> </li>
<li><a href= "javascript:void(0)" >体育新闻</a> </li>
<li><a href= "javascript:void(0)" >娱乐新闻</a> </li>
<li><a href= "javascript:void(0)" >名人</a> </li>
<li><a href= "javascript:void(0)" >古迹</a> </li>
</ul>
</div>
</div>
<input type= "hidden" class = "h-width" value= "110" />
<input type= "hidden" class = "h-left" value= "0" />
</body>
</html>
|
登入後複製
总结和关键点
1.背景滑动由某个块状元素(此处用的div)来实现,而非本元素的hover改变背景颜色;
2.注意元素定位(滑动块状元素以谁来绝对定位或者相对定位,左边距的计算和自身宽度的计算;滑动块状元素div-hover和li之间的相对定位,以及层级大小);
3.滑动动画事件animate和记录激活菜单,鼠标移出区域自定定位到激活菜单;
4.jquery中mouseover,mouseout以及mouseenter,mouseleave关于冒泡机制的区别;(前两个未做冒泡机制的限制,后两个冒泡已经经过处理,事件只针对注册元素本身,而不会对子元素起作用,mouseenter和mouseleave用在一个元素标签上可以用hover事件代替,本身hover就是这两者的封装,如果事件在不同元素标签上,最好分开调用mouseenter和mouseleave事件)
5.所有关键点以及作用都已经在代码各处加上注释,各位可以看看。
希望本文对大家学习jquery程序设计有所帮助。