实现功能

        1、鼠标在区域内滚轮上/下滑能够实现内容左/右滑

        2、内容能够自动滑动,并且在到达区域两侧后能切换方向

        3、鼠标悬浮时能够停止滑动,并且此时支持滑轮操作

        4、鼠标从移入变为移出时自动滑动,滑动方向能够自动判断此期间的滑轮操作方向,或者按照移入前的方向继续滑动

        

实现思路

        1、使用定时器来实现自动/停止滚动功能

        2、使用方向标志位来判定左/右滑动

        3、使用标志位判断是否到达了两侧尽头,而不是单纯的利用scrollLeft,并且有时候scrollLeft会达不到预期效果(scrollLeft的值没办法比scrollWidth大时)

实现代码

(能够直接使用)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        html,
        body {
            height: 100%;
            width: 100%;
            background-color: cyan;
        }
        .parentDom {
            margin: auto;
            width: 600px;
            height: 300px;
            background-color: pink;
            overflow: auto;
        }
        .childDom {
            height: 100px;
            width: 1200px;
            display: flex;
        }
        .childDom1,
        .childDom2,
        .childDom3 {
            height: 100px;
            width: 400px;
            display: inline-block;
        }
        .childDom1 {
            background-color: purple;
        }
        .childDom2 {
            background-color: orange;
        }
        .childDom3 {
            background-color: skyblue;
        }
    </style>
</head>
<body>
    
    <div 
        class="parentDom"
        id="parentDom"
    >
        <div class="childDom">
            <span class="childDom1"></span>
            <span class="childDom2"></span>
            <span class="childDom3"></span>
        </div>
    </div>

    <script>

        let isToRight = true
        let autoScrollLeftOrRightTimer = null

        const domElement = document.getElementById('parentDom')
        domElement.addEventListener('mousewheel', scrollLeftOrRight) // 绑定 鼠标滚轮 事件
        domElement.addEventListener('mouseleave', autoScrollLeftOrRight) // 绑定 鼠标移出 事件
        domElement.addEventListener('mouseenter', clearScrollLeftOrRight) // 绑定 鼠标移入 事件

        autoScrollLeftOrRight()

        // 支持利用鼠标左右滑动
        function scrollLeftOrRight (event) {
            
            const scrollLength = 100
            let delta = event.wheelDelta // 鼠标滑轮的度数
            // console.log('delta', delta);
            if (delta > 0) {
                // console.log('左滑');
                domElement.scrollLeft -= scrollLength
                // console.log(domElement.scrollLeft)
                isToRight = false
            } else {
                // console.log('右滑');
                domElement.scrollLeft += scrollLength
                // console.log(domElement.scrollLeft)
                isToRight = true
            }
        }

        // 自动滑动
        function autoScrollLeftOrRight () {
            clearInterval(autoScrollLeftOrRightTimer);

            let singleScrollWidth = 2 // 单次滑动的距离
            let resultPrev = 0
            let resultLast = 0
            let isTimeToChanged = false // 切换滑动的标志位

            autoScrollLeftOrRightTimer = setInterval(() => {
                resultPrev = domElement.scrollLeft
                // console.log('resultPrev - into : ', resultPrev);
                // console.log('domElement.scrollLeft : ', domElement.scrollLeft);

                if (isToRight) {
                    domElement.scrollLeft += singleScrollWidth
                    // console.log('domElement.scrollLeft - isToRight', domElement.scrollLeft)
                } else {
                    domElement.scrollLeft -= singleScrollWidth
                    // console.log('domElement.scrollLeft - isToLeft', domElement.scrollLeft)
                }

                resultLast = domElement.scrollLeft
                // console.log('resultLast - outto : ', resultLast);

                isTimeToChanged = resultPrev === resultLast ? true : false
                isToRight = isTimeToChanged ? !isToRight : isToRight
                // console.log('isTimeToChanged', isTimeToChanged);
                // console.log('isToRight', isToRight);
                // console.log('-----------------------------------------------');
            }, 66)
        }

        // 鼠标悬浮在上面时清除浮动
        function clearScrollLeftOrRight () {
            clearInterval(autoScrollLeftOrRightTimer)
        }

    </script>

</body>
</html>

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