首页 > web前端 > js教程 > 正文

jQuery:mouseenter事件和mouseleave事件造成闪烁的问题

黄舟
发布: 2017-06-28 10:11:03
原创
3540人浏览过

大家好。今天我在做一个图片放大镜的jquery插件。类似于京东上那种商品图片的放大镜。

我发现我在image对象上绑定了mouseenter和mouseleave后,当鼠标在image上移动是会同时触发mouseenter和mouseleave,造成了闪烁。可是我并不期望mouseenter, mouseleave被反复调用,甚至是同时发生。应该如何解决呢?尝试了网上的几种方法都不太可行。

多谢各位。

$.fn.magnify = function() {
    //var glassBox = options.glassBox || {};
    //var detailBox = options.detailBox || {};

    var glassBox = $('<span></span>');

    glassBox.css({
        "width": this.width() / 2 + 'px',
        "height": this.height() /2 + 'px',
        "background-color": 'grey',
        "position": "absolute",
        "left" : '0px',
        "top": '0px',
        'opacity': '0.2',
        'display': 'none',
        'border': '1px solid blue',
        'z-index': 10

    });

    $(this).after(glassBox);
    //glassBox.hide();

    var detailBox = $('<div></div>');
    var detailImage = $('@@##@@</img>');
    
    detailBox.css({
        "width": this.width(),
        "height": this.height(),
        "display": 'none',
        "position": 'relative',
        "overflow": 'hidden'
        //"background-color": 'lime'
    });
    detailImage.css({
        "position": 'absolute'
    });
    detailImage.attr("src", this.attr("src"));
    detailBox.append(detailImage);
    this.after(detailBox);


    this.mouseenter(function(event){
        //event.stopPropagation();
        glassBox.get(0).style.display = 'block';
        detailBox.get(0).style.display = 'block';
        
        

    });
    this.mouseleave(function(event){    
        //event.stopPropagation();
        if (event.relatedTarget !== "span") {
            glassBox.get(0).style.display = 'none';
        detailBox.get(0).style.display = 'none';
        }
        
    });

    this.mousemove(function(event) {
        /* Act on the event */
        var x = event.pageX - this.offsetLeft - glassBox.width() / 2;
        var y = event.pageY - this.offsetTop - glassBox.height() /2;
        if (x < 0 ) {
            x = 0;
        } else if ( x > this.offsetWidth - glassBox.width()) {
            x = this.offsetWidth - glassBox.width();
        }
        if (y < 0) {
            y = 0;
        } else if (y > this.offsetHeight - glassBox.height()) {
            y = this.offsetHeight - glassBox.height();
        }
        glassBox.css({
            left: x + 'px',
            top:  y + 'px'
        });

        detailImage.css({
        "left": -3.5 * (event.pageX - this.offsetLeft) + 'px',
        "top": -3.5 * (event.pageY - this.offsetTop) + 'px'
    });
    });
}
登录后复制

HTML如下:

<html>
    <head>
        <script src="jquery-1.11.3.js"></script>
        <script src="magnify.js"></script>
    </head>
    <style>
        #imgTarget{
            width: 300px;
            height: 200px;
        }
        #imageArea{
            position: relative;
        }
    </style>
    <body>
        <div id="imageArea">
            @@##@@
        </div>

        <script>
            $( document ).ready( function(){
                $("#imgTarget").magnify();
            } );

        </script>


    </body>


</html>
登录后复制

闪烁的原因是这样的:

你把mouseenter mouseleave事件绑定在了img上面

mouseenter img时,你又生成了一个glassBox

glassBox在img的上层,于是挡住了img和鼠标光标,于是产生了一个对于img的mouseleave

于是代码又把glassBox display=none了,mouse又能重新enter到img了

解决方案1
不是用mouseenter mouseleave,直接在mousemove里面对鼠标的位置是否在img的范围内进行判断。

解决方案2
创建一个覆盖层,和img一样大小:

<div id="imageArea">
 @@##@@
 <div id="overlay"></div>
</div>
登录后复制
#overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 300px;
  height: 200px;
  background: red;
  opacity: 0.5;
  z-index: 3;
}
登录后复制

保证img glassBox overlay的z-index顺序:

glassBox.css({
        "width": this.width() / 2 + 'px',
        "height": this.height() /2 + 'px',
        "background-color": 'grey',
        "position": "absolute",
        "left" : '0px',
        "top": '0px',
        'opacity': '0.2',
        'display': 'none',
        'border': '1px solid blue',
        'z-index': 2 // 保证glassBox在overlay的下面,在img的上面
    });
登录后复制

事件都绑定在overlay上面:

$( document ).ready( function(){
    $("#overlay").magnify(); 
} );
登录后复制
jQuery:mouseenter事件和mouseleave事件造成闪烁的问题jQuery:mouseenter事件和mouseleave事件造成闪烁的问题jQuery:mouseenter事件和mouseleave事件造成闪烁的问题

以上就是jQuery:mouseenter事件和mouseleave事件造成闪烁的问题的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号