HTML+Sass实现HambergurMenu(汉堡包式菜单)

HTML和Sass的结合可以实现汉堡包式菜单,下面是实现的步骤:

步骤1: HTML 结构

<div class="hm-container">
  <button class="hm-btn">
    <span></span>
    <span></span>
    <span></span>
  </button>
  <div class="hm-menu">
    <nav>
      <ul>
        <li><a href="#">Menu item 1</a></li>
        <li><a href="#">Menu item 2</a></li>
        <li>
          <a href="#">Menu item 3</a>
          <ul>
            <li><a href="#">Sub-menu item 1</a></li>
            <li><a href="#">Sub-menu item 2</a></li>
            <li><a href="#">Sub-menu item 3</a></li>
          </ul>
        </li>
        <li><a href="#">Menu item 4</a></li>
        <li><a href="#">Menu item 5</a></li>
      </ul>
    </nav>
  </div>
</div>

在这个 HTML 结构中,菜单按钮用一个 <button> 元素包裹,Sass 会对该元素进行编译处理。点击按钮后,显示一个菜单列表,这个列表包含了自定义的多级菜单(第3个菜单项之下有一个子菜单)。

步骤2:利用 Sass 实现样式

使用 Sass 对该结构制作样式,我们可以把汉堡包的三条线转换成水平线,为按钮添加动画效果,并设置滑过菜单项时的背景颜色。

.hm-btn {
  display: block;
  padding: 0;
  width: 50px;
  height: 40px;
  border: none;
  background-color: transparent;
  position: relative;
  cursor: pointer;
  &:focus {
    outline: none;
  }
  span {
    width: 25px;
    height: 2px;
    background-color: #333;
    position: absolute;
    left: 50%;
    top: 50%;
    &:nth-child(1) {
      transform: translate(-50%, -9px);
    }
    &:nth-child(2) {
      transform: translate(-50%, -1px);
    }
    &:nth-child(3) {
      transform: translate(-50%, 7px);
    }
  }
}

.hm-menu {
  display: none;
  background-color: #fff;
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 160px;
  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
  nav {
    ul {
      list-style: none;
      margin: 0;
      padding: 0;
      li {
        margin: 0;
        padding: 0;
        a {
          display: block;
          color: #333;
          text-decoration: none;
          padding: 8px 16px;
          &:hover {
            background-color: #f5f5f5;
          }
        }
        ul {
          display: none;
          position: absolute;
          top: 0;
          left: 100%;
          min-width: 160px;
          background-color: #fff;
          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
          li {
            a {
              padding: 6px 12px;
            }
          }
        }
        &:hover {
          ul {
            display: block;
          }
        }
      }
    }
  }
}

.hm-container.active {
  .hm-btn {
    span {
      &:nth-child(1) {
        transform: translate(-50%, -1px) rotate(-45deg);
      }
      &:nth-child(2) {
        opacity: 0;
      }
      &:nth-child(3) {
        transform: translate(-50%, 1px) rotate(45deg);
      }
    }
  }
  .hm-menu {
    display: block;
  }
}

在这里,我们使用了一下 Sass 的特性:

  • & 符号:该符号是 Sass 的占位符标识,用于引用父元素。
  • &:focus、&:nth-child(n)、&:hover 这些伪选择器可以使用 & 符号引用父元素,避免了重复编写标签选择器。
  • 属性插值:使用 #{} 将变量或表达式插入到属性中。

此外,在 .hm-container 的 class 属性中,使用了“active”类,用于在按钮被点击时切换菜单项的状态。这个 class 是通过 JavaScript 动态添加的,下面来看看该部分代码:

const btn = document.querySelector('.hm-btn');
const menu = document.querySelector('.hm-menu');
const container = document.querySelector('.hm-container');

btn.addEventListener('click', function(e) {
  e.preventDefault();
  container.classList.toggle('active');
});

点击按钮后,将切换 .hm-container 的 class 属性。这里使用的是 classList.toggle() 方法,如果类名不存在,则添加该类名,否则从元素上移除这个类名。

示例1:实现部分菜单项有图标

我们可以使用 ::before 伪元素来为菜单项添加图标,示例代码如下:

.hm-menu {
  /*…*/
  nav {
    /*…*/
    ul {
      /*…*/
      li {
        /*…*/
        a {
          /*…*/
          &:before {
            content: "";
            display: inline-block;
            width: 16px;
            height: 16px;
            margin-right: 8px;
            background-image: url("../images/icon.png");
            background-repeat: no-repeat;
            background-size: contain;
            position: relative;
            top: -2px;
          }
        }
        /*…*/
      }
      /*…*/
    }
  }
}

在这里,我们为 ::before 伪元素设定了以下样式:

  • content: "":伪元素默认产生的内容为空。
  • display: inline-block:把伪元素变成行内块元素,以便它可以被垂直居中。
  • width、height:设置图标的宽度和高度。
  • margin-right:为图标留出一段空白,使其与文本之间保持一定的距离。
  • background-image:设置图标的图片地址。
  • background-repeat:不重复显示。
  • background-size:将图标缩放到可适应的大小。
  • position:相对定位,为其后续添加 top、left、bottom、right 属性做准备。
  • top:用于调整图标的垂直位置。

