网页技术交流
 
发新帖
楼主: 零五零八
查看: 901|回复: 0

[使用教程] HTML+CSS3+JS 实现的下拉菜单

[复制链接]
零五零八 发表于 2020-12-3 19:26:02 | 显示全部楼层
效果

1.gif


HTML

  1. <div class="container">
  2.   <h1 class="title">Dropdown Menu</h1>
  3.   <ul>
  4.     <li class="dropdown">
  5.       <a href="#" data-toggle="dropdown">First Menu <i class="icon-arrow"></i></a>
  6.       <ul class="dropdown-menu">
  7.         <li><a href="#">Home</a></li>
  8.         <li><a href="#">About Us</a></li>
  9.         <li><a href="#">Services</a></li>
  10.         <li><a href="#">Contact</a></li>
  11.       </ul>
  12.     </li>
  13.     <li class="dropdown">
  14.       <a href="#" data-toggle="dropdown">Second Menu <i class="icon-arrow"></i></a>
  15.       <ul class="dropdown-menu">
  16.         <li><a href="#">Home</a></li>
  17.         <li><a href="#">About Us</a></li>
  18.         <li><a href="#">Services</a></li>
  19.         <li><a href="#">Contact</a></li>
  20.       </ul>
  21.     </li>
  22.     <li class="dropdown">
  23.       <a href="#" data-toggle="dropdown">Third Menu <i class="icon-arrow"></i></a>
  24.       <ul class="dropdown-menu">
  25.         <li><a href="#">Home</a></li>
  26.         <li><a href="#">About Us</a></li>
  27.         <li><a href="#">Services</a></li>
  28.         <li><a href="#">Contact</a></li>
  29.       </ul>
  30.     </li>
  31.   </ul>
  32.   <p class="text-center">
  33.     See this same menu only with CSS3: <a  target="_blank">https://codepen.io/pedronauck/pen/jaluz</a>
  34.   </p>
  35. </div>
复制代码




