JS中的拖拽示例:
    1)实现拖拽思路:当鼠标按下和拖拽过程中,鼠标与拖拽物体之间的相对距离保持不变
    2)实现拖拽遇到的问题:
        问题1:当鼠标按下移动过快时,离开了拖拽的物体时,这时拖拽物体将不再随着鼠标移动
                因为拖拽的div太小了,这时我们可以将在拖拽物体上的mousemove事件放到document上面
                同时将mouseup也改为document上面的事件
                IE下直接用obj.setCapture()即可解决,但要做三个浏览器的兼容问题
        问题2:在FF中第二次拖拽,空div的Bug
                解决方法:在mousedown函数上面添加阻止默认行为即可:return false;
        问题3:会出现将div脱出浏览器窗口的情况,用户体验不好
                解决方法:限制div的拖动范围
        问题4:对于图片拖拽--阻止默认事件return false
        问题5:当拖拽图片或者div时,经过其他文字时,会出现文字选中
            解决方法:
                1.阻止默认事件return false
                    --return false为新版浏览器FF,Chrome,IE9-11阻止了这个问题,但是IE8以下却不行
                2.IE下解决拖拽时文字选中问题--用事件捕获(只写IE下认识的事件),要解决兼容问题

3)事件捕获:只有IE识别
        obj.setCapture()--作用是将整个网页中所有的事件集中在某个对象上,即网页中的其他对象不能获得事件
        obj.releaseCapture()--解除事件捕获

示例1:拖拽1,不拖出对象的父级dragDiv

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style media="screen">
#dragDiv{
width:400px;
height: 400px;
background: #ccc;
position: relative;
margin: 20px;
}
#drag{
width: 100px;
height: 100px;
background: red;
position: absolute;
}
</style>
</head>
<body>
<div id="dragDiv">
11111111111111111111
<div id="drag">拖拽2-有范围拖拽</div>
</div> <script type="text/javascript">
window.onload=function(){
//拖拽,不拖出对象的父级dragDiv
var oDragDiv=document.getElementById('dragDiv');
var oDrag=document.getElementById('drag');
oDrag.onmousedown=function(ev){
var oEvent=ev||event;
var pos=getMousePosition(oEvent);
var disX=pos.x-oDrag.offsetLeft;
var disY=pos.y-oDrag.offsetTop;
if(oDrag.setCapture){
//兼容IE7-11
oDrag.onmousemove=Mousemove;
oDrag.onmouseup=mouseUp;
oDrag.setCapture();
}else{
//兼容FF,Chrome
document.onmousemove=Mousemove;
document.onmouseup=mouseUp;
} function getMousePosition(ev){
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
var scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft;
return {x:ev.clientX+scrollLeft,y:ev.clientY+scrollTop};
};
//合并代码
function Mousemove(ev){
var oEvent=ev||event
var pis=getMousePosition(oEvent);
var l=pis.x-disX;
var t=pis.y-disY; //限制范围,磁性吸附,快接近父级时,自动吸附上去
if (l<30) {
l=0;
}else if(l>oDragDiv.offsetWidth-oDrag.offsetWidth){
l=oDragDiv.offsetWidth-oDrag.offsetWidth;
}
if (t<30) {
t=0;
}else if(t>oDragDiv.offsetHeight-oDrag.offsetHeight){
t=oDragDiv.offsetHeight-oDrag.offsetHeight;
}
oDrag.style.left=l+'px';
oDrag.style.top=t+'px';
};
function mouseUp(){
//当鼠标抬起时,mousemove/up清空
this.onmousemove=null;
this.onmouseup=null;
if (oDrag.releaseCapture) {
oDrag.releaseCapture();
}
};
return false; //FF等高版本浏览器中阻止默认行为
};
}
</script>
</body>
</html>

