博客列表 >导航下拉菜单如何实现

导航下拉菜单如何实现

longlong
longlong原创
2020年06月13日 10:37:581839浏览

导航下拉菜单的实现

  • 使用以下几个知识点:

    • 链接 + 无序列表 + 事件监听 + 事件委托
  • 先写html。先看看我们要实现的效果,如下图:

直接上代码把:

  1. <body>
  2. <ul id="nav">
  3. <li>
  4. <h1><a href="">设计之家</a></h1>
  5. </li>
  6. <li><a href="">首页</a></li>
  7. <li>
  8. <a href="">灵感</a>
  9. <ul>
  10. <li><a href="">平面设计</a></li>
  11. <li><a href="">环艺设计</a></li>
  12. <li><a href="">工业设计</a></li>
  13. <li><a href="">CG插画</a></li>
  14. <li><a href="">网页UI</a></li>
  15. </ul>
  16. </li>
  17. <li><a href="">文章</a></li>
  18. <li>
  19. <a href="">教程</a>
  20. <ul>
  21. <li><a href="">平面教程</a></li>
  22. <li><a href="">网页教程</a></li>
  23. <li><a href="">多媒体教程</a></li>
  24. <li><a href="">PS教程</a></li>
  25. <li><a href="">印前技术</a></li>
  26. </ul>
  27. </li>
  28. <li>
  29. <a href="">素材</a>
  30. <ul>
  31. <li><a href="">矢量素材</a></li>
  32. <li><a href="">矢量标志</a></li>
  33. <li><a href="">PSD素材</a></li>
  34. <li><a href="">壁纸下载</a></li>
  35. </ul>
  36. </li>
  37. <li><a href="">资讯</a></li>
  38. <li>
  39. <a href="">征集</a>
  40. <ul>
  41. <li><a href="">平面征集</a></li>
  42. <li><a href="">工业征集</a></li>
  43. <li><a href="">环境艺术</a></li>
  44. </ul>
  45. </li>
  46. <li><a href="">导航</a></li>
  47. <li>
  48. <input type="search" placeholder="请输入关键词" />
  49. </li>
  50. </ul>
  51. </body>

html写好之后效果如下:


  • 接着开始写它的样式,代码如下(注意看注释):
  1. <style>
  2. /*对元素样式初始化*/
  3. * {
  4. margin: 0;
  5. padding: 0;
  6. box-sizing: border-box;
  7. }
  8. /* 去掉a标签的下划线以及设置字体颜色*/
  9. a {
  10. color: #bbb;
  11. text-decoration: none;
  12. }
  13. /*设置导航条的背景色,高度以及使内容垂直居中*/
  14. #nav {
  15. background-color: #b31414;
  16. height: 70px;
  17. line-height: 70px;
  18. }
  19. /*去掉列表标记,设置各列表水平间距并使齐浮动起来*/
  20. li {
  21. list-style: none;
  22. margin: 0 45px;
  23. float: left;
  24. }
  25. /*设置光标移动到文本上的字体颜色,高亮显示*/
  26. #nav > li > a:hover {
  27. color: white;
  28. }
  29. /*将父级设置为子菜单的容器*/
  30. #nav > li {
  31. position: relative;
  32. }
  33. /*设置子菜单的显示位置以及背景色*/
  34. #nav > li > ul {
  35. position: absolute;
  36. top: 70px;
  37. left: -48px;
  38. width: 180px;
  39. background-color: #f9f6f6;
  40. padding-bottom: 20px;
  41. }
  42. /*设置子菜单高度,使其拉开更加美观*/
  43. #nav > li > ul > li {
  44. height: 50px;
  45. }
  46. /*设置子菜单中文本颜色*/
  47. #nav > li > ul > li > a {
  48. color: black;
  49. }
  50. /*初始化子菜单隐藏*/
  51. #nav > li > ul {
  52. display: none;
  53. }
  54. /*设置搜索框高,宽,圆角等*/
  55. input {
  56. height: 40px;
  57. width: 200px;
  58. border-radius: 10px;
  59. border: 0px;
  60. padding: 10px;
  61. }
  62. ul > li > h1 {
  63. font-family: "方正粗黑宋简体";
  64. font-size: 40px;
  65. }
  66. </style>

样式写好以后,基本成形了,但不具备交互功能,不会显示初始化时隐藏的下拉菜单,如下图:


  • 接着写js,使下拉菜单显示出来,代码如下:
  1. <script>
  2. //先获取所有的主导航
  3. const navs = document.querySelectorAll("#nav > li");
  4. navs.forEach(function (nav) {
  5. //设置当鼠标移入是,显示子菜单
  6. nav.addEventListener("mouseover", showSubMenu);
  7. //设置当鼠标移出时,隐藏子菜单
  8. nav.addEventListener("mouseout", closeSubMenu);
  9. });
  10. //显示子菜单的函数
  11. function showSubMenu(ev) {
  12. //判断当前导航是否有子菜单,如果有,则显示
  13. if (ev.target.nextElementSibling !== null) {
  14. ev.target.nextElementSibling.style.display = "block";
  15. }
  16. }
  17. //隐藏子菜单的函数
  18. function closeSubMenu(ev) {
  19. //关掉子菜单
  20. if (ev.target.nodeName === "A" && ev.target.nextElementSibling !== null) {
  21. ev.target.nextElementSibling.style.display = "none";
  22. }
  23. }
  24. </script>

最后,设置完成,效果如下:


总结:

  1. 完成一个实战项目需要较强的逻辑性

  2. 需要熟练运用html\css\js等基础知识

  3. 发现问题尝试自己解决,多查看别人的经验,结合参考手册等


问题发现:

  • 这个导航菜单不能自适应浏览器宽度,当浏览器缩小时,里面的结构和内容会发生变化,尝试着用 flex、 grid、 overflow等,自己都没有解决。待进一步加强
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议