首頁 web前端 js教程 基於jquery實現百度新聞導航選單滑動動畫_jquery

基於jquery實現百度新聞導航選單滑動動畫_jquery

May 16, 2016 pm 03:10 PM

本文實例為大家分享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);

  }

 

  //获得Li宽度

  function GetWidth(ele) {

   return $(ele).parent().width();

  }

 

  //获得div-hover左边距

  function GetLeft(element) {

   //获得li之前的同级li元素

   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;

    /*作为div-hover的父元素定位参照*/

    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;

    /*****Start(作用:导航文字浮于div-hover红色之上)*******/

    position: relative;

    z-index: 4;

    /*********************End*************************/

  }

</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标签class

        $('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) {

      /*动画定位div-hover位置到激活元素*/

    }

});

登入後複製

      然後,如何知道目前啟動為何元素呢,可以在點擊事件時,用隱藏域或其他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标签class

         $('a').removeClass();

         //设置当前点击菜单为激活状态

          $(this).addClass('active');

         $(".h-width").val(aWidth);

         $(".h-left").val(divHoverLeft);

       }

     });

 

     /*鼠标滑出UL或者div-nav背景div-hover自动定位到激活菜单处*/

     $("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或者div-nav背景div-hover自动定位到激活菜单处*/

      $("ul").on({

        'mouseout': function (event) {

          $(".div-hover").stop().animate({ width: $(".h-width").val(), left: $(".h-left").val() }, 150);

          /**阻止冒泡**/

          event.stopPropagation();

          //return false;

        }

      });

    });

 

    .......

</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

    {

      /*作为div-hover的父元素定位参照*/

      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;

      /*****Start(作用:导航文字浮于div-hover红色之上)*******/

      position: relative;

      z-index: 4;

      /*********************End*************************/

    }

    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({

         /*此处用mouseover或者mouseenter均可,如果以后要为X标签同时添加悬停和移出事件,建议用enter和leave也就是传说中的hover事件,因为里面事件冒泡已经处理过,就不会出现类似over和out之类的情况了*/

        'mouseenter': function () {

          SetDivHoverWidthAndLeft(this);

          //设置滑动动画

           $(".div-hover").stop().animate({ width: aWidth, left: divHoverLeft }, 150);

        },

        'click': function () {

          SetDivHoverWidthAndLeft(this);

          //清除所有a标签class

          $('a').removeClass();

          //设置当前点击菜单为激活状态

          $(this).addClass('active');

 

          $(".h-width").val(aWidth);

          $(".h-left").val(divHoverLeft);

        }

      });

 

      /*鼠标滑出UL或者div-nav背景div-hover自动定位到激活菜单处*/

      //mouseleave事件定位到ul或者div-nav均可

      $("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);

    }

 

    //获得Li宽度

    function GetWidth(ele) {

      return $(ele).parent().width();

    }

 

    //获得div-hover左边距

    function GetLeft(element) {

      //获得li之前的同级li元素

      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程序设计有所帮助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript:探索網絡語言的多功能性 JavaScript:探索網絡語言的多功能性 Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

如何使用Next.js(前端集成)構建多租戶SaaS應用程序 如何使用Next.js(前端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

使用Next.js(後端集成)構建多租戶SaaS應用程序 使用Next.js(後端集成)構建多租戶SaaS應用程序 Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

從C/C到JavaScript:所有工作方式 從C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

See all articles