元素的点击拖动事件

Reading time ~8 minutes

创建canvas对象,实现拖动功能

本次的分享主要涉及到canvas的创建和鼠标事件的处理,要实现的效果是创建canvas标签,并通过鼠标事件拖动元素

1.首先在页面上创建一个框div,命名为Canvas,代表里面的元素都是canvas标签的元素

1.1 html页面

     <div id="Canvas"></div>
   

1.2 css样式

    html,
    body {
        width: 100%;
        height: 100%;
        margin: 0;
        padding: 0;
        background-color: #999;
    }
    #Canvas {
        width: 100%;
        height: 100%;
    }
  
    //定义canvas为浮动元素,用于鼠标点击移动
   
    canvas{
        position: absolute;
    }
    

2.其次,在Canvas中创建canvas标签,获取当前Canvas的元素,通过参数传递,将canvas标签作为Canvas的子标签,并定义其位置;

2.1 初始化定义

    //'box1'代表的是创建元素的id,50代表半径和xy坐标

    init('box1', 50);

    

2.2 函数定义

    function init(Box,radius) {
  
        creatBox(Box, radius);
        place('#'+Box);
        move('#' + Box);
    }
    
    function creatBox(Box,radius) {

        var Canvas = document.getElementById('Canvas');
       <!-- //创建元素-->
        var box = document.createElement('canvas');
        <!--//属性设置-->
        box.setAttribute('id', Box);
        box.setAttribute('width', radius*2);
        box.setAttribute('height', radius*2);
        <!--//作为子元素-->
        Canvas.appendChild(box);
       
       <!-- //绘制元素arc-->
        var boxContext = document.getElementById(Box).getContext('2d');

        boxContext.beginPath();
        boxContext.fillStyle = '#333';
        boxContext.arc(radius, radius, radius, 0, Math.PI * 2, false);
        boxContext.fill();
        boxContext.closePath();


    }
    
     function place(box){
     
     //设置定位的top值和left,在页面位置随机出现
       
        var positionTop=Math.random()*1000;
        
        var positionLeft=Math.random()*1000;
        
        $(box).css({
            top:positionTop,
            left:positionLeft
        })
    }
    

3.最后设置移动的功能,监听mousedown、mousemove、mouseup这三个鼠标事件,根据不同的位置让元素的位置进行移动;

移动move的函数定义

     function move(box) {
       <!-- //设置变量-->
        
        var mouseX, mouseY;
        var objX, objY;
        var isDowm = false; 
        
       <!-- //是否按下鼠标-->

    <!--   //当鼠标按下的时候,-->
       
        $(box).mousedown(function (e) {
    
            mouseX = e.clientX;
            mouseY = e.clientY;
            //元素原本的值
            objX = e.target.offsetLeft;
            objY = e.target.offsetTop;
            isDowm = true;
            console.log('mousedown:mouseX:' + mouseX, 'mouseY:' + mouseY);
            console.log('mousedown:objX:' + objX, 'objY:' + objY);

        });
        
        <!--//当鼠标移动的时候-->
        
        $(box).mousemove(function (e) {
            
            var x = e.pageX;
            var y = e.pageY;
            console.log('mousemove:x:' + x, 'y:' + y);
            if (isDowm) {

       <!-- //在鼠标移动的过程中,位置不断的发生改变-->

                $(this).css({
                    "top": parseInt(objY) + parseInt(y) - parseInt(mouseY) + "px",
                    "left": parseInt(objX) + parseInt(x) - parseInt(mouseX) + "px"
                });

            }
        });
        
       <!-- //当鼠标抬起的的时候-->
        
        $(box).mouseup(function (e) {
            if (isDowm) {

            <!--    //  .pageX,clientX,.offsetX这些属性提供了鼠标指针位置相对于页面的左上角的X和Y坐标,在鼠标抬起的时候,位置不再改变-->
                
                var x = e.pageX;
                var y = e.pageY;

                $(this).css({
                    "top": (parseInt(y) - parseInt(mouseY) + parseInt(objY)) + "px",
                    "left": (parseInt(x) - parseInt(mouseX) + parseInt(objX)) + "px"
                });

                isDowm = false;
            }
        });

    }
    

在设置鼠标移动的方法的时候,我使用了JQuery进行编写,通过参数的传递进行事件的触发。在操作的过程中,通过输出当前的x/y来判断是否事件有执行,不断调试之后出来的方法;

最主要的判断准则:parseInt(objY) + parseInt(y) - parseInt(mouseY),objY是代表最开始的y轴位置,y代表的是当前鼠标所在的y轴位置,mouseY是指当鼠标点击的时候在的位置,所以该表达式,是最开始的objY轴位置+(鼠标所在的位置y-鼠标点击时的位置mouseY),如果(鼠标所在的位置y-鼠标点击时的位置mouseY)<0,top值就变小,元素往上移动;如果(鼠标所在的位置y-鼠标点击时的位置mouseY)>0,top值就变大,元素往下移动;