首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在触摸事件后移动div

在触摸事件后移动div
EN

Stack Overflow用户
提问于 2017-04-11 22:18:33
回答 1查看 1.1K关注 0票数 0

我正在尝试在一些矩形div的圆周上产生一个运动。我希望如果一个div被拖动到另一个div附近,那么第二个div会移动到用户正在拖动的第一个div中。有没有插件可以做到这一点,或者我需要生成一些东西来计算2个div的位置。而且,矩形div也可以是10 div而不只是2。

这是我的解决方案。

代码语言:javascript
复制
<html>
<head>
    <style type="text/css">
        div#dynamic-container{width:400px; height:400px; background-color: lightgoldenrodyellow; position:relative; border: 1px solid black;}
        div#innerCircle{width: 380px; height: 380px; position: absolute; left: 10px; top:10px; background-color: lightcoral;
                        border-radius:190px; -moz-border-radius: 190px; -webkit-border-radius: 190px;}           
        div.marker{width: 20px; height:20px; background: black; position:absolute; left:195px; cursor: pointer;
                    -moz-transform:rotate(45deg);
                    -moz-transform-origin:5px 200px;

                    transform:rotate(45deg);
                    transform-origin:5px 200px;                          

                    -ms-transform:rotate(45deg);
                    -ms-transform-origin:5px 200px;                                

                    -webkit-transform:rotate(45deg);
                    -webkit-transform-origin:5px 200px;                       

                    z-index:17;
        } 
    </style>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

    <script src="/lib/jquery.overlaps.js" type="text/javascript" charset="utf-8"></script>




    <script type="text/javascript">
        function rotateAnnotationCropper(offsetSelector, xCoordinate, yCoordinate, cropper){
            //alert(offsetSelector.left);

            var x = xCoordinate - offsetSelector.offset().left - offsetSelector.width()/2;
            var y = -1*(yCoordinate - offsetSelector.offset().top - offsetSelector.height()/2);
            var theta = Math.atan2(y,x)*(180/Math.PI);        


            var cssDegs = convertThetaToCssDegs(theta);
            var rotate = 'rotate(' +cssDegs + 'deg)';
            cropper.css({'-moz-transform': rotate, 'transform' : rotate, '-webkit-transform': rotate, '-ms-transform': rotate});
            $('body').on('mouseup', function(event){ $('body').unbind('mousemove')});

        }

        function convertThetaToCssDegs(theta){
            var cssDegs = 90 - theta;
            return cssDegs;
        }

        $(document).ready(function(){                


            //$('.marker-1').draggable();

            var items = $('#dynamic-container').find('.marker');
            var i = 0;
            var cssDegs = 15;
            var rotate = 'rotate(' +cssDegs + 'deg)';

            for (i; i<items.length; i++){
                if(i == 0){
                    cssDegs = cssDegs*i;
                }else{
                    cssDegs = cssDegs+20;
                }

                console.log("cssDegs: "+cssDegs);
                rotate = 'rotate(' +cssDegs + 'deg)';
                //Imposto i gradi a tutti i punti per differenziarli al document ready
                $(items[i]).css({'-moz-transform': rotate, 'transform' : rotate, '-webkit-transform': rotate, '-ms-transform': rotate});
                //items[i].css("background-color","blue"); 
            }

            console.log(items);               

            $('.marker').on('mousedown', function(){
                $('body').on('mousemove', function(event){
                    //rotateAnnotationCropper($('#innerCircle').parent(), event.pageX,event.pageY, $('.marker'));
                    //rotateAnnotationCropper($('#innerCircle').parent(), event.pageX,event.pageY, $(event.target)); 
                    rotateAnnotationCropper($('#innerCircle').parent(), event.pageX,event.pageY, $(this).find('.marker-1')); 


                    var markers = $(this).find('.marker');
                    var over = overlap(markers[0],$('#container'));
                    if(markers[0] != over){
                        console.log($(markers[0]));
                        console.log(over);
                    }else{
                        console.log('not over');
                    }   

                });                                        
            });

            $('body').on('mouseup', function(event){ $('body').unbind('mousemove')});                     
        });

        function overlap (div1, div2){
            var res = $(div1).overlaps($(div2));
            return res;                
        }  

    </script>

</head>
<body>
    <div id="container">
        <div id ="dynamic-container">
            <div class ="marker marker-1"></div>
            <div class ="marker marker-2"></div>
            <div id ="innerCircle"></div>
        </div>                
    </div>  
</body>

