JavaScript鼠标拖拽特效及相关问题总结

#div1{width:200px;height:200px;background:red;position:absolute;}
#div2{width:200px;height:200px;background:green;position:absolute;left:300px;}
<div id="div1">原来的  普通拖拽</div>
<div id="div2">继承的 限制范围拖拽</div>
window.onload=function()
{
    new Drag(‘div1‘);
    new LimitDrag(‘div2‘);
};

function Drag(id)
{
    this.disX=0;
    this.disY=0;
    var _this=this;
    this.oDiv=document.getElementById(id);

    this.oDiv.onmousedown=function(ev)
    {
        _this.fnDown(ev);
        return false;
    };
};

Drag.prototype.fnDown=function(ev)
{
    var _this=this;
    var oEvent=ev||event;

    this.disX=oEvent.clientX-this.oDiv.offsetLeft;
    this.disY=oEvent.clientY-this.oDiv.offsetTop;

    document.onmousemove=function(ev)
    {
        _this.fnMove(ev);
    };

    document.onmouseup=function()
    {
        _this.fnUp();
    };
};

Drag.prototype.fnMove=function(ev)
{
    var oEvent=ev||event;
    this.oDiv.style.left=oEvent.clientX-this.disX+‘px‘;
    this.oDiv.style.top=oEvent.clientY-this.disY+‘px‘;
};

Drag.prototype.fnUp=function()
{
    document.onmousemove=null;
    document.onmouseup=null;
};

/*继承*/
function LimitDrag(id)
{
    Drag.call(this,id);
};

for(var i in Drag.prototype)
{
    LimitDrag.prototype[i]=Drag.prototype[i];
};

LimitDrag.prototype.fnMove=function (ev)
{
    var oEvent=ev||event;
    var l=oEvent.clientX-this.disX;
    var t=oEvent.clientY-this.disY;

    if(l<0)
    {
        l=0;
    }
    else if(l>document.documentElement.clientWidth-this.oDiv.offsetWidth)
    {
        l=document.documentElement.clientWidth-this.oDiv.offsetWidth;
    }

    this.oDiv.style.left=l+‘px‘;
    this.oDiv.style.top=t+‘px‘;
};

鼠标拖拽效果最容易出现几个问题:

1、元素脱离鼠标,原因是“鼠标不离开元素基本不可能,这跟浏览器解析速度有关,浏览器解析速度又跟CPU有关”,所以元素脱离鼠标是必然的,解决办法就是采用事件委托,把事件委托到document上,而不是需要拖拽的元素上,事件本身是会冒泡的,会触发委托在document上的事件

时间: 2024-12-22 04:48:41

JavaScript鼠标拖拽特效及相关问题总结的相关文章

js实现鼠标拖拽div-------Day44

如果去问这样一个问题"你觉得鼠标操作简单,还是键盘操作简单",相信会有多数人都会回答鼠标吧,毕竟键盘按钮那么多,如果手小了或者手法不规范了,太容易出问题了,也对操作的速度和有效性是大大的降低了,当然不可否认,会有那么一批人,操作起键盘来完全可以忽略鼠标的,但这些都应该是骨灰级别的了吧,起码我现在的层次还接触不到,只能向往. 然而,当面对这么一个问题时,我突然有点纠结,因为毕竟以前我也是那么想的,但是这次开发让我是大跌眼镜,键盘操作我在开发中,我只能判定其按键是否按键,然后根据不同按键进

JavaScript实现拖拽元素对齐到网格(每次移动固定距离)

这几天在做一个拖拽元素的附加功能,就是对齐到网格,实际上就是确定好元素的初始位置,然后拖拽元素时,每次移动固定的距离.让元素都可以在网格内对齐.先上效果图,然后在详细说明一下细节问题 做了一个gif图,可以看到,每次元素的移动都是按照最小单位距离移动的.且每次元素都是对齐到网格的. 先根据demo说明一下思路和细节,后面会给出demo代码. 1. 确定元素的每次移动的最小单位(demo中为10px和10px),也就是每次水平或垂直的位移量都是10px.铺上一层网格背景是为了帮助我们更好的看到效果

鼠标拖拽多选功能

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>鼠标拖拽多选功能</title> <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script> <style type="text/css"&

js实现鼠标拖拽多选功能

最近做了一个用js实现鼠标拖拽多选的功能,于是整理了一下思路,写了一个小demo:遮罩出现:被遮罩盖住的,即为选中的块(背景色为粉色)下面是具体代码,注释已在文中,与大家交流. <!DOCTYPE html> <html> <head> <title>鼠标拖拽多选功能</title> <script src="https://cdn.bootcss.com/jquery/1.10.2/jquery.min.js">

unity 鼠标拖拽物体实现任意角度自旋转

主要涉及函数 Input.GetAxis(“Mouse x”) 可取得鼠标横向(x轴)移动增量 Input.GetAxis(“Mouse y”) 可取得鼠标竖向(y轴)移动增量 通过勾股定理获取拖拽长度,长度越长旋转越快 在project setting--Input 可以设置 直接上代码,看了就明白了 1 using UnityEngine; 2 using System.Collections; 3 4 public class startRoate : MonoBehaviour 5 {

一款基于jQuery的支持鼠标拖拽滑动焦点图

记得之前我们分享过一款jQuery全屏广告图片焦点图,图片切换效果还不错.今天我们要分享另外一款jQuery焦点图插件,它的特点是支持鼠标拖拽滑动,所以在移动设备上使用更加方便,你只要用手指滑动屏幕即可切换图片. 在线预览   源码下载 实现的代码. html代码: <div class="main_visual"> <div class="flicking_con"> <a class="on" href=&quo

Javascript面向对象拖拽

function Drag(id) { var _this=this; this.disX=0; this.disY=0; this.oDiv=document.getElementById(id); this.oDiv.onmousedown=function(e) { _this.fnDown(e); } } Drag.prototype.fnDown=function(e) { var _this=this; var e=e||event; this.disX=e.pageX-this.o

鼠标拖拽移动Java界面组件

默认的,Frame或者JFrame自身已经实现了鼠标拖拽标题栏移动窗口的功能. 只是,当你不满意java的JFrame样式,隐藏了标题栏和边框,又或者干脆直接使用JWindow,那你又该怎么实现鼠标拖拽移动窗口的目的呢?最开始,我简单的在mouseDragged方法里frame.setLocation(e.getX(), e.getY()),结果,frame拖拽的时候不停地闪烁,位置在屏幕上不断跳动.后来网上查资料,找到了答案. 这里给一个简单的示例,一看就明白: 1 package com.j

JS Event 鼠标拖拽事件

<!DOCTYPE html><html> <head>        <meta charset="UTF-8">        <title>JS Event鼠标拖拽事件</title>                <style>            #box{width:200px;height:200px;background:#000;position:absolute;}