一个带有滑块的nav交互效果

之前在某站看到导航带有滑块效果,而不是常见的鼠标hover时改变li的背景色,就想着自己也写一个这个的效果。今天终于动手实现了,也没有花多长时间,不难哦。
效果如下(抱歉没能动态展示):

image.png

不赘述,直接贴代码:

<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
                list-style: none;
            }
            .wrap{
                width: 800px;
                height: 300px;
                margin:0 auto;
            }
            ul{
                position: relative;
            }
            li{
                width: 100px;
                height: 30px;
                line-height: 30px;
                float: left;
                background: #000;
                color: blue;
                text-align: center;
            }
            li span{
                position: relative;
                z-index: 2;
            }
            .slider{
                width: 100px;
                height: 30px;
                background: yellow;
                position: absolute;
                top: 0;
                left: 0;
                transition:all 1s ease 0s;
            }
        </style>
    </head>
    <body>
        <div class="warp">
            <ul id="nav">
                <li><span>item-1</span></li>
                <li><span>item-2</span></li>
                <li><span>item-3</span></li>
                <li><span>item-4</span></li>
                <li><span>item-5</span></li>
                <li><span>item-6</span></li>
            </ul>
            <div class="slider" id="slider"></div>
        </div>
        <script type="text/javascript">
            var  nav=document.getElementById("nav");
            var lis=nav.getElementsByTagName("li");
            var len=lis.length;
            var slider=document.getElementById("slider");
            for(let i=0;i<len;i++){
                lis[i].index=i;
                lis[i].onmouseleave=function(){
                    slider.style.transform="translateX(0)";
                }
                lis[i].onmouseenter=function(){
                    slider.style.transform="translateX("+i*100+"px)";
                }
            }
        </script>
    </body>
    </html> 

有一点要注意的是,html中有定位的元素会压盖没有定位的元素,而都有定位的元素html结构在后面的会压盖在前面的。即不设置压盖顺序的情况下,slider会压盖li的内容,导致页面渲染后看不到li的内容如item-1。但是如果给li设置z-index值又会导致slider被压盖,看不到滑块的效果。
怎么做到既能显示li的内容又能显示slider的效果呢?
首先要明确的是,slider必须要压盖li才能显示slider的效果。根据现有的html结构加上slider设置的absolute定位就可以做到(有定位的元素会压盖没有定位的元素)。
还有一点就是可以通过设置z-index来自定义压盖顺序,但是li又不能设置z-index。既如此,那就只能是操作其它dom元素了。毫无疑问,这个dom元素必须是li的子元素。所以可以给li的text部分再嵌套一层,span就可以,然后给span设置z-index。
这还没完哦!不要忘了,只有有定位的元素可以使用z-index。所以,要给span定位,设置position:relative就可以啦!
小小一个demo,知识点还是很多的哦。
:-D:-D

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,180评论 1 92
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,680评论 19 139
  • 一:在制作一个Web应用或Web站点的过程中,你是如何考虑他的UI、安全性、高性能、SEO、可维护性以及技术因素的...
    Arno_z阅读 1,369评论 0 1
  • 请参看我github中的wiki,不定期更新。https://github.com/ivonzhang/Front...
    zhangivon阅读 7,778评论 2 19
  • 序言 这是一篇全面介绍 WebKit 和 Gecko 内部操作的入门文章,是以色列开发人员塔利·加希尔大量研究的成...
    小北哥哥阅读 1,612评论 0 5

友情链接更多精彩内容