此时,这段代码会生成一个包含2个div的圆。可以在圆圈边界上移动的。我希望如果div用户拖动一个div,当拖动的div接触到另一个div时,它们会一起移动。我尝试使用jQuery重叠库来获取两个div是否重叠,但我做错了一些事情。

提前谢谢。你能推荐的每一个库都被广泛接受

EN

回答 1

Stack Overflow用户

发布于 2017-04-11 22:27:05

编辑:

一个更完整的例子是你的例子:

工作JSFiddle:https://jsfiddle.net/mcbo9bs3/

代码语言:javascript
复制
        function rotateAnnotationCropper(offsetSelector, xCoordinate, yCoordinate, cropper){
            //alert(offsetSelector.left);

            var x = xCoordinate - offsetSelector.offset().left - offsetSelector.width()/2;
            var y = -1*(yCoordinate - offsetSelector.offset().top - offsetSelector.height()/2);
            var theta = Math.atan2(y,x)*(180/Math.PI);        


            var cssDegs = convertThetaToCssDegs(theta);
            var rotate = 'rotate(' +cssDegs + 'deg)';
            cropper.css({'-moz-transform': rotate, 'transform' : rotate, '-webkit-transform': rotate, '-ms-transform': rotate});
            $('body').on('mouseup', function(event){ $('body').unbind('mousemove')});

        }

        function convertThetaToCssDegs(theta){
            var cssDegs = 90 - theta;
            return cssDegs;
        }

        $(document).ready(function(){                


            //$('.marker-1').draggable();

            var items = $('#dynamic-container').find('.marker');
            var i = 0;
            var cssDegs = 15;
            var rotate = 'rotate(' +cssDegs + 'deg)';

            for (i; i<items.length; i++){
                if(i == 0){
                    cssDegs = cssDegs*i;
                }else{
                    cssDegs = cssDegs+20;
                }

                console.log("cssDegs: "+cssDegs);
                rotate = 'rotate(' +cssDegs + 'deg)';
                //Imposto i gradi a tutti i punti per differenziarli al document ready
                $(items[i]).css({'-moz-transform': rotate, 'transform' : rotate, '-webkit-transform': rotate, '-ms-transform': rotate});
                //items[i].css("background-color","blue"); 
            }

            console.log(items);               

            $('.marker').on('mousedown', function(){
                $('body').on('mousemove', function(event){
                    //rotateAnnotationCropper($('#innerCircle').parent(), event.pageX,event.pageY, $('.marker'));
                    //rotateAnnotationCropper($('#innerCircle').parent(), event.pageX,event.pageY, $(event.target)); 
                    rotateAnnotationCropper($('#innerCircle').parent(), event.pageX,event.pageY, $(this).find('.marker-1')); 
                    var markers = $(this).find('.marker');
                });                                        
            });

            $('body').on('mouseup', function(event){ $('body').unbind('mousemove')});                     
        }); 

window.setInterval(function() {
    $('#result').text(collision($('.marker-1'), $('.marker-2')));
}, 200);


function collision($div1, $div2) {
      var x1 = $($div1).offset().left;
      var y1 = $($div1).offset().top;
      var h1 = $($div1).outerHeight(true);
      var w1 = $($div1).outerWidth(true);
      var b1 = y1 + h1;
      var r1 = x1 + w1;
      var x2 = $($div2).offset().left;
      var y2 = $($div2).offset().top;
      var h2 = $($div2).outerHeight(true);
      var w2 = $($div2).outerWidth(true);
      var b2 = y2 + h2;
      var r2 = x2 + w2;

      if (b1 < y2 || y1 > b2 || r1 < x2 || x1 > r2) return false;
      return true;
    }

要检测重叠,这段代码应该可以工作:

代码语言:javascript
复制
function collision($div1, $div2) {
      var x1 = $($div1).offset().left;
      var y1 = $($div1).offset().top;
      var h1 = $($div1).outerHeight(true);
      var w1 = $($div1).outerWidth(true);
      var b1 = y1 + h1;
      var r1 = x1 + w1;
      var x2 = $($div2).offset().left;
      var y2 = $($div2).offset().top;
      var h2 = $($div2).outerHeight(true);
      var w2 = $($div2).outerWidth(true);
      var b2 = y2 + h2;
      var r2 = x2 + w2;

      if (b1 < y2 || y1 > b2 || r1 < x2 || x1 > r2) return false;
      return true;
    }

您可以将其应用于您的代码(替换重叠函数)。

希望它能帮上忙!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43348611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档