仿今日头条横向滚动导航栏--原生js

咳咳!先打一波小广告,在上一篇里忘记了,那啥……我的那个个人博客做好了-->(我的博客)<--。嘿嘿

好嘞,言归正传,说说我们的效果。

其实就是实现横向滑动,进行选择。

原理:

  • 鼠标按下,获取当前鼠标坐标,作为起始坐标;
  • 鼠标移动,获取坐标,与起始坐标进行一系列的数学运算;
  • 给 left 赋值,改变位置;
  • 移动过多,超过时进行处理。
function scrollTabX() {
    let nav = document.getElementById("nav");
    let navs = document.getElementsByTagName("li");
    let navbar = document.getElementsByClassName("navbar")[0];
    let left = nav.style.left;      // ul 距离左边的距离
    let totalWidth = 0;             // 总宽度
    let minusValue = 0;             // 设备宽度与总宽度的差值

    left = left ? left : 0;         // 初始时 ul 距离左边 0px
    // 获取所有 li 所占用的宽度
    for (let i = 0; i < navs.length; i++) totalWidth += navs[i].offsetWidth;
    // 固定 ul 的宽度
    nav.style.width = totalWidth + 'px';
    minusValue = window.screen.width - totalWidth;

    // 当设备宽度小于 ul 宽度的时候,执行水平滚动
    if (minusValue < 0) {
        (function () {
            nav.onmousedown = function (ev) {
                let e = ev || event;
                // 获取鼠标的位置信息
                let startX = e.screenX;
                nav.onmousemove = function (e) {
                    left += (e.screenX - startX) / 10;
                    nav.style.left = left + 'px';
                }
            }
            nav.onmouseup = function () {
                nav.onmousemove = null;
                // 拉多了,要回来呢,兄弟
                if (left > 0) {
                    let timer = setInterval(function () {
                        left -= 50;
                        if (left <= 0) {
                            left = 0;
                            clearInterval(timer);
                        }
                        nav.style.left = left + 'px';
                    }, 20);
                }
                if (left < minusValue) {
                    let timer = setInterval(function () {
                        left += 50;
                        if (left >= minusValue) {
                            left = minusValue - 10;   // 有个 10px 的 padding
                            clearInterval(timer);
                        }
                        nav.style.left = left + 'px';
                    }, 20);
                }
                // 去掉阴影
                navbar.style.boxShadow = (left <= minusValue) ? "0 0 0 #fff" : "-5px 0 10px #fff inset";
            }
        })();
    }
}

效果图(动图不会哎):

反正想像一下效果就好了,哈哈。

至于说这篇写的不怎么样,我为什么还要置顶?……当然是因为我的博客啦!

转载于:https://www.cnblogs.com/Super-Lee/p/10566114.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值