JS+CSS案例:可适应上下布局和左右布局的菜单(含二级菜单)

时间:2024-11-16 09:35:19

今天,我给大家分享一个原创的CSS菜单,整个菜单全由CSS写成,仅在切换布局时使用JS。合不合意,先看看效果图。

本例图片

接下来,我来详细给大家分享它的制作方法。

文件夹结构

因为涉及到了样式表切换,所以,你需要借鉴一下我的文件夹结构。

CSS文件夹:

  1. 用于清楚浏览器默认设置;
  2. 用于写公共布局的样式表,本例主要是写头部和菜单的基本结构。
  3. 用于写菜单水平布局的样式表(即页面上下布局)
  4. 用于写菜单垂直布局的样式表(即页面左右布局)

我在这里的介绍顺序,也是它们在HTML中的引用顺序。

JS文件夹:jq库文件jquery.cookie。

然后就是HTML页面

接下来,我们看一下html页面的头部引用:

HTML头部引用

  1. <head>
  2. <meta charset="UTF-8">
  3. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  4. <title>CSS 菜单(含二级菜单)</title>
  5. <link href="css/" rel="stylesheet" type="text/css" />
  6. <link href="css/" rel="stylesheet" type="text/css" />
  7. <link href="css/" rel="stylesheet" type="text/css" id="cssfile" />
  8. <!-- 引入jQuery -->
  9. <script src="js/jquery-3.5." type="text/javascript"></script>
  10. <!-- 引入库 -->
  11. <script src="js/" type="text/javascript"></script>
  12. </head>

我们看到 在CSS引用时,我引用了3个css文件: , , 并且,在引用 时,还在这行代码的最后给它加了一个 id=cssfile 。为什么这样呢?因为我后面要通过js来改变这个ID的引用文件,达到用户前台切换样式表的目的。所以,这个id 一定不能忘了写。

接下来,我们来写:

页面头部

  1. <header>
  2. <logo>CSS可变换位置的菜单</logo>
  3. <ul id="skin" class="change_menu">
  4. <li id="menu-x" class="menu-x ">横向</li>
  5. <li id="menu-y" class="menu-y selected">纵向</li>
  6. </ul>
  7. <div class="clearfix"></div>
  8. </header>

在这里,我扔了一个logo标签。然后我会在css里设置它左浮动,并让后面的切换列表跟着它浮动。

这部分的CSS样式表如下:

  1. body{
  2. background: #333;
  3. box-sizing: border-box;
  4. }
  5. header{
  6. width: 100%;
  7. background:#dcdcdc;
  8. border-bottom:1px solid #999;
  9. padding: 20px;
  10. display: block;
  11. height: auto;
  12. }
  13. logo{
  14. font-size: 2rem;
  15. font-weight: 700;
  16. text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.9);
  17. float:left;
  18. margin-right: 1rem;
  19. }
  20. logo::after{
  21. position: absolute;
  22. content:'';
  23. display: block;
  24. clear: both;
  25. }
  26. .change_menu{
  27. margin-top: 5px;
  28. float:left;
  29. width: 120px;
  30. text-align: left;
  31. }
  32. .change_menu li{
  33. font-size: 0.8rem;
  34. list-style: square;
  35. cursor: pointer;
  36. transition: 0.3s;
  37. display: block;
  38. }
  39. .change_menu li:hover{
  40. color: rgb( 19,156,228);
  41. padding-left: 5px;
  42. transition: 0.3s;
  43. }
  44. .clearfix{
  45. width: 100%;
  46. height: 0px;
  47. clear:both;
  48. font-size: 0;
  49. line-height: 0;
  50. }
  51. .change_menu li.selected{
  52. color: rgb( 19,156,228);
  53. }

接下来进入正题:

