HTML
<div class="main-container">
<ul>
<li><a href="#">Link1</a></li>
<li><a href="#">Link2</a></li>
<li><a href="#">Link3</a></li>
<li><a href="#">Link4</a></li>
<li><a href="#">Link5</a></li>
<li class="slide"></li>
</ul>
</div>
CSS
body {
margin: 0;
padding: 0;
background: #34495e;
font-family: sans-serif;
}
.main-container {
width: 100%;
height: 100%;
}
ul {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: flex;
border: 1px solid #2980b9;
background: #000;
overflow: hidden;
box-shadow: 0 0 0 5px #333;
border-radius: 30px;
margin: 0;
padding: 0;
}
ul li {
list-style: none;
width: 150px;
}
ul li a {
text-decoration: none;
display: block;
padding: 20px;
text-align: center;
color: #fff;
transition: .5s;
}
ul li:hover a {
color: #222222;
}
.slide {
position: absolute;
height: 100%;
top: 0;
left: calc(50% - 75px);
z-index: -1;
transition: .5s;
}
ul li:nth-child(1):hover ~ .slide {
left: 0;
background: #fff;
}
ul li:nth-child(2):hover ~ .slide {
left: 150px;
background: #fff;
}
ul li:nth-child(3):hover ~ .slide {
left: 300px;
background: #fff;
}
ul li:nth-child(4):hover ~ .slide {
left: 450px;
background: #fff;
}
ul li:nth-child(5):hover ~ .slide {
left: 600px;
background: #fff;
}
Demo
Description
清除浏览器默认样式
margin: 0;
padding: 0;
进行屏幕居中定位
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display:flex
:使 li
标签水平排列
list-style:none
: 清除 list 样式(去掉前面的 · )
<li class="slide"></li>
: 使用一个多余的 li
来构造滑块,一开始是想直接在标签上写,后来发现没有多余的标签控制就达不到想要的效果
transition: .5s
: 添加过渡效果,变化更平滑
left: calc(50% - 75px);
: 计算宽度的 50% 减去半个滑块宽度,设置这个是为了让滑块显示更加合理,从中间最先出现,而不是默认的位于最左边
ul li:nth-child(1):hover ~ .slide
: 选择 li:nth-child(1)
后指定的 .slide
滑块,并设置颜色和位置,从而达到最终效果
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于