效果

参考:

Youtube – Responsive Navigation Menu Bar + Hamburger Menu Toggle - Only with CSS

Youtube – Making an animated hamburger button and a challenge to you!

Youtube – JavaScript - How to Create a Responsive Hamburger Menu with HTML, CSS, & JavaScript

做法

一条一条的 bar 是 div / span 做的.

点击的时候, 中间的 bar 消失, 上下的 bar rotate 就形成了 X

HTML

<div class="nav">
<input class="hamburger-toggle" type="checkbox" />
<span class="hamburger"></span>
</div>

checkbox 用来做 toggle, 其实用 JS 做会比较容易. checkbox 的 size 不容易控制, 又要搞定位什么的, 很不直观.

hamburger bar 虽然有三条, 但上下 2 条是用 ::before ::after 搞出来的. 其实要用 3 个 span 也是 ok 的, 甚至更直观.

CSS Style

3 bar style

.hamburger,
.hamburger::before,
.hamburger::after {
background-color: black;
width: 2rem;
height: 0.25rem;
display: inline-block;
transition-property: transform top opacity;
transition-duration: 0.4s;
}

3 条 bar 一起画.

transition 是等下 toggle 时 rotate 和 opacity 的过渡效果.

top, bottom bar style

.hamburger {
position: relative; &::before,
&::after {
content: "";
position: absolute;
} &::before {
top: -0.5rem;
} &::after {
top: 0.5rem;
}
}

这里要注意, 3 条 bar 并不是 sibling. 它是 parent child

但是眼睛看上去应该要是 before, hamburger, after sibling才对.

所以就需要用到绝对定位. 感觉很不直观...

通过绝对定位, 它们就重叠了, 然后 before top -0.5rem 往上, after top 0.5rem 往下, 最终就形成 3 条 bar 了.

checkbox style

.nav {
position: relative;
.hamburger-toggle {
position: absolute;
top: 0px;
left: 0px;
width: 2rem;
height: 100%;
z-index: 1;
opacity: 0;
cursor: pointer;
}
}

它也是绝对定位, 因为要和 3 条 bar 重叠, 这样才点击的到, 用 opacity 让它消失 (看不见但是点击的到)

toggle checked style

.hamburger-toggle {
&:checked ~ .hamburger {
background-color: transparent;
&::before {
transform: rotate(45deg);
top: 0;
} &::after {
transform: rotate(-45deg);
top: 0;
}
}
}

checked 时让中间的 bar, 也就是 .hamburger background-color transparent 消失. 这里不可以用 opacity 哦.

因为 opacity 会同时让它的 child (before, after) 一起消失, 这不是想要的.

before 和 after 就 rotate 45°, 一个往上, 一个往下, 默认的 rotate origin (轴心) 是 center 所以必须加上 top 0 调回正中间.

如果没有 top: 0 效果是下面这样.

红色是原来的位置, 黑色是 rotate 以后的位置. 当把 2 个 set 成 top:0, 上面的 bar 往下移, 下面的往上移, 2 个 bar 在中间交会就形成了 X.

注: rotate 以后 width 就比原本的短了, 所以左边会有一点点偏移, 但是看不太出来, 所以不用理会.

完整代码

HTML

<div class="nav">
<input class="hamburger-toggle" type="checkbox" />
<span class="hamburger"></span>
</div>

Sass

.nav {
position: relative; .hamburger-toggle {
position: absolute;
top: 0px;
left: 0px;
width: 2rem;
height: 100%;
z-index: 1;
opacity: 0;
cursor: pointer; &:checked ~ .hamburger {
background-color: transparent;
&::before {
transform: rotate(45deg);
top: 0;
} &::after {
transform: rotate(-45deg);
top: 0;
}
}
} .hamburger,
.hamburger::before,
.hamburger::after {
background-color: black;
width: 2rem;
height: 0.25rem;
display: inline-block;
transition-property: transform top opacity;
transition-duration: 0.4s;
} .hamburger {
position: relative; &::before,
&::after {
content: "";
position: absolute;
} &::before {
top: -0.5rem;
} &::after {
top: 0.5rem;
}
}
}

直观版本

如果不喜欢搞一堆的定位, before after, 也可以用最简单的 way.

HTML

<button class="menu-btn">
<span class="top-bar"></span>
<span class="center-bar"></span>
<span class="bottom-bar"></span>
</button>

CSS Style

.menu-btn {
--bar-gap: 0.75rem; width: 100px;
height: 100px;
display: flex;
flex-direction: column;
justify-content: center;
gap: var(--bar-gap); .top-bar,
.center-bar,
.bottom-bar {
background-color: currentColor;
height: 1rem;
width: 100%;
border-radius: 999px; transition-property: transform opacity;
transition-duration: 0.4s;
} &.opened {
.center-bar {
opacity: 0;
}
.top-bar {
transform: translateY(calc(var(--bar-gap) + 100%)) rotate(45deg);
}
.bottom-bar {
transform: translateY(calc(-1 * (var(--bar-gap) + 100%))) rotate(-45deg);
}
}
}

需要留意它的 transform 还加上了 translateY 桥位置.

JS

document.querySelector('.menu-btn').addEventListener('click', event => {
event.currentTarget.classList.toggle('opened');
});