二级菜单的HTML

  1. <nav>
  2. <ul class="main_menu">
  3. <li class="push_down">首页</li>
  4. <li class="push_down">笔记
  5. <ul class="sub_menu">
  6. <li><a href="###" >JS+CSS+HTML</a></li>
  7. <li><a href="###" >Python</a></li>
  8. <li><a href="###" >WordPress</a></li>
  9. <li><a href="###" >PhotoShop</a></li>
  10. <li><a href="###" >Icon</a></li>
  11. <li><a href="###" >UI Design</a></li>
  12. <li><a href="###" >PHP</a></li>
  13. <li><a href="###" >SEO</a></li>
  14. </ul>
  15. </li>
  16. <li class="push_down">作品
  17. <ul class="sub_menu">
  18. <li><a href="###" >Web Page</a></li>
  19. <li><a href="###" >Web Development</a></li>
  20. <li><a href="###" >Code Snippets</a></li>
  21. <li><a href="###" >ICON Design</a></li>
  22. <li><a href="###" >User Interface</a></li>
  23. <li><a href="###" >Picture design</a></li>
  24. <li><a href="###" >Enterprise VI System</a></li>
  25. </ul>
  26. </li>
  27. <li class="push_down">软件
  28. <ul class="sub_menu">
  29. <li><a href="###" >PhotoShop</a></li>
  30. <li><a href="###" >Screenshots Guest</a></li>
  31. <li><a href="###" >Easy Desktop</a></li>
  32. </ul>
  33. </li>
  34. <li class="push_down">团队</li>
  35. <li class="push_down">订单</li>
  36. </ul>
  37. </nav>

这个布局结构非常清晰,大家看一眼就明白了。

接下来就是写它的样式表。

我先写了横向的布局的样式表 :

横向布局菜单的CSS样式表

  1. /* */
  2. nav{
  3. width:100%;
  4. position: fixed;
  5. background:#dcdcdc;
  6. border-top:1px solid #eee;
  7. }
  8. .main_menu{
  9. width:100%;
  10. height:40px;
  11. }
  12. .main_menu>li{
  13. position: relative;
  14. float: left;
  15. text-decoration: none;
  16. padding: 0.8rem 2rem;
  17. font-family: "微软雅黑", sans-serif;
  18. font-size: 1.3rem;
  19. font-weight: 700;
  20. user-select: none;
  21. white-space: nowrap;
  22. text-align: center;
  23. height: 60px;
  24. }
  25. .sub_menu{
  26. width: auto;
  27. display:block;
  28. position: absolute;
  29. background: #ececec;
  30. font-size: 1rem;
  31. border-radius: 0px 0px 0.5rem 0.5rem;
  32. padding: 0rem 0rem;
  33. overflow: hidden;
  34. left: -30%;
  35. top:59px;
  36. transition: 0.3s;
  37. transform: rotateX(90deg);
  38. transform-origin : 100% 0 0;
  39. box-shadow: 0px 5px 5px 0px rgba(0, 0, 0, 0.2),0px 5px 5px 0px rgba(0, 0, 0, 0.2) inset;
  40. }
  41. .sub_menu li{
  42. display: block;
  43. }
  44. .sub_menu li a{
  45. display: block;
  46. color:#666;
  47. padding: 0.8rem 2rem;
  48. }
  49. .sub_menu li a:hover{
  50. color: rgb( 19,156,228);
  51. background: #fff;
  52. }
  53. .sub_menu li:first-child a:hover{
  54. box-shadow: 0px 5px 5px 0px rgba(0, 0, 0, 0.2) inset;
  55. }
  56. .push_down{
  57. cursor: pointer;
  58. border-radius: 10px;
  59. border:1px solid #dcdcdc;
  60. height: 60px;
  61. background-color: #dcdcdc;
  62. transition: 0.15s;
  63. text-shadow: 1px 2px 1px rgba(255, 255, 255, 0.9);
  64. }
  65. .push_down:hover{
  66. color: rgb( 19,156,228);
  67. }
  68. .push_down li a:active{
  69. box-shadow:0px 1px 30px rgba(0, 0, 0, 0.3)inset, 2px 2px 2px rgba(0, 0, 0, 0.029)inset,0px 1px 1px rgba(0, 0, 0, 0.06) inset,0px -1px 0px rgba(255, 255, 255, 0.06) inset,5px 5px 6px rgba(0, 0, 0, 0.027) inset,10px 9px 12px rgba(0, 0, 0, 0.07) inset;
  70. text-shadow: 1px 2px 1px rgba(255, 255, 255, 0.9);
  71. transition: 0.15s;
  72. }
  73. .push_down:hover .sub_menu {
  74. display: block;
  75. transform:rotateX(0deg);
  76. transition: 0.15s;
  77. }

接下来,复制这个样式表到新的文件中,并把新的文件命名为 ,然后,修改了菜单宽度,li的display属性值改为block,然后修改了hover状态下的二级菜单的动画方向和圆角。这样,垂直方向的菜单也就完成了:

