拖动效果,可以形象的帮助用户处理一些问题,比如Windows删除文件,只需将文件拖动至回收站即可。比起右键显得更形象,我觉得更好玩一点^_^。当然,在其他许多方面,其实也有用到拖动效果,只是他们不是那么明显,以至于我们不容易觉察到。我是自娱自乐,写一个Web MusicPlayer的时候开始对拖动有所构思,因为需要做个左右一定范围内拖动的按钮,来改变Music文件的播放进度。


  不多说了,下面我们来进入本篇的正题。

  需要的组件:我们先来理一下简化后的拖动模型,只需要一个简单的于body中一个普通的div。他的大小应该适中,这样在看其相对鼠标运动时更加清晰。

  拖动触发的事件:1.mousedown  2.mousemove  3.mouseup

  拖动过程:鼠标左键在div上单击触发mousedown事件,在mousedown事件之后,鼠标开始拖动动作,触发mousemove事件,注意,此时div应该跟随鼠标在body上移动。这就牵扯到拖动的组件div的left(左支撑),以及top(上支撑)的该变量。(当然也可以用right和bottom来反映,效果一样)。要获取鼠标移动情况,在mousedown事件(设为事件ed)之后,获取鼠标屏幕位置(ed.clientX,ed.clientY);鼠标移动后mousemove事件(设为事件em)获取鼠标位置(em.clientX,em.clientY);则鼠标移动在X,Y方向的分量也是div将要移动的分量为(em.clientX,em.clientY)-(ed.clientX,ed.clientY)=(em.clientX-ed.clientX,em.clientY-ed.clientY);注意到得的值可能有负值情况,这种情况是不影响的。因为,如果我们假设鼠标相对(ed.clientX,ed.clientY)向右下移动至(em.clientX,em.clientY),若其中出现负值,相应的加号接变成了减号,也就是移动方向为假设方向的反方向,有实际意义,并不影响效果。现在,开始移动我们唯一的div,(在实际运行中,两者移动几乎是同步的,这里分开来说,只是便于理解),由上文我们知道div应该跟随鼠标向假设的方向右下移动(em.clientX-ed.clientX,em.clientY-ed.clientY);要在js中获取组件div的left和top即初始位置(d.offsetLeft,d.offsetTop)(这里d=document.getElementById('div');),则只需在mousemove事件触发时,对div的left和top重新赋值即可跟随鼠标移动,所以移动后的div位置为(d.offsetLeft,d.offsetTop)+(em.clientX-ed.clientX,em.clientY-ed.clientY)=(d.offsetLeft+em.clientX-ed.clientX,d.offsetTop+em.clientY-ed.clientY);这样,我们整个移动的过程就完成。

  但是如果所有的事件监听器全部放在待拖动div组件上,你会发现这个div很“脆弱”,慢慢拖动div中心完全没事,但是,当点击div边缘拖动,或者拖动速度较快时,你会发现我们的辛辛苦苦做出的div玩去了,跑丢了。Q~Q。这是因为当mousemove触发时,div跟随鼠标移动,并非是完全同步的,他们之间是有很小的延时的。当我们拖动速度很快的时候,鼠标跑出了div的“领域”,而我们的mousedown是加在div上的,现在鼠标已经不在领域内,自然也就停下来了。鼠标和div分道扬镳。要避免这个问题,也就是当鼠标在div外移动时,div依然艰难的保持与鼠标同步运动。即,mousedown依然放在div上,而mousemove放在我们的最大的容器body上,这样,当鼠标位于div外时,div依然追随我们我行我素的鼠标。为了避免当移速过快时突然up鼠标左键情况(这时,我们鼠标即使没有down左键,当鼠标进入div时,div依然追随鼠标),mouseup也应该加在最大的容器body上,至此,我行我素的鼠标和至死不渝的div曲折的故事圆满收尾。


  理清了思路下面就开始愉快的代码时间了。(为了粘贴方便,这里就不分开css,js了)

看一下效果http://dearvee.ccaeo.com/blog/move.html

2017-03-08  17:13:01

<!DOCTYPE html>
<html>
<head>
<title>move</title>
</head> <style type="text/css">
.body_css{
width: 100%;
height: 100%;
position: absolute;
}
.div_css{
width: 100px;
height: 100px;
background-color: #0ff;
position: absolute;
left: 0px;
top: 0px;
color: #fff;
user-select:none;
}
</style>
<script type="text/javascript">
window.onload=function (){ var d = document.getElementById('div');
var b = document.getElementById('body');
d.addEventListener("mousedown", function(ed) { var flag=true;
var dl=d.offsetLeft;
var dt=d.offsetTop;
b.addEventListener("mousemove",function(em){
if(flag){
d.style.left=dl+em.clientX-ed.clientX+"px";
d.style.top=dt+em.clientY-ed.clientY+"px";
}
}); b.addEventListener("mouseup",function(){
flag=false;
}); });
}
</script>
<body id="body" class="body_css">
<div id="div" class="div_css">你甩不掉我的<br>Q_Q</div>
</body>
</html>

