纯CSS(无JS)实现的二级弹出菜单效果代码

首先我们需要了解什么是纯CSS实现的二级弹出菜单效果。

二级弹出菜单效果是指,当鼠标指向一级菜单时,二级菜单会在该一级菜单的下方水平展开。通常,这种效果需要JS的支持。但是有些开发者可能不想使用JS,只希望使用CSS来实现。那么这个要怎么做呢?

其实,实现纯CSS的二级弹出菜单效果,并不是一件困难的事情。可以使用CSS的:hover伪类和CSS选择器来实现这个效果。

接下来,我们就来详细说明一下如何实现。

1. HTML结构

首先,我们需要构建一个基本的HTML结构,包括一级和二级菜单的相关标签。

其中,一级菜单使用

  • 标签来构建。二级菜单需要嵌套在一级菜单中,并使用

    • 标签组成。代码如下:

      <nav>
        <ul>
          <li><a href="#">菜单项1</a>
            <ul>
              <li><a href="#">子菜单项1</a></li>
              <li><a href="#">子菜单项2</a></li>
              <li><a href="#">子菜单项3</a></li>
            </ul>
          </li>
          <li><a href="#">菜单项2</a>
            <ul>
              <li><a href="#">子菜单项1</a></li>
              <li><a href="#">子菜单项2</a></li>
              <li><a href="#">子菜单项3</a></li>
            </ul>
          </li>
          <li><a href="#">菜单项3</a>
            <ul>
              <li><a href="#">子菜单项1</a></li>
              <li><a href="#">子菜单项2</a></li>
              <li><a href="#">子菜单项3</a></li>
            </ul>
          </li>
        </ul>
      </nav>
      

      2. CSS样式

      接下来,我们需要为菜单添加CSS样式。主要是为了控制菜单的显示和隐藏。

      首先,我们要隐藏所有子菜单,只有在一级菜单悬停时才显示相应的二级菜单。这里我们可以使用display:none来实现菜单的隐藏。而在一级菜单悬停时,我们使用子选择器(>)来选择它下面的子菜单。在样式中添加:hover伪类来实现鼠标悬停时显示二级菜单的效果。代码如下:

      nav ul ul { 
        display: none; 
      }
      
      nav ul li:hover > ul {
        display: inherit; 
      }
      

      其次,我们需要将菜单变成水平显示,并将子菜单的位置置于一级菜单的下方。这里,我们可以使用position属性来控制菜单的位置。代码如下:

      nav ul {
        list-style: none;
        padding: 0;
        margin: 0;
      }
      
      nav ul li {
        float: left;
      }
      
      nav ul li:hover {
        background: #4CAF50;
      }
      
      nav ul ul {
        position: absolute;
      }
      
      nav ul ul li {
        float: none;
        position: relative;
      }
      
      nav ul ul ul {
        position: absolute;
        top: 0;
        left: 100%;
      }
      

      3. 示例

      示例一

      以下是一个完整的HTML和CSS示例。它演示了如何使用纯CSS来实现一个简单的二级弹出菜单效果。

      <!DOCTYPE html>
      <html>
      <head>
          <title>纯CSS二级弹出菜单示例</title>
          <style type="text/css">
              nav ul {
                  list-style: none;
                  padding: 0;
                  margin: 0;
              }
      
              nav ul li {
                  float: left;
                  position: relative;
              }
      
              nav ul li:hover {
                  background: #4CAF50;
              }
      
              nav a {
                  display: block;
                  padding: 0 10px;
                  color: #333;
                  font-size: 15px;
                  line-height: 50px;
                  text-decoration: none;
              }
      
              nav ul ul {
                  display: none;
                  position: absolute;
                  top: 100%;
                  left: 0;
                  background: #fff;
                  padding: 0;
              }
      
              nav ul ul li {
                  float: none;
                  position: relative;
              }
      
              nav ul ul li a {
                  color: #666;
                  line-height: 34px;
                  padding: 10px;
                  display: block;
              }
      
              nav ul ul li a:hover {
                  background: #f2f2f2;
              }
      
              nav ul li:hover > ul {
                  display: inherit;
              }
      
          </style>
      </head>
      <body>
      
          <nav>
              <ul>
                  <li><a href="#">首页</a></li>
                  <li><a href="#">菜单1</a>
                      <ul>
                          <li><a href="#">子菜单1</a></li>
                          <li><a href="#">子菜单2</a></li>
                          <li><a href="#">子菜单3</a></li>
                      </ul>
                  </li>
                  <li><a href="#">菜单2</a>
                      <ul>
                          <li><a href="#">子菜单1</a></li>
                          <li><a href="#">子菜单2</a></li>
                          <li><a href="#">子菜单3</a></li>
                      </ul>
                  </li>
                  <li><a href="#">菜单3</a>
                      <ul>
                          <li><a href="#">子菜单1</a></li>
                          <li><a href="#">子菜单2</a></li>
                          <li><a href="#">子菜单3</a></li>
                      </ul>
                  </li>
              </ul>
          </nav>
      
      </body>
      </html>
      

      我们可以在浏览器中打开该示例,查看菜单的效果。

      示例二

      下面,我们再来分享一个使用SCSS预处理器和ul-li命名规则的示例,这个示例可以更加方便地维护和扩展菜单样式。

      这个示例的思想是:

      1.所有的菜单都在一个ul下,我们可以用ul-li命名规则,来统一样式;

      2.二级菜单和一级菜单共用一个样式,所以可以将它们写在同一段样式中。

      具体代码如下:

      <!DOCTYPE html>
      <html>
      <head>
          <title>纯CSS二级弹出菜单示例</title>
          <!-- 引入SCSS样式 -->
          <style type="text/scss">
              nav {
                  ul {
                      margin: 0;
                      padding: 0;
                      list-style: none;
                  }
      
                  li {
                      float: left;
                      position: relative;
      
                      &:hover {
                          a {
                              background-color: #000;
                              color: #fff;
                          }
      
                          ul {
                              display: block;
                          }
                      }
      
                      a {
                          display: block;
                          padding: 0.6em 0.8em;
                          color: #000;
                          text-decoration: none;
      
                          &:hover {
                              background-color: #f7f7f7;
                              color: #000;
                          }
                      }
      
                      ul {
                          display: none;
                          position: absolute;
                          left: 0;
                          top: 100%;
                          min-width: 10em;
                          padding: 0.5em 0;
                          list-style: none;
                          background: #fff;
                          box-shadow: 0 3px 12px rgba(0, 0, 0, 0.15);
                          li {
                              position: relative;
                              padding: 0.4em 1.2em;
                          }
                      }
                  }
              }
          </style>
      </head>
      <body>
      
          <nav>
              <ul>
                  <li><a href="#">首页</a></li>
                  <li><a href="#">菜单1</a>
                      <ul>
                          <li><a href="#">子菜单1</a></li>
                          <li><a href="#">子菜单2</a></li>
                          <li><a href="#">子菜单3</a></li>
                          <li><a href="#">子菜单4</a></li>
                      </ul>
                  </li>
                  <li><a href="#">菜单2</a>
                      <ul>
                          <li><a href="#">子菜单1</a></li>
                          <li><a href="#">子菜单2</a></li>
                          <li><a href="#">子菜单3</a></li>
                      </ul>
                  </li>
                  <li><a href="#">菜单3</a>
                      <ul>
                          <li><a href="#">子菜单1</a></li>
                          <li><a href="#">子菜单2</a></li>
                      </ul>
                  </li>
              </ul>
          </nav>
      
          <!--引入SCSS编译器-->
          <script src="https://scsstranspiler.com/scripts/compile.js"></script>
      
          <!-- 对SCSS代码进行编译 -->
          <script>
              var scssText = document.querySelector('style[type="text/scss"]').textContent;
              var cssText = SCSSTranspiler.compile(scssText);
              var style = document.createElement('style');
              style.textContent = cssText;
              document.head.appendChild(style);
          </script>
      
      </body>
      </html>
      

      在浏览器中打开该示例,也可看到菜单的效果。

      以上是关于纯CSS实现的二级弹出菜单效果的完整攻略,希望能对您有所帮助。

      本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:纯CSS(无JS)实现的二级弹出菜单效果代码 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 实现div滚动条默认最底部以及默认最右边的示例代码

    实现div滚动条默认最底部以及默认最右边可以通过设置scrollTop和scrollLeft属性来实现。 滚动到底部 下面是一个示例代码,用于实现滚动条默认滚动到div的底部。 .chat-box{ height: 300px; overflow-y: scroll; } const chatBox = document.querySelector(‘.ch…

    css 2023年6月10日
    00
  • ES6基础之默认参数值

    ES6中引入了默认参数值的特性,它可以为函数的参数提供默认值,这样在调用函数时如果没有传入对应的参数,就会使用默认值。下面详细介绍ES6中默认参数值的使用方法: 基本语法 默认参数值是在函数声明时为参数指定的值,在函数调用时,如果没有传递参数,该默认参数值将被使用。默认参数值可以通过如下方式声明: function functionName(param1 =…

    css 2023年6月9日
    00
  • CSS3五个技巧给你的网站带来出色的效果

    CSS3五个技巧给你的网站带来出色的效果 1. 渐变(Gradient) 渐变是一种非常流行的Web设计元素,可以为网站添加出色的色彩效果。CSS3中的Gradient功能可以让我们很容易地实现渐变。 实现一个横向渐变背景色的例子: background: linear-gradient(to right, #3366cc 0%, #666666 100%)…

    css 2023年6月10日
    00
  • Yii使用CLinkPager分页实例详解

    Yii使用CLinkPager分页实例详解 在Yii框架中,分页是一个常用的功能。Yii提供了许多类来帮助我们轻松实现分页功能,其中最常用的是CLinkPager类。在这篇文章中,我们将详细讲解如何使用CLinkPager类来实现分页功能。 一、安装与配置 首先,我们需要在composer.json文件中添加yiisoft/yii的依赖,执行composer…

    css 2023年6月9日
    00
  • IE7 float:left左浮动失效的解决方法

    下面是解决IE7 float:left左浮动失效的完整攻略。 问题描述 在IE7浏览器下,可能会出现float:left左浮动无法生效的问题,导致页面样式错乱。这是由于IE7存在兼容性问题所致。 解决方法 方法一:添加“display:inline” 在浮动元素的样式中,添加“display:inline”属性,可以修复IE7下浮动失效的问题。 示例代码: …

    css 2023年6月10日
    00
  • CSS3实现时间轴特效

    下面是详细的“CSS3实现时间轴特效”的完整攻略: 步骤1:HTML结构和基本样式的创建 首先,我们需要搭建时间轴结构的HTML。一般来说,时间轴的结构可以使用ul列表方式进行创建。在ul中,我们需要添加相应的li元素,以及相关的div和p标签,根据需要可以更改样式。此外,在创建时间轴之前,我们还需要先行创建相关的基本样式,如下: .container { …

    css 2023年6月10日
    00
  • 详解html-webpack-plugin用法全解

    下面就来详细讲解一下“详解html-webpack-plugin用法全解”的完整攻略。 简述 html-webpack-plugin是Webpack插件中一个非常重要的插件,其作用是根据Webpack打包生成的js文件,在生成的html文件中自动生成对应的script标签引入js文件,并提供额外的功能,如html模板参数、多页面配置等。 安装 html-we…

    css 2023年6月9日
    00
  • CSS深入教程之带你认识不一样的渐变

    CSS深入教程之带你认识不一样的渐变:完整攻略 背景 渐变是Web界面中非常常用的一种样式,它可以在一个范围内平滑地呈现过渡效果,使得视觉效果更加生动、多样化。CSS3提供了多种渐变的方式,比如线性渐变(linear-gradient)、径向渐变(radial-gradient)、重复渐变(repeating-linear-gradient)等等,但是这些方…

    css 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部