当前位置: 首页 > article >正文

HTML+JS+CSS 鼠标上下移动页面(非滚动条)

HTML+JS+CSS 鼠标上下移动页面(非滚动条)

<!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>Mouse Drag Scroll - IE11 Compatible</title>
    <style>
        body {
            height: 2000px;
            /* 为了方便测试滚动效果,设置一个较长的页面 */
            /* 使用自定义的鼠标指针图片,这里假设图片名为 grab.cur */
            cursor: url('file:///C:/grab.cur'), default;
        }

        /* 定义按下鼠标左键时的鼠标指针样式 */
        body.dragging {
            /* 使用自定义的鼠标指针图片,这里假设图片名为 grabbing.cur */
            cursor: url('file:///C:/grabbing.cur'), default;
        }
    </style>
</head>

<body>
    <!-- 这里可以添加具体的页面内容 -->
    <h1>鼠标拖动滚动页面示例 - 兼容 IE11</h1>
    <script>
        // 定义变量来跟踪鼠标状态和初始位置
        var isDragging = false;
        var startY = 0;
        var initialScrollTop = 0;
        var body = document.body;

        // 获取文档对象
        var doc = document.documentElement || document.body;

        // 监听鼠标按下事件
        if (document.attachEvent) {
            document.attachEvent('onmousedown', mouseDownHandler);
        } else {
            document.addEventListener('mousedown', mouseDownHandler);
        }

        function mouseDownHandler(event) {
            event = event || window.event;
            // 只有按下鼠标左键时才进行操作
            if ((event.which && event.which === 1) || (event.button && event.button === 1)) {
                // 判断是否点击在滚动条上
                if (isClickOnScrollbar(event)) {
                    return; // 如果点击在滚动条上,不执行后续拖动逻辑
                }
                isDragging = true;
                // 记录鼠标按下时的垂直位置
                startY = event.clientY;
                // 记录当前页面的滚动位置
                initialScrollTop = doc.scrollTop;
                // 添加 dragging 类,改变鼠标指针样式
                addClass(body, 'dragging');
            }
        }

        // 判断鼠标是否点击在滚动条上
        function isClickOnScrollbar(event) {
            // 获取窗口宽度
            var windowWidth = window.innerWidth;
            // 获取文档元素宽度
            var docWidth = doc.clientWidth;
            // 计算滚动条宽度
            var scrollbarWidth = windowWidth - docWidth;
            // 判断鼠标点击的水平位置是否在滚动条范围内
            return event.clientX >= windowWidth - scrollbarWidth;
        }

        // 监听鼠标移动事件
        if (document.attachEvent) {
            document.attachEvent('onmousemove', mouseMoveHandler);
        } else {
            document.addEventListener('mousemove', mouseMoveHandler);
        }

        function mouseMoveHandler(event) {
            event = event || window.event;
            if (isDragging) {
                // 计算鼠标垂直移动的距离
                var deltaY = event.clientY - startY;
                // 根据鼠标移动距离来滚动页面
                doc.scrollTop = initialScrollTop - deltaY;
            }
        }

        // 监听鼠标松开事件
        if (document.attachEvent) {
            document.attachEvent('onmouseup', mouseUpHandler);
        } else {
            document.addEventListener('mouseup', mouseUpHandler);
        }

        function mouseUpHandler() {
            // 停止拖动状态
            isDragging = false;
            // 移除 dragging 类,恢复鼠标指针样式
            removeClass(body, 'dragging');
        }

        // 监听鼠标离开窗口事件,防止鼠标移出窗口后仍在拖动
        if (document.attachEvent) {
            document.attachEvent('onmouseleave', mouseLeaveHandler);
        } else {
            document.addEventListener('mouseleave', mouseLeaveHandler);
        }

        function mouseLeaveHandler() {
            isDragging = false;
            // 移除 dragging 类,恢复鼠标指针样式
            removeClass(body, 'dragging');
        }

        // 兼容 IE11 的添加类名函数
        function addClass(element, className) {
            if (element.className.indexOf(className) === -1) {
                if (element.className === '') {
                    element.className = className;
                } else {
                    element.className += ' ' + className;
                }
            }
        }

        // 兼容 IE11 的移除类名函数
        function removeClass(element, className) {
            var classNames = element.className.split(' ');
            var newClassNames = [];
            for (var i = 0; i < classNames.length; i++) {
                if (classNames[i] !== className) {
                    newClassNames.push(classNames[i]);
                }
            }
            element.className = newClassNames.join(' ');
        }
    </script>
</body>

</html>


http://www.kler.cn/a/561053.html

相关文章:

  • 异步联邦学习的动态隐私保护框架:重构边缘智能的数据安全边界
  • C#中开发OCR应用时,以下是一些推荐的开源库和工具
  • Android 老项目 jcenter 库失效
  • springBoot统一响应类型2.0版本
  • 力扣3102.最小化曼哈顿距离
  • vue 3D 翻页效果
  • 使用 金南瓜EAP库 进行 二次开发与半导体厂家进行通讯源码
  • 基于云的物联网系统用于实时有害藻华监测:通过MQTT和REST API无缝集成ThingsBoard
  • DeepSeek开源FlashMLA:颠覆大模型训练效率的新一代技术解析
  • 蓝桥杯第十六届嵌入式模拟编程题解析
  • 2 算法1-2 明明的随机数
  • redis---字符串SDS(简单动态字符串)底层结构
  • 【无人集群系列---无人机集群编队算法】
  • 免填邀请码工具:赋能六大核心场景,重构App增长新模型
  • 故障诊断 | DCS差异创意搜索算法优化CatBoost故障诊断(MatlabPython)
  • 微软量子芯片引领人工智能革命,开启计算新纪元
  • 算法日记27:完全背包(DFS->记忆化搜索->倒叙DP->顺序DP->空间优化)
  • 当G1机器人跳出“丝滑舞步“:算力+AI 催生具身智能
  • 鸿蒙系统-同应用跨设备数据同步(分布式功能)
  • 【SQLI】sqlmap Tamper 脚本分类总结