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. Windows 10家庭版共享打印机

    原文地址:http://blog.csdn.net/Purpleendurer/article/details/50498788P.s. 原文太罗嗦,简化了一下~ 启用Guest账户 按Win+X,从 ...

  2. Tomcat与Jre绿色环境配置(生产环境)

    Tomcat与Jre绿色环境配置(生产环境) 博客分类: Apache Java jreapachetomcat  Tomcat运行时需要jre的支持,一般有两种方式,一种是用jdk带的jre,另一种 ...

  3. Log4Net

    注意事项 <!-- The file log4Net.config is copied into bin/Debug /release by compiler 添加如下内容到 assemblyi ...

  4. HTML5 history新特性pushState、replaceState

    DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,让你可以在用户的访问记录中前进和后退. 从HTML5开始,我们可以开始操作这个历史记录堆栈. 1.Histo ...

  5. 【Git学习笔记】撤销修改

    工作区下的.git文件夹其实是Git的版本库,Git的版本库里存了很多东西,其中最重要的就是称为 stage 的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向master的一个 ...

  6. MyEclipse 快捷键

    MyEclipse 快捷键1(CTRL) Ctrl+1 快速修复Ctrl+D: 删除当前行Ctrl+Q 定位到最后编辑的地方Ctrl+L 定位在某行Ctrl+O 快速显示 OutLineCtrl+T ...

  7. Sina 新浪Ip归属地Api 很好用的,使用get请求

    前言 这几天做了一个客服管理系统,需要根据游客的Ip获取他的归属地,刚开始使用了,www.ip138.com 抓取ip归属地,用这还可以,但是不显示国家:于是是找了这个新浪的Api,很不错啊 用法 1 ...

  8. oracle表大小

    查某一用户下的表 select SEGMENT_NAME,TABLESPACE_NAME,sum(BYTES/1024/1024)||'M'  from USER_extents where SEGM ...

  9. Preference Screen 首选项

     设置Preference Screen (res\xml\userpreferences.xml) <?xml version="1.0" encoding="u ...

  10. "undefined method `root' for nil:NilClass" error when using "pod install" 解决办法

    如果pod undate 的时候报错"undefined method `root' for nil:NilClass" error when using "pod in ...