垂直布局菜单的CSS样式表

  1. /* */
  2. nav{
  3. width:150px; /* 这里修改了,控制菜单宽度 */
  4. height: 100%;
  5. position: fixed;
  6. background:#dcdcdc;
  7. border-top:1px solid #eee;
  8. }
  9. .main_menu{
  10. width:100%;
  11. }
  12. .main_menu>li{
  13. position: relative;
  14. float: none;
  15. display: block; /* 这里修改了,让菜单一个个垂直布局下去而不是浮动 */
  16. text-decoration: none;
  17. padding: 0.8rem 2rem;
  18. font-family: "微软雅黑", sans-serif;
  19. font-size: 1.3rem;
  20. font-weight: 700;
  21. user-select: none;
  22. white-space: nowrap;
  23. text-align: center;
  24. height: 60px;
  25. }
  26. .sub_menu{
  27. width: auto;
  28. display:block;
  29. position: absolute;
  30. background: #ececec;
  31. font-size: 1rem;
  32. border-radius: 0rem 0.5rem 0.5rem 0rem; /* 这里修改了,圆角位置 */
  33. padding: 0rem 0rem;
  34. overflow: hidden;
  35. left: 149px;
  36. top:-30px;
  37. transition: 0.3s;
  38. transform: rotateY(90deg); /* 这里修改了,菜单动画 */
  39. transform-origin : 0 100% 0;
  40. box-shadow: 5px 0px 5px 0px rgba(0, 0, 0, 0.2),5px 0px 5px 0px rgba(0, 0, 0, 0.2) inset; /* 这里修改了,阴影方向 */
  41. }
  42. .sub_menu li{
  43. display: block;
  44. }
  45. .sub_menu li a{
  46. display: block;
  47. color:#666;
  48. padding: 0.8rem 2rem;
  49. }
  50. .sub_menu li a:hover{
  51. color: rgb( 19,156,228);
  52. background: #fff;
  53. box-shadow: 5px 0px 2px 0px rgba(0, 0, 0, 0.2) inset; /* 这里修改了,阴影方向 */
  54. }
  55. .push_down{
  56. cursor: pointer;
  57. border-radius: 10px;
  58. border:1px solid #dcdcdc;
  59. height: 60px;
  60. background-color: #dcdcdc;
  61. transition: 0.15s;
  62. text-shadow: 1px 2px 1px rgba(255, 255, 255, 0.9);
  63. }
  64. .push_down:hover{
  65. color: rgb( 19,156,228);
  66. }
  67. .push_down li a:active{
  68. box-shadow:0px 1px 30px rgba(0, 0, 0, 0.3)inset, 2px 2px 2px rgba(0, 0, 0, 0.029)inset,0px 1px 1px rgba(0, 0, 0, 0.06) inset,0px -1px 0px rgba(255, 255, 255, 0.06) inset,5px 5px 6px rgba(0, 0, 0, 0.027) inset,10px 9px 12px rgba(0, 0, 0, 0.07) inset;
  69. text-shadow: 1px 2px 1px rgba(255, 255, 255, 0.9);
  70. transition: 0.15s;
  71. }
  72. .push_down:hover .sub_menu {
  73. display: block;
  74. transform:rotateY(0deg); /* 这里修改了,菜单动画 */
  75. transition: 0.15s;
  76. }

两个CSS文件都准备好了,接下来就是写JS代码,实现样式表切换:

实现样式表切换的JS

注意,这个写在页面最下面哦。 具体切换的实现我就不多介绍了。想了解更多样式表切换实现的,请移步参考我的另一篇文章:JS+CSS案例:JS+CSS 实现漂亮时尚的样式表切换(换肤)功能/mp_blog/creation/editor/140877777

  1. <script type="text/javascript">
  2. //<![CDATA[
  3. $(function(){
  4. var $li =$("#skin li");
  5. $li.click(function(){
  6. switchSkin( this.id );
  7. });
  8. var cookie_skin = $.cookie( "MyCssSkin");
  9. if (cookie_skin) {
  10. switchSkin( cookie_skin );
  11. }
  12. });
  13. function switchSkin(skinName){
  14. //当前<li>元素选中
  15. $("#"+skinName).addClass("selected").siblings().removeClass("selected"); //去掉其它同辈<li>元素的选中
  16. $("#cssfile").attr("href","css/"+ skinName +".css"); //设置不同皮肤
  17. $.cookie( "MyCssSkin" , skinName , { path: '/', expires: 10 });
  18. }
  19. //]]>
  20. </script>

然后嘛,这个菜单就完成了!

大功告成!

其实很简单吧?路过的,喜欢的,帮我点个赞呗?!