CSS & JS Effect – Hamburger Menu的更多相关文章

  1. CSS+JS实现兼容性很好的无限级下拉菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

  2. CSS+JS下拉菜单和纯CSS下拉菜单

    下拉菜单 (思路:先把二级定位到屏幕外,鼠标悬停重新定位回来:另一个就是ul浮动,li也浮动) 下拉菜单的一般思路就是把子导航嵌套在无序列表中,把列表定位到屏幕之外,当鼠标悬停在其父列表项上时,重新定 ...

  3. 下拉的DIV+CSS+JS二级树型菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 190310HTML&CSS&JS

    一.HTML 1.web server import socket def handle_request(client): buf = client.recv(1024) client.send(by ...

  5. 前端小白页面开发注意事项及小工具(html\css\js)

    技术一直在向前发展.但是有一些是相通的,要找准重点,将80%的时间放在提升基础问题上,余下的20%再去学习框架,库和工具. HTML 1. HTML 属性应当按照以下给出的顺序依次排列,确保代码的易读 ...

  6. html鼠标自定义右键菜单:css+js实现自定义html右键菜单

    我们在网页中很多都有右键菜单的功能,一般点击右键显示的是浏览器默认的菜单选项,那么我们直接如何通过css+js实现html的右键菜单呢?这篇文章将讲解html鼠标自定义右键菜单的实现原理和实现代码. ...

  7. CSS & JS 制作滚动幻灯片

    ==================纯CSS方式==================== <!DOCTYPE html> <html> <head> <met ...

  8. 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决

    Maven Jetty 插件的问题(css/js等目录死锁,不能自动刷新)的解决:   1. 打开下面的目录:C:\Users\用户名\.m2\repository\org\eclipse\jetty ...

  9. Css Js Loader For Zencart

    Css Js Loader 描述:这个插件很早就出来了,可能知道人非常少 这个插件的功能是整合所有的网站的CSS和JS内容到一个文件里边. 因为CSS和JS文件到了一个文件,加快了程序的运行 在配合其 ...

  10. 购物车数字加减按钮HTML+CSS+JS(有需要嫌麻烦的小伙伴拿走不谢)

    之前在写详情页的时候,如下图 因为自己嫌麻烦,就去看其他网站是怎么写的,想直接拿来用,后来看来看去觉得写得很麻烦,于是最后还是决定自己写,附上HTML+CSS+JS代码,一条龙一站式贴心服务2333 ...

随机推荐

  1. 学习Java的第一周总结

    经历了一周关于Java的学习后,我想已经初步了解了Java.在这一周中我跟随黑马程序员的脚步初步学习,现在已经安装了jdk环境(当然它不只是一个运行环境,还附带了许多开发工具)并能够用它输出" ...

  2. 第四节 JMeter基础-初级登录【固定用户登录】

    声明:本文所记录的仅本次操作学习到的知识点,其中商城IP错误,请自行更改. 1.认识JMeter (1)测试计划:测试的起点,所有组件的容器.相当于一个测试项目,对测试计划展开一系列的操作. (2)线 ...

  3. CF466E Information Graph 题解

    题目链接 Luogu Codeforces 题意简述 某公司中有 \(n\) 名员工.为方便起见,将这些员工从 1 至 \(n\) 编号.起初,员工之间相互独立.接下来,会有以下 \(m\) 次操作: ...

  4. 「模拟赛」暑期集训CSP提高模拟4(7.21)

    很祭的一次比赛,啥也不会. 题目列表: A.White and Black B.White and White C.Black and Black D.Black and White A.White ...

  5. python tesseract-ocr 图文识别 (windows基础环境搭建)

    python tesseract-ocr 图文识别 一,先进行Tesserocr安装下载 1,先点击进入下面的百度网盘链接: https://pan.baidu.com/s/1G5vZO2B4Mxx5 ...

  6. Jmeter函数助手22-V

    V函数用于执行变量名.嵌套函数.类似eval函数 Name of variable (may include variable and function references):必填,填入变量名称或者 ...

  7. 【ElasticSearch】突破深度分页限制的分页方案

    一.场景需求 最近在忙一个新的项目,数据源是ES,但是功能就是对文档进行翻页查询 ES提供了分页查询,就是from + size深度查找,但是使用有限制,只能在1万条内 我和同事的意见是1万条之后的数 ...

  8. 【Canal】01 入门 & Kafka模式

    什么是Canal (卡耐尔) ? Canal 是用 Java 开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件 原理基于MySQL的binlog从库监听       一.MySQL ...

  9. 国产CPU(兆芯 kx-6640) 播放1080p视频效果

    前一阵买了一个国产CPU的主机(国产CPU,国产操作系统UOS--零刻LZX迷你主机 , 显卡驱动安装以及屏幕配置),cpu是兆芯  kx-6640,用来播放1080p的视频虽然不是那么丝滑的流畅,但 ...

  10. 高校校园网下电脑IP是不是公网IP

    突然想到一个问题,那就是高校校园网中的IP地址是不是公网IP,如果不是公网IP那么就是使用net后的共享IP,还或者是部分人用公网IP然后另一部分人使用net后的共享IP??? =========== ...