Web组件流畅拖动效果的更多相关文章

  1. Web的鼠标拖动效果

    以前写过一个拖动效果的Demo,拖拽元素新位置的计算是放在拖拽元素的mousemove事件中进行的.计算效率差,而且效果不好.所以一直有想怎样才能做出jquery-ui那种顺滑的拖拽效果. 其实顺滑的 ...

  2. [阿当视频]WEB组件学习笔记

    — 视频看完了,自定义事件还不懂,等完全懂了再更新并完成整篇案例 1. JS分层和组件的种类浏览器底层包括HTML CSS JS(DOM/BOM/Style/Canvas 2D/WebGl/SVG) ...

  3. HTML 通过js实现div的拖动效果

    最近做项目,碰到一个问题,需要对div实现拖动效果. 在度娘找了很多,要么觉得代码太长,要么就是效果不理想,不过最后还是找到了一个不错的,感谢大神的留贴,方便了我们,就把代码贴下面了: <!DO ...

  4. 【收藏】这么多WEB组件(CSS),攒一个网站够了吧?

    简言 总是喜欢简单又精致的东西,美的不繁复也不张扬.这是闷骚程序员的癖好么?闲来无事,把收集到的部分WEB组件整理汇总一下,攒一个逼格高一点的网站够了吧? 1 表单(form)相关 1.1 输入框(i ...

  5. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  6. Web 组件是什么

    Web 组件是什么 一.总结 这篇下面的内容多看 1.组件化的目的:高内聚,低耦合,便于多人同时开发 2.各种前端框架(前端组件化)让写前端不要太简单: 3.组件编程最最最最简单实例: <lin ...

  7. amazeui中内置的web组件有哪些且如何用

    amazeui中内置的web组件有哪些且如何用 一.总结 一句话总结: 1.组件还是jquery.js+amazeui.js,和插件一样,准确的说是amazeui.css+jquery.js+amaz ...

  8. 使用外部web组件-----easyUI、jQueryUI、Bootstrap、js正则表达式

    1.使用外部web组件,以Bootstrap为例 <head> <link rel='stylesheet'  href='bootstrap-3.3.0-dist/dist/css ...

  9. vc++ mfc中拖动效果的实现 借助于CImageList

    拖动是界面编程频繁使用的一个效果,在windows系统下可谓大行其道.纵观时下的应用软件几乎各个都支持各种各样拖动的效果,windows7更是把拖动做到了极致.其实说起来拖动的实现也很简单,对于有句柄 ...

随机推荐

  1. 【Wyn Enterprise BI知识库】 什么是商业智能 ZT

    商业智能(Business Intelligence,BI),又称商务智能,指用现代数据仓库技术.在线分析处理技术.数据挖掘和数据展现技术进行数据分析以实现商业价值. 图1:商业智能(BI)系统 商业 ...

  2. Cartfile学习参考博客

    1.http://www.cnblogs.com/xuruofan/p/6000864.html 2.http://www.jianshu.com/p/5ccde5f22a17

  3. 章节七、4-Sets

    一.set中不允许存在相同的元素 package ZangJie7; import java.util.ArrayList; import java.util.HashSet; import java ...

  4. git 入门教程之实战 git

    实战 git git 是一款分布式版本控制系统,可以简单概括: 不要把鸡蛋放在一个篮子里,你的一举一动都在监视中. 实战场景 你作为某项目的其中一员或者负责人,和小伙伴们一起开发,大家既有着各自分工互 ...

  5. 《JavaScript面向对象的编程指南》--读书笔记

    第一章.引言 1.5 面向对象的程序设计常用概念 对象(名词):是指"事物"在程序设计语言中的表现形式. 这里的事物可以是任何东西,我们可以看到它们具有某些明确特征,能执行某些动作 ...

  6. linux 环境变量设置

    sudo gedit ~/.bashrc source ~/.bashrc

  7. [20170606]11G _optimizer_null_aware_antijoin.txt

    [20170606]11G _optimizer_null_aware_antijoin.txt --//上午测试_optimizer_null_aware_antijoin,发现自己不经意间又犯了一 ...

  8. Web GIS离线地图

    参考资料: http://www.cnblogs.com/luxiaoxun/p/5022333.html https://www.cnblogs.com/luxiaoxun/p/4454880.ht ...

  9. 简单易懂的程序语言入门小册子(6):基于文本替换的解释器,引入continuation

    当我写到这里的时候,我自己都吃了一惊. 环境.存储这些比较让人耳熟的还没讲到,continuation先出来了. 维基百科里对continuation的翻译是“延续性”. 这翻译看着总有些违和感而且那 ...

  10. python3+xlwt 读取txt信息并写入到excel中

    # coding = utf-8 import os import xlwt import re def readTxt_toExcel(valueList, Pathlist): workbook ...