div鼠标移入移出的方向判断

本文介绍了一个使用HTML、CSS和JavaScript实现的鼠标悬停方向检测功能。当鼠标进入指定元素时,可以判断出鼠标是从哪个方向进入,并显示相应的提示。此功能通过计算鼠标的相对位置并利用数学函数确定其相对于元素中心的方向。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div {
            width: 600px;
            height: 600px;
            background: red;

            margin: 50px auto;
        }
    </style>


    <script>
        window.onload = function () {
            var gaga = function (wrap) {
                var wrap = document.getElementById(wrap);
                var hoverDir = function (e) {
                        //取得对象的宽高
                    var w = wrap.offsetWidth,
                        h = wrap.offsetHeight,

                        /**
                         * 解释:
                         *      x = (e.clientX - (wrap.offsetLeft + ( w / 2 ))) * ( w > h ? ( h / w ) : 1)
                         *      y = (e.clientY - (wrap.offsetTop + (h / 2))) * (h > w ? (w / h) : 1)
                         *
                         *      wrap.offsetLeft + ( w / 2 )和wrap.offsetTop + (h / 2)  将坐标原点转移到对象的中心点上
                         *      w > h ? ( h / w ) : 1和 h > w ? (w / h) : 1  将矩形校正为正方形
                         *
                         * 如:
                         *      一个长8宽6的矩形,将(0,0)坐标移动到该矩形的中心点后,则:四个顶点的坐标是(-4,3),(4,3),(4,-3),(-4,-3)
                         *      通过校正方法校正后的坐标是:(-3,3),(3,3),(3,-3),(-3,-3);同理,矩形框里的所有左边都变到了校正后的正方形上;
                         */
                        x = (e.clientX - (wrap.offsetLeft + ( w / 2 ))) * ( w > h ? ( h / w ) : 1),
                        y = (e.clientY - (wrap.offsetTop + (h / 2))) * (h > w ? (w / h) : 1),

                        /**
                         *解释:
                         *      Math.round(( ( ( Math.atan2(y, x) * ( 180 / Math.PI ) ) + 180 ) / 90) + 3) % 4
                         *
                         *      Math.atan2(y,x): -PI 到 PI 之间的值,是从 X 轴正向逆时针旋转到点 (x,y) 时经过的弧度。
                         *      弧度与角度转换的公式:
                         *             弧度=角度乘以π后再除以180,    
                         *             角度=弧度除以π再乘以180 
                         *      ( Math.atan2(y, x) * ( 180 / Math.PI ): 将弧度转成角度.
                         *
                         *      +180: 因为在原来的坐标系中,角度范围是(-180,180);这里+180 是为了变成(0,360),以便后面的计算;
                     *   *           console.log('Math.atan2(12,12)....'+Math.atan2(12,12)/(Math.PI/180));    //Math.atan2(12,12)....45
                         *           console.log('Math.atan2(0,12)....'+Math.atan2(12,-12)/(Math.PI/180));    //Math.atan2(0,12)....135
                         *           console.log('Math.atan2(-12,12)....'+Math.atan2(-12,-12)/(Math.PI/180)); //Math.atan2(-12,12)....-135
                         *           console.log('Math.atan2(-12,12)....'+Math.atan2(-12,12)/(Math.PI/180));  //Math.atan2(-12,12)....-45
                         *           console.log('Math.atan2(0,-12)....'+Math.atan2(0,-12)/(Math.PI/180));    //Math.atan2(0,-12)....180
                         *           console.log('Math.atan2(0,12)....'+Math.atan2(0,12)/(Math.PI/180));      //Math.atan2(0,12)....0
                         *
                         *      /90:  因为对象通过校正变成正方形,正方形的对角线将对对象分成四个区域,且对角线的夹角是直角,
                         *
                         *      +3 : 只要知道我们角度区间是从右上方开始算起的,然后顺时针计算的就可以了。该作者想要将结果显示的顺序是 上右下左,所以加三就是将第一区间变成上。
                         *
                         *      Math.round() : 四舍五入.比如计算下0-90中任何一个数除于除于90,我们可以得到 0~1之间的数,如果加个四舍五入呢?那么结果就只有0和1了,刚好45度角是我们分割线。
                         *
                         *      %4 : 保证结果是0、1、2、3 之间的一个(分别代表上、右、下、左)。
                         *
                         */

                        // 上(0) 右(1) 下(2) 左(3)
                        direction = Math.round(( ( ( Math.atan2(y, x) * ( 180 / Math.PI ) ) + 180 ) / 90) + 3) % 4,
                        eventType = e.type,
                        dirName = new Array('上方', '右侧', '下方', '左侧');
                    if (eventType == 'mouseover' || eventType == 'mouseenter') {
                        wrap.innerHTML = dirName[direction] + '进入';
                    } else {
                        wrap.innerHTML = dirName[direction] + '离开';
                    }
                }
                if (window.addEventListener) {
                    wrap.addEventListener('mouseover', hoverDir, false);
                    wrap.addEventListener('mouseout', hoverDir, false);
                } else if (window.attachEvent) {
                    wrap.attachEvent('onmouseenter', hoverDir);
                    wrap.attachEvent('onmouseleave', hoverDir);
                }
            }
            gaga('div');
        }
    </script>

