原生态JS写背景有个滑块的导航

先看效果:

鼠标滑动到导航项上,后面一个色块滑动到对应的导航项上。

鼠标离开的时候,滑块就退回到当前导航项上。

结合了 CSS3 的 transition 来做滑动效果。

一、分析

1. 导航在上方,说明导航有层级,且较高。那么导航要么是相对定位,要么就是绝对定位。只有定位的标签,层级 z-index 才有效果。这里,我们选择相对定位

滑块 能滑动,说明它肯定是绝对定位的,并且层级较低,在导航的后面。并且,可以通过样式的 left 属性,控制滑块的位置变化。

2. 滑块的宽度要跟 li 的宽度保持一致,要获取 li 的宽度,可以利用  offsetWidth 属性。

3. 滑块要移动到 li 的位置去。

    可以获取 li.getBoundingClientRect().left  -  ul.getBoundingClientRect().left   得到 li 在 ul 里的相对位置。

     再控制滑块的样式  left  就可以改变滑块的位置了。

二、代码

<nav class="daohang">
    <div class="section">
        <ul id="ul">
            <li class="current"><a href="#">公司</a></li>
            <li><a href="#">公司介绍</a></li>
            <li><a href="#">产品介绍</a></li>
            <li><a href="#">联系我们</a></li>
            <li><a href="#">责任</a></li>
            <li><a href="#">2020我们在一起</a></li>
        </ul>
        <div id="box" class="box"></div>
    </div>
</nav>
/* 公用样式 */
*{
    margin: 0;
    padding: 0;
}
ul,li,ol{
    list-style: none;
}
a{
    text-decoration: none;
}
body{
    font-family: Arial,Verdana,"Microsoft Yahei",".PingFang SC","Simsun";
    font-size: 14px;
}

/* 导航 主体*/
.daohang{
    height: 50px;
    line-height: 50px;
    background: #29387e;
}
.section{
    width: 1200px;
    height: 50px;
    margin-left: auto;
    margin-right: auto;
    color: #fff;
    position: relative;
}
.daohang li{
    float: left;
}
.daohang ul{
    position: relative;
    z-index: 1;
    height: 50px;
}
.daohang ul a{
    display: block;
    height: 50px;
    padding-left: 20px;
    padding-right: 20px;
    color: #fff;
    text-align: center;
}
.daohang li.current a{
    background: #f30;
}
.box{
    height: 50px;
    background: #f30;
    position: absolute;
    left: 0;
    top: 0;
    transition:all 0.3s cubic-bezier(0.23, 1, 0.32, 1.05);  /* 滑块的滑动 就靠它了 */
}
let box = document.getElementById("box");
let ul = document.getElementById("ul");
let li = ul.children;
let cur = ul.querySelector(".current");
/*
* 设置 box 的位置函数
* */
let  setBoxPosition = function(tag){
    let ulX = ul.getBoundingClientRect().left;
    let liX =tag.getBoundingClientRect().left;
    box.style.left =(liX- ulX ) + "px";       // 滑块位置更改
    box.style.width =tag.offsetWidth + "px";  // 滑块宽度更改
};
// 给 li 添加事件
for( let i = 0 ; i <= li.length-1 ; i++ ){
    li[i].addEventListener("mouseenter",function(event){
        setBoxPosition( event.currentTarget );
    });
    li[i].addEventListener("mouseleave",function(event){
        setBoxPosition( cur );
    });
}
setBoxPosition( cur );  //  初始化滑块的位置

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用HTML、CSS和JavaScript创建的基本滑块示例: HTML代码: ```html <div class="slider"> <div class="slider-track"></div> <div class="slider-thumb"></div> </div> ``` CSS代码: ```css .slider { position: relative; height: 10px; width: 200px; background-color: #e5e5e5; border-radius: 5px; } .slider-track { position: absolute; height: 100%; width: 0%; background-color: #007aff; border-radius: 5px; } .slider-thumb { position: absolute; height: 20px; width: 20px; background-color: #007aff; border-radius: 50%; top: -5px; left: 0; cursor: pointer; } ``` JavaScript代码: ```javascript const slider = document.querySelector('.slider'); const track = slider.querySelector('.slider-track'); const thumb = slider.querySelector('.slider-thumb'); thumb.addEventListener('mousedown', function(event) { event.preventDefault(); document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); }); function onMouseMove(event) { const sliderWidth = slider.offsetWidth; const thumbWidth = thumb.offsetWidth; const thumbPosition = event.pageX - slider.offsetLeft - thumbWidth / 2; const thumbPositionPercentage = thumbPosition / (sliderWidth - thumbWidth) * 100; if (thumbPositionPercentage < 0) { thumbPositionPercentage = 0; } if (thumbPositionPercentage > 100) { thumbPositionPercentage = 100; } track.style.width = `${thumbPositionPercentage}%`; thumb.style.left = `${thumbPositionPercentage}%`; } function onMouseUp() { document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); } ``` 这个滑块的基本原理是:当用户按下并拖动滑块时,通过计算滑块的位置百分比来调整滑块轨道的宽度和滑块本身的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值