示例2:带框的拖拽:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style media="screen">
#dragDiv1{
width:400px;
height: 400px;
background: #ccc;
position: relative;
margin: 20px;
}
#drag1{
width: 100px;
height: 100px;
background: red;
position: absolute;
}
.box{
border: 1px dashed black;
position: absolute;
}
</style>
</head>
<body>
<div id="dragDiv1">
11111111111111111111
<div id="drag1">拖拽2-带框拖拽</div>
</div> <script type="text/javascript">
window.onload=function(){
//拖拽3:结合DOM,带框的拖拽
var oDragDiv1=document.getElementById('dragDiv1');
var oDrag1=document.getElementById('drag1');
oDrag1.onmousedown=function(ev){
var oEvent=ev||event;
var pos=getMousePosition(oEvent);
var disX=pos.x-oDrag1.offsetLeft;
var disY=pos.y-oDrag1.offsetTop;
//定义拖出来的框
var oBox=document.createElement('div');
oBox.className='box';
oBox.style.width=oDrag1.offsetWidth-2+'px';
oBox.style.height=oDrag1.offsetHeight-2+'px';
//每次拖动时,给虚框div的初始位置和红色实体初始位置相同,防止虚框闪动
oBox.style.left=oDrag1.offsetLeft+'px';
oBox.style.top=oDrag1.offsetTop+'px';
oDragDiv1.appendChild(oBox);
if(oBox.setCapture){
//兼容IE7-11
oBox.onmousemove=Mousemove;
oBox.onmouseup=mouseUp;
oBox.setCapture();
}else{
//兼容FF,Chrome
document.onmousemove=Mousemove;
document.onmouseup=mouseUp;
} function getMousePosition(ev){
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
var scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft;
return {x:ev.clientX+scrollLeft,y:ev.clientY+scrollTop};
};
//合并代码
function Mousemove(ev){
var oEvent=ev||event
var pis=getMousePosition(oEvent);
var l=pis.x-disX;
var t=pis.y-disY; //3.限制范围,磁性吸附,快接近父级时,自动吸附上去
if (l<30) {
l=0;
}else if(l>oDragDiv1.offsetWidth-oBox.offsetWidth){
l=oDragDiv1.offsetWidth-oBox.offsetWidth;
}
if (t<30) {
t=0;
}else if(t>oDragDiv1.offsetHeight-oBox.offsetHeight){
t=oDragDiv1.offsetHeight-oBox.offsetHeight;
}
oBox.style.left=l+'px';
oBox.style.top=t+'px';
};
function mouseUp(){
//当鼠标抬起时,mousemove/up清空
this.onmousemove=null;
this.onmouseup=null;
oDrag1.style.left=oBox.offsetLeft+'px';
oDrag1.style.top=oBox.offsetTop+'px';
oDragDiv1.removeChild(oBox);
if (oBox.releaseCapture) {
oBox.releaseCapture();
}
};
return false; //FF中阻止默认行为
};
}
</script>
</body>
</html>

示例3:拖拽实现自定义滚动条

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style media="screen">
#scroll{
width: 500px;
height: 20px;
background: #ccc;
position: relative;
margin: 20px;
border-radius: 3px;
}
#drag2{
width: 20px;
height: 20px;
background: red;
border-radius: 3px;
position: absolute;
}
#scrollCtrl{
width: 150px;
height: 150px;
filter: alpha(opacity:0);
opacity: 0;
background: green;
margin: 20px;
}
#ctrlWords{
width: 300px;
height: 400px;
border: 1px solid #000;
margin: 20px;
position: relative;
overflow: hidden;
}
#words{
position: absolute;
top: 0;
left: 0;
}
</style>
</head>
<body>
<div id="scroll">
<div id="drag2"></div>
</div>
<div id="scrollCtrl"></div> <div id="ctrlWords">
<div id="words">
每天开心快乐的生活是我们每个人追求的目标,有人孜孜不倦,苦苦追寻,仍找不到快乐的影踪。有人默默不语,静静守候,快乐总是如期而至,伴其左右。    一名记者到一个集市上采访,他看到一个年迈的老太太在一个角落里卖柠檬,“柠檬!柠檬!五毛钱一个!”老人有气无力地喊着,老太太的生意显然不太好,一上午也没卖几个。记者动了恻隐之心,打算把老太太的柠檬全部买下来,以使她能“高高兴兴地早些回家”。当他把自己的想法告诉老太太时,老太太的回答让他大吃一惊:“我现在都卖给你了,那我下午卖什么”。    快乐对于这位老太太来说,就是踏踏实实的生活,体会身边发生的点滴事情。我们的眼睛有时会欺骗我们,我们认为该烦恼的人其实是快乐的,而我们以为会快乐的人却充满了烦恼。真实的生活,往往会给人们带来无穷乐趣,只要你懂得去感受,你一定会收获快乐。    有一位为了金钱忙得焦头烂额而且并不快乐的爸爸问女儿:“你快乐吗?”女儿高兴地回答说:“快乐”。迷惑不解的爸爸说:“那什么是快乐呢?”女儿天真地回答说:”比如现在,我们都吃完了晚饭,你陪我在楼顶看星星,我感觉很快乐。”迷惑的爸爸一下子就清楚了自己不快乐的原因了。    女孩的快乐如此简单,却是来自内心最真实的快乐。仔细体会,身边的一草一木,一花一叶,都能带给我们最纯真的快乐。心中平静喜悦,无论是仰望星空,还是低头赏花,是临水观鱼,还是听风赏雨,都是其乐无穷。
</div>
</div> <script type="text/javascript">
window.onload=function(){
//自定义滚动条
var scroll=document.getElementById('scroll');
var oDrag2=document.getElementById('drag2');
var scrollCtrl=document.getElementById('scrollCtrl');
var ctrlWords=document.getElementById('ctrlWords');
var words=document.getElementById('words');
oDrag2.onmousedown=function(ev){
var oEvent=ev||event;
var pos=getMousePosition(oEvent);
var disX=pos.x-oDrag2.offsetLeft;
if(oDrag2.setCapture){
//兼容IE7-11
oDrag2.onmousemove=Mousemove;
oDrag2.onmouseup=mouseUp;
oDrag2.setCapture();
}else{
//兼容FF,Chrome
document.onmousemove=Mousemove;
document.onmouseup=mouseUp;
} function getMousePosition(ev){
var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
var scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft;
return {x:ev.clientX+scrollLeft,y:ev.clientY+scrollTop};
};
//合并代码
function Mousemove(ev){
var oEvent=ev||event
var pis=getMousePosition(oEvent);
var l=pis.x-disX; //3.限制范围
if (l<0) {
l=0;
}else if(l>scroll.offsetWidth-oDrag2.offsetWidth){
l=scroll.offsetWidth-oDrag2.offsetWidth;
}
oDrag2.style.left=l+'px';
//百分数scale0-100%
var scale=l/(scroll.offsetWidth-oDrag2.offsetWidth);
scrollCtrl.style.filter='alpha(opacity:'+scale*100+')';
scrollCtrl.style.opacity=scale;
words.style.top=-scale*(words.offsetHeight-ctrlWords.offsetHeight)+'px';
};
function mouseUp(){
//当鼠标抬起时,mousemove/up清空
this.onmousemove=null;
this.onmouseup=null;
if (oDrag2.releaseCapture) {
oDrag2.releaseCapture();
}
};
return false; //FF中阻止默认行为
};
}
</script>
</body>
</html>