</head>
<body>
<div id="div"></div>
</body>
</html>
### 实现 DIV 元素鼠标移入移出事件 #### 利用 jQuery 处理鼠标移入移出效果 通过 `hover` 方法能够简便地为指定元素绑定两个处理函数,分别对应鼠标的进入和离开动作。当指针滑过目标区域时触发第一个回调函数执行相应操作;一旦光标退出该范围,则激活第二个参数所设定的动作。 ```javascript $("div").hover( function(){ $(this).css("background-color", "yellow"); // 鼠标移入的效果 }, function(){ $(this).css("background-color", ""); // 鼠标移出时恢复原状 } ); ``` 此段代码展示了如何改变背景颜色作为视觉反馈[^1]。 #### 解决 Vue.js 组件内的闪烁问题 针对在Vue组件中应用 `@mouseenter` 和 `@mouseleave` 导致的画面抖动情况,建议采用 CSS 属性 `pointer-events:none;` 来阻止特定层面上交互行为的发生,从而避免不必要的重绘过程影响用户体验。不过需要注意的是,在实际开发过程中应谨慎设置此样式以免造成其他意料之外的结果[^2]。 #### 自定义表格滚动控制逻辑 在一个基于 Vue 的项目里构建带有自定义滚动条功能的数据展示表单时,可以通过监听用户的输入(即鼠标的进出),动态调整定时器的状态来达到暂停/重启自动滚屏的目的。下面给出了一种可能的技术方案: ```html <div id="custom-table"> <!-- 表格内容 --> </div> ``` ```less #custom-table { overflow-y: auto; } ``` ```javascript const tableElement = document.getElementById('custom-table'); let scrollInterval; // 定义滚动方法... tableElement.addEventListener('mouseenter', stopScrolling); tableElement.addEventListener('mouseleave', startScrolling); function stopScrolling() { clearInterval(scrollInterval); } function startScrolling() { scrollInterval = setInterval(() => { // 执行滚动... }, 1000 / 60); // 假设每秒更新六十次位置 } ``` 上述例子说明了怎样利用 JavaScript 控制 DOM 节点的行为以响应不同的用户活动[^3]。 #### 文字横向循环无缝滚动并支持鼠标互动 为了创建一段可以在容器内水平方向上持续流动的文字序列,并允许访问者临时中断这一进程,可以借助纯 CSS 动画配合少量脚本完成需求。具体做法如下所示: ```html <div class="scrolling-text"><span>这是一些不断向左移动的文字...</span></div> ``` ```css .scrolling-text { white-space: nowrap; overflow: hidden; } .scrolling-text span { display: inline-block; padding-left: 100%; animation: moveText linear infinite; } .paused span { animation-play-state: paused !important; } @keyframes moveText { from { transform: translateX(0);} to {transform: translateX(-100%);} } ``` ```javascript const textContainer = document.querySelector('.scrolling-text'); textContainer.addEventListener('mouseover', pauseAnimation); textContainer.addEventListener('mouseout', resumeAnimation); function pauseAnimation(event){ event.target.classList.add('paused'); } function resumeAnimation(event){ event.target.classList.remove('paused'); } ``` 这段程序实现了文字流式的平滑过渡以及即时响应用户指令的能力[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值