博客列表 >前端实现导航下拉菜单功能

前端实现导航下拉菜单功能

emagic
emagic原创
2020年06月14日 23:58:091462浏览

0612作业

编写一个专业实用的导航下拉菜单,用前端实现功能

链接 + 无序列表 + 事件监听 + 事件委托
下拉

下拉2

html代码:主要练习无序列表和链接功能

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <link rel="stylesheet" href="style.css" />
  7. <title>下拉菜单</title>
  8. </head>
  9. <body>
  10. <ul id="nav">
  11. <li><a href="">首页</a></li>
  12. <li><a href="">秒杀</a></li>
  13. <li>
  14. <a href="">优惠券</a>
  15. <ul>
  16. <li><a href="">满100减10</a></li>
  17. <li><a href="">满500减200</a></li>
  18. <li><a href="">满1000减450</a></li>
  19. <li><a href="">满2000减600</a></li>
  20. </ul>
  21. </li>
  22. <li>
  23. <a href="">生鲜超市</a>
  24. <ul>
  25. <li><a href="">绿色蔬菜</a></li>
  26. <li><a href="">饮料乳品</a></li>
  27. <li><a href="">家禽肉类</a></li>
  28. <li><a href="">生猛海鲜</a></li>
  29. <li><a href="">水果干货</a></li>
  30. </ul>
  31. </li>
  32. <li>
  33. <a href="">海外购</a>
  34. <ul>
  35. <li><a href="">德国</a></li>
  36. <li><a href="">英国</a></li>
  37. <li><a href="">日本</a></li>
  38. <li><a href="">荷兰</a></li>
  39. <li><a href="">美国</a></li>
  40. </ul>
  41. </li>
  42. <li>
  43. <a href="">订单查询</a>
  44. </li>
  45. <li>
  46. <a href="">地址管理</a>
  47. </li>
  48. <li>
  49. <a href="">送货服务</a>
  50. </li>
  51. <li>
  52. <a href="">用户登录</a>
  53. </li>
  54. </ul>
  55. <script>
  56. const nav = document.querySelectorAll("#nav>li");
  57. nav.forEach(function (nav) {
  58. // 鼠标移入时 :显示下拉菜单
  59. nav.addEventListener("mouseover", showSubMenu);
  60. // 鼠标移出时:隐藏下拉菜单
  61. nav.addEventListener("mouseout", closeSubMenu);
  62. });
  63. // 显示下拉菜单
  64. function showSubMenu(ev) {
  65. // 当前这个菜单有无子菜单
  66. console.log(ev.target);
  67. if (ev.target.nextElementSibling != null) {
  68. ev.target.nextElementSibling.style.display = "block";
  69. }
  70. }
  71. // 隐藏下拉菜单
  72. function closeSubMenu(ev) {
  73. if (
  74. ev.target.nodeName === "A" &&
  75. ev.target.nextElementSibling != null
  76. ) {
  77. ev.target.nextElementSibling.style.display = "none";
  78. }
  79. }
  80. </script>
  81. </body>
  82. </html>

js代码主要代码逻辑和功能:

1.定位通过选择器命中ul中的li元素

  1. document.querySelectorAll("#nav>li")

2.事件监听nav.addEventListener监听鼠标的移入和移出动作事件

  1. nav.addEventListener("mouseover", showSubMenu);
  2. nav.addEventListener("mouseout", closeSubMenu);

addEventListener(事件类型,事件方法,false/true)

事件触发阶段类型 特征 参数设置
冒泡 由内向外传递 addEventListener(事件类型,事件方法,false),最后一个参数可省略,默认就是冒泡方法
捕获 由外向内传递 addEventListener(事件类型,事件方法,true)

3.事件委托代码逻辑

用父类代理所有子元素及后代元素上的同名事件
代码中寻找a标签同级别的ul列表,移入时判断当前这个菜单有无子菜单
ev.target.nextElementSibling != null
如果发现就显示菜单
ev.target.nextElementSibling.style.display = "block";

移出时关闭显示,把display = "none"设置回去
if ( ev.target.nodeName === "A" && ev.target.nextElementSibling != null)
判断语句要同时判断是否为<a>标签的同级兄弟元素以及是否有子菜单,只有同为真时才说明该下拉菜单是需要操作的,避免因冒泡造成的其他元素隐藏掉!!

其他要学习掌握的知识

ev.target 返回的是当前在这触发事件的元素,
ev.currentTarget 返回的是绑定实践的是哪个元素。

  1. <style>
  2. /* 元素样式初始化: 学到盒模型再详细介绍 */
  3. * {
  4. margin: 0;
  5. padding: 0;
  6. box-sizing: border-box;
  7. }
  8. a {
  9. /* color: rgba(255, 255, 255, 0.7); */
  10. color: #bbb;
  11. text-decoration: none;
  12. }
  13. #nav {
  14. display: flex;
  15. justify-content: space-around;
  16. background-color: royalblue;
  17. width: 100vw;
  18. height: 50px;
  19. line-height: 50px;
  20. }
  21. li {
  22. list-style: none;
  23. margin: 0 10px;
  24. float: left;
  25. }
  26. #nav > li > a:hover {
  27. color: white;
  28. }
  29. /* 将父级设置为子菜单的定位容器,即转为定位元素即可 */
  30. #nav > li {
  31. position: relative;
  32. }
  33. #nav > li > ul {
  34. position: absolute;
  35. top: 50px;
  36. width: 180px;
  37. border: 1px solid #aaa;
  38. border-top: none;
  39. }
  40. #nav > li > ul > li a {
  41. display: inline-block;
  42. height: 50px;
  43. color: #444;
  44. }
  45. ul.sub li:hover {
  46. background-color: #eee;
  47. }
  48. /* 初始化时不要显示子菜单 */
  49. #nav > li > ul {
  50. display: none;
  51. }
  52. </style>

nav样式使用
width: 100vw; 可以让nav部分自动随着页面自适应视口宽度
display: flex;justify-content: space-around;同时使用弹性布局导航栏整条填满分布更加美观

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议