CSS3


  1. @import url("https://fonts.googleapis.com/css?family=Lato:300,400,700,900");
  2. @import url(https://fonts.googleapis.com/css?family=Pacifico);
  3. body {
  4.   font-family: "Lato", Helvetica, Arial;
  5.   font-size: 16px;
  6. }

  7. .text-center {
  8.   text-align: center;
  9. }

  10. *, *:before, *:after {
  11.   -webkit-border-sizing: border-box;
  12.   -moz-border-sizing: border-box;
  13.   border-sizing: border-box;
  14. }

  15. .container {
  16.   width: 350px;
  17.   margin: 50px auto;
  18. }
  19. .container > ul {
  20.   list-style: none;
  21.   padding: 0;
  22.   margin: 0 0 20px 0;
  23. }

  24. .title {
  25.   font-family: 'Pacifico';
  26.   font-weight: norma;
  27.   font-size: 40px;
  28.   text-align: center;
  29.   line-height: 1.4;
  30.   color: #2980B9;
  31. }

  32. .dropdown a {
  33.   text-decoration: none;
  34. }
  35. .dropdown [data-toggle="dropdown"] {
  36.   position: relative;
  37.   display: block;
  38.   color: white;
  39.   background: #2980B9;
  40.   -moz-box-shadow: 0 1px 0 #409ad5 inset, 0 -1px 0 #20638f inset;
  41.   -webkit-box-shadow: 0 1px 0 #409ad5 inset, 0 -1px 0 #20638f inset;
  42.   box-shadow: 0 1px 0 #409ad5 inset, 0 -1px 0 #20638f inset;
  43.   text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.3);
  44.   padding: 10px;
  45. }
  46. .dropdown [data-toggle="dropdown"]:hover {
  47.   background: #2c89c6;
  48. }
  49. .dropdown .icon-arrow {
  50.   position: absolute;
  51.   display: block;
  52.   font-size: 0.7em;
  53.   color: #fff;
  54.   top: 14px;
  55.   right: 10px;
  56. }
  57. .dropdown .icon-arrow.open {
  58.   -moz-transform: rotate(-180deg);
  59.   -ms-transform: rotate(-180deg);
  60.   -webkit-transform: rotate(-180deg);
  61.   transform: rotate(-180deg);
  62.   -moz-transition: -moz-transform 0.6s;
  63.   -o-transition: -o-transform 0.6s;
  64.   -webkit-transition: -webkit-transform 0.6s;
  65.   transition: transform 0.6s;
  66. }
  67. .dropdown .icon-arrow.close {
  68.   -moz-transform: rotate(0deg);
  69.   -ms-transform: rotate(0deg);
  70.   -webkit-transform: rotate(0deg);
  71.   transform: rotate(0deg);
  72.   -moz-transition: -moz-transform 0.6s;
  73.   -o-transition: -o-transform 0.6s;
  74.   -webkit-transition: -webkit-transform 0.6s;
  75.   transition: transform 0.6s;
  76. }
  77. .dropdown .icon-arrow:before {
  78.   content: '\25BC';
  79. }
  80. .dropdown .dropdown-menu {
  81.   max-height: 0;
  82.   overflow: hidden;
  83.   list-style: none;
  84.   padding: 0;
  85.   margin: 0;
  86. }
  87. .dropdown .dropdown-menu li {
  88.   padding: 0;
  89. }
  90. .dropdown .dropdown-menu li a {
  91.   display: block;
  92.   color: #6f6f6f;
  93.   background: #EEE;
  94.   -moz-box-shadow: 0 1px 0 white inset, 0 -1px 0 #d5d5d5 inset;
  95.   -webkit-box-shadow: 0 1px 0 white inset, 0 -1px 0 #d5d5d5 inset;
  96.   box-shadow: 0 1px 0 white inset, 0 -1px 0 #d5d5d5 inset;
  97.   text-shadow: 0 -1px 0 rgba(255, 255, 255, 0.3);
  98.   padding: 10px 10px;
  99. }
  100. .dropdown .dropdown-menu li a:hover {
  101.   background: #f6f6f6;
  102. }
  103. .dropdown .show, .dropdown .hide {
  104.   -moz-transform-origin: 50% 0%;
  105.   -ms-transform-origin: 50% 0%;
  106.   -webkit-transform-origin: 50% 0%;
  107.   transform-origin: 50% 0%;
  108. }
  109. .dropdown .show {
  110.   display: block;
  111.   max-height: 9999px;
  112.   -moz-transform: scaleY(1);
  113.   -ms-transform: scaleY(1);
  114.   -webkit-transform: scaleY(1);
  115.   transform: scaleY(1);
  116.   animation: showAnimation 0.5s ease-in-out;
  117.   -moz-animation: showAnimation 0.5s ease-in-out;
  118.   -webkit-animation: showAnimation 0.5s ease-in-out;
  119.   -moz-transition: max-height 1s ease-in-out;
  120.   -o-transition: max-height 1s ease-in-out;
  121.   -webkit-transition: max-height 1s ease-in-out;
  122.   transition: max-height 1s ease-in-out;
  123. }
  124. .dropdown .hide {
  125.   max-height: 0;
  126.   -moz-transform: scaleY(0);
  127.   -ms-transform: scaleY(0);
  128.   -webkit-transform: scaleY(0);
  129.   transform: scaleY(0);
  130.   animation: hideAnimation 0.4s ease-out;
  131.   -moz-animation: hideAnimation 0.4s ease-out;
  132.   -webkit-animation: hideAnimation 0.4s ease-out;
  133.   -moz-transition: max-height 0.6s ease-out;
  134.   -o-transition: max-height 0.6s ease-out;
  135.   -webkit-transition: max-height 0.6s ease-out;
  136.   transition: max-height 0.6s ease-out;
  137. }

  138. @keyframes showAnimation {
  139.   0% {
  140.     -moz-transform: scaleY(0.1);
  141.     -ms-transform: scaleY(0.1);
  142.     -webkit-transform: scaleY(0.1);
  143.     transform: scaleY(0.1);
  144.   }
  145.   40% {
  146.     -moz-transform: scaleY(1.04);
  147.     -ms-transform: scaleY(1.04);
  148.     -webkit-transform: scaleY(1.04);
  149.     transform: scaleY(1.04);
  150.   }
  151.   60% {
  152.     -moz-transform: scaleY(0.98);
  153.     -ms-transform: scaleY(0.98);
  154.     -webkit-transform: scaleY(0.98);
  155.     transform: scaleY(0.98);
  156.   }
  157.   80% {
  158.     -moz-transform: scaleY(1.04);
  159.     -ms-transform: scaleY(1.04);
  160.     -webkit-transform: scaleY(1.04);
  161.     transform: scaleY(1.04);
  162.   }
  163.   100% {
  164.     -moz-transform: scaleY(0.98);
  165.     -ms-transform: scaleY(0.98);
  166.     -webkit-transform: scaleY(0.98);
  167.     transform: scaleY(0.98);
  168.   }
  169.   80% {
  170.     -moz-transform: scaleY(1.02);
  171.     -ms-transform: scaleY(1.02);
  172.     -webkit-transform: scaleY(1.02);
  173.     transform: scaleY(1.02);
  174.   }
  175.   100% {
  176.     -moz-transform: scaleY(1);
  177.     -ms-transform: scaleY(1);
  178.     -webkit-transform: scaleY(1);
  179.     transform: scaleY(1);
  180.   }
  181. }
  182. @-moz-keyframes showAnimation {
  183.   0% {
  184.     -moz-transform: scaleY(0.1);
  185.     -ms-transform: scaleY(0.1);
  186.     -webkit-transform: scaleY(0.1);
  187.     transform: scaleY(0.1);
  188.   }
  189.   40% {
  190.     -moz-transform: scaleY(1.04);
  191.     -ms-transform: scaleY(1.04);
  192.     -webkit-transform: scaleY(1.04);
  193.     transform: scaleY(1.04);
  194.   }
  195.   60% {
  196.     -moz-transform: scaleY(0.98);
  197.     -ms-transform: scaleY(0.98);
  198.     -webkit-transform: scaleY(0.98);
  199.     transform: scaleY(0.98);
  200.   }
  201.   80% {
  202.     -moz-transform: scaleY(1.04);
  203.     -ms-transform: scaleY(1.04);
  204.     -webkit-transform: scaleY(1.04);
  205.     transform: scaleY(1.04);
  206.   }
  207.   100% {
  208.     -moz-transform: scaleY(0.98);
  209.     -ms-transform: scaleY(0.98);
  210.     -webkit-transform: scaleY(0.98);
  211.     transform: scaleY(0.98);
  212.   }
  213.   80% {
  214.     -moz-transform: scaleY(1.02);
  215.     -ms-transform: scaleY(1.02);
  216.     -webkit-transform: scaleY(1.02);
  217.     transform: scaleY(1.02);
  218.   }
  219.   100% {
  220.     -moz-transform: scaleY(1);
  221.     -ms-transform: scaleY(1);
  222.     -webkit-transform: scaleY(1);
  223.     transform: scaleY(1);
  224.   }
  225. }
  226. @-webkit-keyframes showAnimation {
  227.   0% {
  228.     -moz-transform: scaleY(0.1);
  229.     -ms-transform: scaleY(0.1);
  230.     -webkit-transform: scaleY(0.1);
  231.     transform: scaleY(0.1);
  232.   }
  233.   40% {
  234.     -moz-transform: scaleY(1.04);
  235.     -ms-transform: scaleY(1.04);
  236.     -webkit-transform: scaleY(1.04);
  237.     transform: scaleY(1.04);
  238.   }
  239.   60% {
  240.     -moz-transform: scaleY(0.98);
  241.     -ms-transform: scaleY(0.98);
  242.     -webkit-transform: scaleY(0.98);
  243.     transform: scaleY(0.98);
  244.   }
  245.   80% {
  246.     -moz-transform: scaleY(1.04);
  247.     -ms-transform: scaleY(1.04);
  248.     -webkit-transform: scaleY(1.04);
  249.     transform: scaleY(1.04);
  250.   }
  251.   100% {
  252.     -moz-transform: scaleY(0.98);
  253.     -ms-transform: scaleY(0.98);
  254.     -webkit-transform: scaleY(0.98);
  255.     transform: scaleY(0.98);
  256.   }
  257.   80% {
  258.     -moz-transform: scaleY(1.02);
  259.     -ms-transform: scaleY(1.02);
  260.     -webkit-transform: scaleY(1.02);
  261.     transform: scaleY(1.02);
  262.   }
  263.   100% {
  264.     -moz-transform: scaleY(1);
  265.     -ms-transform: scaleY(1);
  266.     -webkit-transform: scaleY(1);
  267.     transform: scaleY(1);
  268.   }
  269. }
  270. @keyframes hideAnimation {
  271.   0% {
  272.     -moz-transform: scaleY(1);
  273.     -ms-transform: scaleY(1);
  274.     -webkit-transform: scaleY(1);
  275.     transform: scaleY(1);
  276.   }
  277.   60% {
  278.     -moz-transform: scaleY(0.98);
  279.     -ms-transform: scaleY(0.98);
  280.     -webkit-transform: scaleY(0.98);
  281.     transform: scaleY(0.98);
  282.   }
  283.   80% {
  284.     -moz-transform: scaleY(1.02);
  285.     -ms-transform: scaleY(1.02);
  286.     -webkit-transform: scaleY(1.02);
  287.     transform: scaleY(1.02);
  288.   }
  289.   100% {
  290.     -moz-transform: scaleY(0);
  291.     -ms-transform: scaleY(0);
  292.     -webkit-transform: scaleY(0);
  293.     transform: scaleY(0);
  294.   }
  295. }
  296. @-moz-keyframes hideAnimation {
  297.   0% {
  298.     -moz-transform: scaleY(1);
  299.     -ms-transform: scaleY(1);
  300.     -webkit-transform: scaleY(1);
  301.     transform: scaleY(1);
  302.   }
  303.   60% {
  304.     -moz-transform: scaleY(0.98);
  305.     -ms-transform: scaleY(0.98);
  306.     -webkit-transform: scaleY(0.98);
  307.     transform: scaleY(0.98);
  308.   }
  309.   80% {
  310.     -moz-transform: scaleY(1.02);
  311.     -ms-transform: scaleY(1.02);
  312.     -webkit-transform: scaleY(1.02);
  313.     transform: scaleY(1.02);
  314.   }
  315.   100% {
  316.     -moz-transform: scaleY(0);
  317.     -ms-transform: scaleY(0);
  318.     -webkit-transform: scaleY(0);
  319.     transform: scaleY(0);
  320.   }
  321. }
  322. @-webkit-keyframes hideAnimation {
  323.   0% {
  324.     -moz-transform: scaleY(1);
  325.     -ms-transform: scaleY(1);
  326.     -webkit-transform: scaleY(1);
  327.     transform: scaleY(1);
  328.   }
  329.   60% {
  330.     -moz-transform: scaleY(0.98);
  331.     -ms-transform: scaleY(0.98);
  332.     -webkit-transform: scaleY(0.98);
  333.     transform: scaleY(0.98);
  334.   }
  335.   80% {
  336.     -moz-transform: scaleY(1.02);
  337.     -ms-transform: scaleY(1.02);
  338.     -webkit-transform: scaleY(1.02);
  339.     transform: scaleY(1.02);
  340.   }
  341.   100% {
  342.     -moz-transform: scaleY(0);
  343.     -ms-transform: scaleY(0);
  344.     -webkit-transform: scaleY(0);
  345.     transform: scaleY(0);
  346.   }
  347. }
复制代码



js


  1. // Dropdown Menu
  2. var dropdown = document.querySelectorAll('.dropdown');
  3. var dropdownArray = Array.prototype.slice.call(dropdown,0);
  4. dropdownArray.forEach(function(el){
  5.     var button = el.querySelector('a[data-toggle="dropdown"]'),
  6.             menu = el.querySelector('.dropdown-menu'),
  7.             arrow = button.querySelector('i.icon-arrow');

  8.     button.onclick = function(event) {
  9.         if(!menu.hasClass('show')) {
  10.             menu.classList.add('show');
  11.             menu.classList.remove('hide');
  12.             arrow.classList.add('open');
  13.             arrow.classList.remove('close');
  14.             event.preventDefault();
  15.         }
  16.         else {
  17.             menu.classList.remove('show');
  18.             menu.classList.add('hide');
  19.             arrow.classList.remove('open');
  20.             arrow.classList.add('close');
  21.             event.preventDefault();
  22.         }
  23.     };
  24. })

  25. Element.prototype.hasClass = function(className) {
  26.     return this.className && new RegExp("(^|\\s)" + className + "(\\s|$)").test(this.className);
  27. };
复制代码


快速回复 返回顶部 返回列表