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日

相关文章

  • Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)

    下面是详细讲解: Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验) 在日常爬虫过程中,有很多情况下需要模拟登录实现数据或者页面的获取,这时就需要使用到selenium了。Selenium是一款自动化测试工具,但是同样能够用来模拟登录,其内部其实是通过去操作浏览器依靠JS控制实现各种自动化的。 需求 通过实例来演示Selenium…

    css 2023年6月10日
    00
  • CSS制造:鼠标移上去显示大图

    下面是关于如何实现“CSS制造:鼠标移上去显示大图”的完整攻略。 步骤一:准备图片素材 在实现“鼠标移上去显示大图”的效果前,需要先准备好需要展示的原始图片。我们需要准备两个不同大小的图片:一个缩略图和一个大图。缩略图是展示在页面上的小图,在用户将鼠标移上去后,会展示大图。 步骤二:创建 HTML 结构 我们需要使用 HTML 构建一个基础的结构,包含一张缩…

    css 2023年6月10日
    00
  • CSS 清除浮动元素方法 整理

    CSS 清除浮动元素方法 整理 在进行网页布局的时候,我们会经常使用浮动元素来实现各种效果。但是浮动元素在布局过程中会带来一些问题,比如与其后面的元素重叠,导致布局混乱。因此,我们需要使用清除浮动来解决这些问题。 1. 浮动元素的问题 浮动元素会导致其后面的元素重叠,导致布局混乱。下面是一个例子: <div class="float&quot…

    css 2023年6月10日
    00
  • CSS浮动引起的高度塌陷问题

    CSS浮动引起的高度塌陷问题是我们在进行页面布局时常常会遇到的问题。这种情况会导致元素高度不稳定,影响页面的美观和用户体验。下面是一份完整攻略,希望能够帮助您更好地理解和解决这个问题。 什么是高度塌陷问题? CSS浮动引起的高度塌陷问题是指,当我们设置了一个元素为浮动元素后,其它元素的高度和位置受到影响,可能会出现“塌陷”的情况。具体表现为: 父元素高度不被…

    css 2023年6月10日
    00
  • js+canvas实现代码雨效果

    下面是详细的“js+canvas实现代码雨效果”的攻略。 1. canvas基础知识 在使用canvas实现代码雨效果前,需要掌握以下canvas基础知识: 创建canvas标签:<canvas id=”canvas”></canvas> 获取canvas元素:var canvas = document.getElementById(…

    css 2023年6月10日
    00
  • HTML中的表单Form实现居中效果

    下面就来详细讲解一下HTML中的表单Form实现居中效果的完整攻略。 1. 使用CSS实现表单居中 表单元素默认是不会居中的,但是我们可以借助CSS来实现表单的居中效果。具体步骤如下: 创建一个包含表单的容器元素,并设置容器元素的宽度以及 margin 属性来实现居中效果。 <div class="form-container"&g…

    css 2023年6月10日
    00
  • Vue-cli 移动端布局和动画使用详解

    Vue-cli 是一个专门为Vue.js 框架开发的脚手架工具,它可以方便快捷地创建和管理 Vue 项目。本文将详细讲解如何在 Vue 项目中进行移动端布局和动画的使用。 移动端布局 使用 vw/vh CSS3 中为我们提供了两种新的单位:vw 和 vh。其中,vw 为视口宽度的百分比单位,vh 为视口高度的百分比单位。通过使用这两个单位来实现布局时,可以避…

    css 2023年6月10日
    00
  • div里的图片距离div下边框多3个像素的解决方法

    要解决“div里的图片距离div下边框多3个像素”的问题,可以有以下几种方法: 方法一:使用负margin 可以通过给图片设置负margin来达到让图片距离下边框多出3像素的效果。具体实现如下: <div class="parent"> <img src="image.jpg"> </di…

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