示例2:实现菜单项有圆角边框

我们可以为菜单项和子菜单添加圆角边框,这也是利用 Sass 处理 CSS 的表现力之一。示例代码如下:

.hm-menu {
  /*…*/
  nav {
    /*…*/
    ul {
      /*…*/
      li {
        /*…*/
        border-radius: 4px;
        &:hover {
          background-color: #f5f5f5;
          border-radius: 4px;
          & > a {
            border-radius: 4px;
          }
        }
        ul {
          /*…*/
          li {
            /*…*/
            border-radius: 4px;
            &:hover > a {
              background-color: #f5f5f5;
              border-radius: 4px;
            }
          }
        }
      }
      /*…*/
    }
  }
}

在这里,我们为菜单项和子菜单都添加了圆角样式。

  • border-radius:设置圆角大小。
  • & > a:选择子元素 a 标签。
  • &:hover > a:选择在鼠标悬停时的 a 子元素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:HTML+Sass实现HambergurMenu(汉堡包式菜单) - Python技术站

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

相关文章

  • HTML中利用div+CSS实现简单的箭头图标的代码

    实现简单的箭头图标可以通过HTML中的div元素和CSS样式来实现。下面是实现的方法: 首先,在HTML文件中添加一个div元素,用来容纳箭头图标。 <div class="arrow"></div> 接着,在CSS文件中定义该div元素的样式。首先设置div的宽度和高度,然后设置背景颜色为透明,这样就可以看到箭头…

    css 2023年6月9日
    00
  • 浅谈CSS字体的加载加速问题

    浅谈CSS字体的加载加速问题 CSS字体的加载速度直接影响着网页的性能和用户体验。本攻略将介绍如何优化CSS字体的加载速度,从而提升网页的性能和用户体验。 1. 使用系统默认字体族 系统默认字体族是每台计算机上都默认安装的字体。在CSS中使用这些字体族,不但可以节省加载时间,还可以保证字体的一致性。以下是常用的默认字体族: body { font-famil…

    css 2023年6月9日
    00
  • css选中父元素下的第一个子元素(:first-child)

    在 CSS 中,我们可以使用 :first-child 伪类来选中父元素下的第一个子元素。下面是一个完整攻略,包含了如何使用 :first-child 伪类选中父元素下的第一个子元素的过程和两个示例说明。 使用 :first-child 伪类选中父元素下的第一个子元素 我们可以使用 :first-child 伪类来选中父元素下的第一个子元素。下面是一个示例:…

    css 2023年5月18日
    00
  • jQuery实现自动调整字体大小的方法

    以下是“jQuery实现自动调整字体大小的方法”的完整攻略。 1. 背景介绍 在网页排版中,有时候出现文字内容过多,而文字区域大小有限的情况,此时可以考虑使用动态自动调整字体大小的效果,让字体大小随着区域大小的变化而自适应,以达到更好的阅读体验。此时jQuery可以帮助我们实现这一功能。 2. 实现步骤 以下是实现自动调整字体大小的方法,分为以下两步: 2.…

    css 2023年6月11日
    00
  • CSS3的Flexible Boxes详细使用教程

    CSS3的Flexible Boxes详细使用教程 CSS3的Flexible Boxes(弹性盒子)是CSS布局的一种新技术,它可以更好地解决页面中的布局问题。通过使用弹性盒子,我们可以更方便地实现响应式设计,减少多余的CSS代码。 弹性盒子的基本概念 弹性盒子由容器和项目组成,容器包括了一定数量的项目。在弹性布局中,我们把容器称为“flex contai…

    css 2023年6月11日
    00
  • 用jquery写的菜单从左往右滑动出现

    下面就为大家介绍一下使用jQuery实现从左往右滑动的菜单的完整攻略。 思路概述 首先,我们需要明确效果需求:当鼠标悬浮在导航菜单上时,菜单从左向右滑动出现;当鼠标离开导航菜单时,菜单又缓慢地向左收起。 基于这个需求,我们可以思考出以下实现思路: HTML 结构部分:使用 ul 和 li 标签进行导航菜单的构建; CSS 样式部分:为菜单元素设置合适的样式,…

    css 2023年6月10日
    00
  • 详解用backgroundImage解决图片轮播切换

    详解使用background-image解决图片轮播切换的完整攻略如下。 1. 为什么使用background-image进行图片轮播 在轮播图片时,经常使用<img>标签以及一些JavaScript插件来实现。然而,使用这种方式会导致页面加载速度变慢,因为每个图片都要单独下载。如果网站中有很多图片需要轮播,这将是一个大问题。 使用backgro…

    css 2023年6月10日
    00
  • 解决移动端跳转问题(CSS过渡、target伪类)

    解决移动端跳转问题可以通过多种方式实现,其中比较常用的两种方式分别是使用CSS过渡和target伪类。下面将分别进行详细讲解,并提供示例说明。 使用CSS过渡解决移动端跳转问题 原理 CSS过渡是一种能够为元素添加从一种样式到另一种样式的平滑过渡效果的方法。通常情况下,我们使用CSS过渡可以优雅地解决移动端跳转问题。 具体而言,我们需要为需要跳转的元素添加样…

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