JS—实现拖拽的更多相关文章

  1. Js元素拖拽功能实现

    Js元素拖拽功能实现 需要解决的问题 最近项目遇到了一个问题,就是用户某个操作需要弹出一个自定义的内容输入框,但是有个缺点,当浏览太大的时候没办法点击确认和取消按钮,应为这个弹出框是采用绝对定位的,取 ...

  2. js之拖拽事件

    js之拖拽事件 api:https://www.runoob.com/jsref/event-ondrag.html 拖拽事件是js原生的事件,使用时在div上添加 draggable="t ...

  3. js鼠标拖拽

    html <div id="box"> </div> css ;;} #box{width:200px;height:200px;background:cy ...

  4. 原生Js实现拖拽(适用于pc和移动端)

    效果: HTML和CSS部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  5. js 利用jquery.gridly.js实现拖拽并且排序

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. js 实现拖拽排序

    <!DOCTYPE> <html lang="zh-cn"> <head> <meta http-equiv="Content- ...

  7. jquery.dragsort.js 实现拖拽过程遇到的问题

    .在IE下第一次拖动的时候,被拖动的li元素会不显示,查了很多资料发现是因为在IE中定位出了问题,li标签还在,只是位置计算出错.解决的办法是在li的css样式中position设置为relative ...

  8. JS实现拖拽功能

    本文代码地址(第一节):https://github.com/dirstart/js-exam/blob/master/%E6%8B%96%E6%8B%BDdiv1.html 第二节:https:// ...

  9. 原生js实现拖拽效果

    面向对象 + 原生js拖拽 拖拽div等盒子模型,都是日常操作没有什么问题,如果是拖拽图片的话,会有一点小坑要踩...... 那么我们看代码: var Move_fn = {}; (function( ...

随机推荐

  1. x86架构手机跑安卓好吗?(脑补)

    华硕低价位手机ZenFone一推出就掀起市场话题,许多人也对ZenFone所采用的Intel Atom处理器有所意见,深怕其相容性问题无法正确执行应用程式App,这究竟是怎么回事呢? Intel近几年 ...

  2. laravel的门面模式

    核心技术是__callStatic()方法,当调用的方法不存在时,会自动调用魔术方法__callStatic()方法,和__autoload()方法同工异曲.

  3. C# 关键字【转】

      C#中的关键字 关键字是对编译器具有特殊意义的预定义保留标识符.它们不能在程序中用作标识符,除非它们有一个 @ 前缀.例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字. 下面是列 ...

  4. 2017年8个UI设计流行趋势

    设计趋势变化的理由需要考虑各种各样的因素.让我们来一起看看2017年的设计流行趋势吧. 应用界面的设计趋势是不断变化的.随着时间的推移他也在不断的成长,进化.虽然有些趋势还有待检验,但我们还是需要不断 ...

  5. C++ 函数形参发生动态绑定时指针增长步长与静态类型一致

    牛客网上的题: class A { public: long a; }; class B : public A { public: long b; }; void seta1(A* data, int ...

  6. WebView 一直展示加载中。。。

    webview加载html5页面总是一直在加载中,加载很慢或干脆加载不出来, 听浏览器的大牛说可能是 js导致的,尝试在onpause里加入mWebView.pauseTimers(), onResu ...

  7. Sublime、Webstorm等在APICloud平台上全面支持WiFi真机同步和实时预览功能

    APICloud工具插件包括APICloud Studio.Sublime Text和Webstorm全面为开发者提供iOS和Android平台真机同步调试功能,不仅可以通过USB方式进行APP真机同 ...

  8. ASP.NET MVC location.href不跳转

    表单使用submit导致不跳转 <button type="button">

  9. SVN File Name Case Sensitivity--SVN大小写问题

    from:http://www.visualsvn.com/support/topic/00019/ Windows has a case-insensitive file system. Unix ...

  10. ubuntu安装使用GitHub--PC端

    按照这个步骤安装并且初步使用 按照这个程序配置git的ssh,在git push时不用输入密码