HTML和Sass的结合可以实现汉堡包式菜单,下面是实现的步骤:
<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个菜单项之下有一个子菜单)。
使用 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 的特性:
此外,在 .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()
方法,如果类名不存在,则添加该类名,否则从元素上移除这个类名。
我们可以使用 ::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 伪元素设定了以下样式:
我们可以为菜单项和子菜单添加圆角边框,这也是利用 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;
}
}
}
}
/*…*/
}
}
}
在这里,我们为菜单项和子菜单都添加了圆角样式。
本文链接:http://task.lmcjl.com/news/15827.html