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

news/2025/2/25 16:21:02
htmledit_views">

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

html"><!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.niftyadmin.cn/n/5865701.html

相关文章

基于SpringBoot的线上景区订票系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

让Word插上AI的翅膀:如何把DeepSeek装进Word

在日常办公中&#xff0c;微软的Word无疑是我们最常用的文字处理工具。无论是撰写报告、编辑文档&#xff0c;还是整理笔记&#xff0c;Word都能胜任。然而&#xff0c;随着AI技术的飞速发展&#xff0c;尤其是DeepSeek的出现&#xff0c;我们的文字编辑方式正在发生革命性的变…

图论算法篇:BFS宽度优先遍历

那么bfs算法的大名想必大家都一定听闻过&#xff0c;那么也许有的人在认识我们bfs算法之前是先接触的我们的dfs算法&#xff0c;那么目前我们的算法世界中的两种搜索算法就是我们的dfs和我们的bfs&#xff0c;那么废话不多说&#xff0c;就让我们进入bfs算法的学习 BFS算法原理…

安全面试5

文章目录 sql的二次注入在linux下&#xff0c;现在有一个拥有大量ip地址的txt文本文档&#xff0c;但是里面有很多重复的&#xff0c;如何快速去重&#xff1f;在内网渗透中&#xff0c;通过钓鱼邮件获取到主机权限&#xff0c;但是发现内网拦截了tcp的出网流量&#xff0c;聊一…

机器学习基础入门——机器学习库介绍(NumPy、pandas、Matplotlib)

机器学习库介绍&#xff08;NumPy、pandas、Matplotlib&#xff09; 在 Python 机器学习的领域中&#xff0c;NumPy、pandas 和 Matplotlib 是三个不可或缺的基础库。它们分别在数值计算、数据处理与分析以及数据可视化方面发挥着关键作用&#xff0c;极大地提升了开发效率与数…

AI agent(以AutoGPT为例)和AI Workflow 区别

AutoGPT 介绍 Auto GPT是基于大型语言模型&#xff08;LLM&#xff09;的自主AI代理&#xff0c;能够连接互联网并自主规划执行复杂任务。 关键特征 无缝集成与低代码工作流&#xff1a;无需大量编码知识即可快速创建复杂工作流。 自主运行与持续代理&#xff1a;部署基于云…

2025年2月科技热点深度解析:AI竞赛、量子突破与开源革命

引言 2025年的科技领域持续呈现爆发式增长&#xff0c;AI大模型竞争白热化、量子计算商业化加速、开源工具生态繁荣成为本月最受关注的议题。本文结合最新行业动态&#xff0c;从技术突破、商业布局到开发者生态&#xff0c;全面解析当前科技热点&#xff0c;为读者提供深度洞…

P8615 [蓝桥杯 2014 国 C] 拼接平方数

题目描述 小明发现 49 很有趣&#xff0c;首先&#xff0c;它是个平方数。它可以拆分为 4 和 9&#xff0c;拆分出来的部分也是平方数。169 也有这个性质&#xff0c;我们权且称它们为&#xff1a;拼接平方数。 100 可拆分 1,00&#xff0c;这有点勉强&#xff0c;我们规定&a…