好像有点问题啊

好像有点问题啊

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin:0;
            padding: 0;
        }
        #main{
            width:200px;
            height:200px;
            background: yellow;
            position: absolute;
            top:100px;
            left:100px;
            -webkit-user-select: none;
        }
    </style>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
    <div id="main">
        我能被拖动
    </div>
    <script type="text/javascript">
        
    // 此处写代码
        var isMouseDown=false;
        var lastPoint={};
        var main=$("#main");
        
        main.on("mousedown",function(e){
            isMouseDown=true;
            lastPoint.x=e.pageX;
            lastPoint.y=e.pageY;
        })
        $(document).on("mousemove",function(e){
            if(isMouseDown){
                    var targetX=parseInt(main.css("left"))+e.pageX-lastPoint.x;
                    var targetY=parseInt(main.css("top"))+e.pageY-lastPoint.y;
                    
                    if(targetX<=0){
                        main.css("left",0);
                    }else if(targetX>=$(document.body).width()-main.innerWidth()){
                        main.css("left",$(document.body).width()-main.innerWidth()+"px");
                    }else{
                        main.css("left",targetX+"px");
                    } 
                    
                    if(targetY<=0){
                        main.css("top",0);
                    }else if(targetY>=$(document.body).height()-main.innerHeight()){
                        main.css("top",$(document.body).height()-main.innerHeight()+"px");
                    }else{
                        main.css("top",targetY+"px");
                    }
                     
                    lastPoint.x=e.pageX;
                    lastPoint.y=e.pageY;
                    
            }
        }).on("mouseup",function(e){
            isMouseDown=false;
            lastPoint={};
        })
        
        console.log($("#main").innerHeight());
    </script>
</body>
</html>

怎么一直在闪,感觉代码没啥问题啊

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

1、发生抖动的原因分析:

(1)首先我们需要知道,我们的拖拽元素是在可视区域内进行拖拽的

(2)接下来,来看两组代码:

$(document.body).width()获取的是浏览器当前窗口文档body的宽度
$(document.body).height()获取的是浏览器当前窗口文档body的高度

这里的body的高度可以理解成是由被拖拽元素撑开的,并不是可视区域的高度哦

$(window).width()获取的是浏览器当前窗口可视区域的宽度
$(window).height()获取的是浏览器当前窗口可视区域的高度

所以,发生抖动的主要是因为如下代码的问题导致的,将$(document.body).width()、$(document.body).height()分别修改成$(window).width()和$(window).height(),让浏览器能够正确判断元素是否是在可视区域内被拖拽即可解决抖动问题

举个不太恰当的小例子,比如我让你帮我买一瓶牛奶,但是没有准确告诉你买哪一个品牌的,这个时候你就会很犹豫、很纠结不知道买哪一个好,$(document.body).width()和$(document.body).height()就类似这种情况,因为没有给body设置固定的宽度和高度,这就导致浏览器没办法准确的判断被拖拽元素的活动范围和停靠边界,不知道到底该在哪里停靠;而如果我告诉你帮我买一瓶伊利的牛奶,你就会迅速、准确的进行购买,$(window).width()和$(window).height()就类似这种情况,准确的告知浏览器被拖拽元素在当前窗口可视区域范围活动,这个时候,浏览器就能准确的判断元素到底能在哪个区域活动,在哪里进行停靠了

http://img1.sycdn.imooc.com//climg/5d4cd82400013a3f17740725.jpg

1、从代码的规范性上来讲,如果为了方式鼠标移动过快导致元素跟不上的问题,那么建议将所有的事件都绑定在document上,而不是单独将mousemove绑定在document上,当然,只将mousemove绑定在document上也能实现效果,只是不够规范。

http://img1.sycdn.imooc.com//climg/5d4cd11f0001bd3609300434.jpg

2、关于if判断条件,不是必须设置成<和>=,只是从代码性能和规范上来讲,<=和>=都有=,实际上是没有必要的,两者只有一个条件进行判断=这种情况即可

3、判断中的位置是设置边界位置的,也就是防止元素被拖拽到可视区域范围以外,也就是控制拖拽不超出可视范围的,判断中的位置点设置的目的是防止如下这种情况的出现:

http://img1.sycdn.imooc.com//climg/5d4cd2850001a32e14440882.jpg

http://img1.sycdn.imooc.com//climg/5d4cd25f0001d04e19200522.jpg

http://img1.sycdn.imooc.com//climg/5d4cd26f00012cd319111037.jpg

而下列这段代码是设置可视区域内的拖拽元素的位置

http://img1.sycdn.imooc.com//climg/5d4cd2d30001c46004020087.jpg

同学可以结合代码仔细梳理一下思路哦,再理解一下哦

希望可以帮到你!

  • 光aaaaand影 提问者 #1
    哇,谢谢老师,老师讲的真详细,我明白了,但是为什么我打印出来的$(document.body).height()是0呢?
    2019-08-10 10:01:40
卡布琦诺 2019-08-10 10:24:34

打印$(document.body).height()为0,是因为给body的子元素设置了绝对定位,绝对定位元素会脱离文档流,当注释掉绝对定位时,也就是让main回归到正常的文档流中撑开父元素body的高度,会发现可以正常打印出200px

http://img1.sycdn.imooc.com//climg/5d4e2a6c00018cb416080858.jpg

希望可以帮到你!

  • 提问者 光aaaaand影 #1
    嗯,明白了,谢谢老师
    2019-08-11 08:02:03
卡布琦诺 2019-08-08 10:52:26

1、同学的mousemove事件绑定的位置是不够严谨的,不太符合代码规范

2、缺少被拖拽元素的位置设置

3、边界if判断条件不够规范

http://img1.sycdn.imooc.com//climg/5d4b8e2f0001549014660980.jpg

希望可以帮到你!

  • 提问者 光aaaaand影 #1
    还是有点晕,我还是不知道自己的代码哪儿有问题。 1.之前在一个回答里看过,如果将mousemove事件绑定在被拖拽的元素上,鼠标移动过快的话,元素会跟不上,所以将mousemove事件绑定在文档上。 2.老师,我在if,else if和else中都分别设置了被拖拽元素的位置啊。 3.至于判断条件,targetX<=0和targetX>=$(document.body).width()-main.innerWidth()并不冲突啊 啊啊啊啊好晕啊,求老师解答
    2019-08-09 07:50:13
卡布琦诺 2019-08-02 16:18:48

老师帮你调整了一下,同学可以参考一下:

http://img1.sycdn.imooc.com//climg/5d4b8e840001c03c15170926.jpg

希望可以帮到你!

  • 提问者 光aaaaand影 #1
    但是老师我不明白为什么我的一直在闪呢
    2019-08-08 08:50:55
  • 提问者 光aaaaand影 #2
    我想知道自己的问题出在哪儿
    2019-08-08 08:54:04
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
组件化思想开发电商网页 18版
  • 参与学习           人
  • 提交作业       467    份
  • 解答问题       4826    个

本路径带你通过系统学习HTML5、JavaScript、jQuery的进阶知识,不仅如此,还会学习如何利用组件化的思想来开发网页,知识点+案例,使得所学可以更好的得到实践。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师