写一个兼容性比较好的拖拽DEMO
写一个兼容性比较好的拖拽DEMO
思路
- div盒子
- 鼠标按下事件onmousedown
- 鼠标移动事件onmousemove,获得鼠标的坐标,将div移动至鼠标的当前坐标
- 鼠标抬起事件omouseup,清除鼠标移动事件和鼠标抬起事件
布局和代码
<style>
#div1 {
background: rgb(40,40,40);
width: 100px;
height: 100px;
position: absolute;
color: #fff;
}
</style>
<body>
实例文字实例文字实例文字实例文字
<div id="div1">实例文字</div>
实例文字实例文字实例文字实例文字
<script>
window.onload = function() {
drag("div1");
}
function drag(id) {
var oDiv = document.getElementById(id);
oDiv.onmousedown = function(ev) {
var oEvent = event || ev;
var disX = oEvent.clientX - oDiv.offsetLeft;
var disY = oEvent.clientY - oDiv.offsetTop;
oDiv.style.cursor = "move";
// for IE
if (oDiv.setCapture) {
oDiv.onmousemove = fnMove;
oDiv.onmouseup = fnUp;
oDiv.setCapture();
} else {
document.onmousemove = fnMove;
document.onmouseup = fnUp;
}
function fnMove(ev) {
var oEvent = event || ev;
var l = oEvent.clientX - disX;
var t = oEvent.clientY - disY;
// 磁性吸附
if (l < 50) {
l = 0;
} else if (l > document.documentElement.clientWidth - oDiv.offsetWidth-50) {
l = document.documentElement.clientWidth - oDiv.offsetWidth;
}
if (t < 50) {
t = 0;
} else if (t > document.documentElement.clientHeight - oDiv.offsetHeight-50) {
t = document.documentElement.clientHeight - oDiv.offsetHeight;
}
oDiv.style.left = l + 'px';
oDiv.style.top = t + 'px';
};
function fnUp() {
this.onmousemove = null;
this.onmouseup = null;
if (this.releaseCapture) {
this.releaseCapture();
}
}
return false; // 阻止文字选中
}
}
</script>
DEBUG
- 当页面中有其他元素的时候,鼠标拖拽时,会默认地去选中其他的诸如文字之类的东西,布局中的“实例文字”就是为此准备的。我们可以加入
return false来解决掉很多浏览器默认事件,在这里就有一个很好的应用 - 微软的IE总是有自己的一套,这给js兼容带来了很大的麻烦,上述的bug解决方法在IE6下根本无效,因此这里引入了IE特有的
setCapture(),IE中,假设id为div1一个元素设置了setCapture(),然后再绑定事件,比如一个点击事件,接下来,无论你点击哪里,被触发的都是div1元素的点击事件了,甚至你点击浏览器的地址栏,工具栏,都会触发div1的点击事件()。此时你的ie浏览器会像中毒一样,点击关闭按钮都是在触发div1的点击事件(),其他元素不管在div之上还是之下的,他们绑定的点击事件全部失效。 - 这里刚好可以运用IE的
setCapture和releaseCapture,当鼠标的div1上按下时,为div1 setCapture,这时所有的事件都集中到了div1身上,捕获所有事件,再也不会去选中其他的元素了,在鼠标抬起后,运用releaseCapture,不再捕获。
写一个兼容性比较好的拖拽DEMO的更多相关文章
- 缩放系列(三):一个可以手势缩放、拖拽、旋转的layout
弄了一个下午,终于搞出来了,PowerfulLayout 下面是一个功能强大的改造的例子: 可以实现以下需求: 1.两个手指进行缩放布局 2.所有子控件也随着缩放, 3.子控件该有的功能不能丢失(像b ...
- angular ng-repeat+sortable 拖拽demo
由于项目需求,需要使用angular 实现列表的增.删.改,并且列表支持拖拽. 看了下angular-ui 里面的sortable组件,使用起来也是非常简单,几十行代码就完成了所需功能. 我现在懒得想 ...
- iOS 创建一个可以点击并拖拽的Button
HSCButton.h #import <UIKit/UIKit.h> @interface HSCButton : UIButton { CGPoint beginPoint; } @p ...
- 移动端拖拽(模块化开发,触摸事件,webpack)
通过jquery可以很容易实现CP端的拖拽.但是在移动端却不好用了.于是我自己写了一个在移动端的拖拽demo,主要用到的事件是触摸事件(touchstart,touchmove和touchend). ...
- 自己写一个jqery的拖拽插件
说实话,jQuery比原生的js好用多了,本来想用原生写的,也写出来的,仅仅是,感觉不像插件,所以用jQuery实现了一版. 实现的功能:能够指定拖拽的边界,在拖拽过程中,能够触发几个自己定义事件 先 ...
- [转自大神]js拖拽小总结
https://blog.csdn.net/u013040887/article/details/83059094 权侵删 这里写的是一个原生js实现拖拽的效果,首先: 1.实现拖拽的三大事件,是要首 ...
- canvas drag 实现拖拽拼图小游戏
博主一直心心念念想做一个小游戏- 前端时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ...
- MVVM模式下实现拖拽
在文章开始之前先看一看效果图 我们可以拖拽一个"游戏"给ListBox,并且ListBox也能接受拖拽过来的数据, 但是我们不能拖拽一个"游戏类型"给它. 所以 ...
- RecyclerView拖拽排序和滑动删除实现
效果图 如何实现 那么是如何实现的呢?主要就要使用到ItemTouchHelper ,ItemTouchHelper 一个帮助开发人员处理拖拽和滑动删除的实现类,它能够让你非常容易实现侧滑删除.拖拽的 ...
随机推荐
- GC(Garbagecollection)垃圾回收
在前面向大家讲解FTL时,我们提到了GC的操作,所谓GC就是把一个闪存块里的‘有效’页数据复制到一个‘空白’块里,然后把这个块完全擦除.GC是SSD里的一个非常关键的操作,其效率对性能有决定性影响.闪 ...
- BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1196 [题目大意] 对于每条可能维修的公路可选择修一级公路或者二级公路,价值不同 要求 ...
- BF、KMP、BM、Sunday算法讲解
BF.KMP.BM.Sunday算法讲解 字串的定位操作通常称作串的模式匹配,是各种串处理系统中最重要的操作之一. 事实上也就是从一个母串中查找一模板串,判定是否存在. 现给出四种匹配算法包括BF(即 ...
- iOS实战(零):开发社区、文档等资源
社区 Apple官方资源 Xcode文档库: Window->Documentation and API Reference (可以在xcode的Preferences中下载最新的文档) iOS ...
- les nationalités et les pays
masculin féminin pays français française la France chinois chinoise la Chine suisse suisse ...
- dans le quartier
culture /kyltyr/ 文化 une école [ekɔl] un cinéma un musée une église un théâtre [teɑtr] un opéra [ɔp ...
- javascriptDOM编程艺术_学习笔记_知识点 DOM
第三章 getElementById 返回一个与那个有着给定id属性值的元素节点对应的对象. document.getElementById(id) 下面一个例子: document.get ...
- Browserify: 使nodejs模块可以在浏览器下使用
Browserify:浏览器加载Node.js模块--------------------------------------------------随着JavaScript程序逐渐模块化,在ECMA ...
- include file和include virtual的区别
1.#include file 包含文件的相对路径,#include virtual包含文件的虚拟路径. 2.在同一个虚拟目录内,<!--#include file="file.asp ...
- 使用 RMI + ZooKeeper 实现远程调用框架
目录[-] 1 发布 RMI 服务1.1 定义一个 RMI 接口1.2 编写 RMI 接口的实现类1.3 通过 JNDI 发布 RMI 服务2 调用 RMI 服务3 RMI 服务的局限性4 使用 Zo ...