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
滑块,并设置颜色和位置,从而达到最终效果
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于