每天一个小技巧:变形汉堡按钮(Hamburger Menu)
汉堡按钮(Hamburger menu)常用于移动端网站 展开/收起 导航,如果在点击按钮时再增加一些过渡动画则会显得更加生动有趣。今天我们就快速实现一个带有过渡动画的汉堡按钮。效果如图:
HTML
html 结构很简单,两个 div
足以:
<div class="menu"><div class="hamburger"></div>
</div>
div.menu
代表按钮,div.hamburger
代表按钮中的线段。但是一个 div
如何显示 3 条线段?有同学应该想到了,可以用 ::before
、::after
伪元素。
CSS
为了让代码更简洁,选择使用 Sass 书写样式。
定义变量
首先我们需要定义一些变量,减少重复的参数。写样式的时候也可以像写组件那样去提炼配置,通过配置去修改、扩展。比如,线段的尺寸、位置都可以通过按钮尺寸 $menu-size
计算得到,这样一旦我们需要修改按钮尺寸就只需要修改 $menu-size
这一个参数就行了。
变量:
$menu-size: 300px; // 按钮尺寸$line-width: $menu-size * 0.66; // 线段宽度
$line-height: $menu-size * 0.1; // 线段高度
$line-spacing: $menu-size * 0.22; // 线段间距
$line-color: #f44336; // 线段颜色
样式
按钮样式:
常规操作,没啥好讲的...
.menu {// 水平、垂直居中
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
// 宽高
width: $menu-size;
height: $menu-size;
// 其他
cursor: pointer;
background-color: rgba(255, 255, 255, 0.5);
border-radius: 6%;
}
线段样式:
.hamburger {// 水平、垂直居中
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
// 线段样式
&,
&::before,
&::after {
content: "";
position: absolute;
width: $line-width;
height: $line-height;
background: $line-color;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
// 过渡时间
transition: 0.5s;
}
// 线段1位置
&::before {
top: -$line-spacing;
}
// 线段3位置
&::after {
top: $line-spacing;
}
}
激活状态:
当点击按钮后通过 Javascript 给 div.menu
添加 active
的 class,表示按钮进入激活状态:
.menu.active {.hamburger {
// 隐藏线段2
background-color: transparent;
box-shadow: none;
// 线段1 旋转定位
&::before {
top: 0;
transform: rotate(45deg);
}
// 线段3 旋转定位
&::after {
top: 0;
transform: rotate(135deg);
}
}
}
JS
最后,监听按钮的点击事件,toggle 激活状态:
const menu = document.querySelector(".menu");menu.addEventListener("click", () => {
menu.classList.toggle("active");
});
好了,大功告成!
本文 Demo 参考:Codepen Trick by Day (2020-07-07) Transforming Hamburger Menu
以上是 每天一个小技巧:变形汉堡按钮(Hamburger Menu) 的全部内容, 来源链接: utcz.com/a/30697.html