Blogger Information
Blog 53
fans 3
comment 0
visits 46763
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
前端实现导航下拉菜单功能
emagic
Original
1463 people have browsed it

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;同时使用弹性布局导航栏整条填满分布更加美观

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:总结的相当不错, 看来是学到了不少新知识 , 表格中的总结非常精彩
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post