拖动效果,可以形象的帮助用户处理一些问题,比如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. 如何用ABP框架快速完成项目(7) - 用ABP一个人快速完成项目(3) - 通过微服务模式而不是盖楼式来避免难度升级和奥卡姆剃刀原理

    这节文章十分重要!十分重要!十分重要!   很多同学在使用ABP的过程中遇到很多问题, 花费了很多时间和精力都还无法解决, 就是卡在这节文章这里.   Talk is cheap, just show ...

  2. MMU学习总结

    待完善 一.MMU主要完成哪些事务? 二.PowerPC上的BAT.LAW是做什么用的? 三.

  3. Windows 在命令行中将输出内容放到文件中

    1.将命令行中输出的内容存储到文件中. 使用重定向符号 “>” 就可以了. 通过 > 可以创建新文件并将内容放到文件中,如果文件存在,则会覆盖. 2.通过 >> 可以向已有的文 ...

  4. 终极 Shell——ZSH

    Shell是Linux/Unix的一个外壳,你理解成衣服也行.它负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后 ...

  5. Linux下完全删除用户

    实验环境:Centos7虚拟机 首先创建一个普通用户gubeiqing. [root@localhost ~]# useradd gubeiqing [root@localhost ~]# passw ...

  6. LeetCode算法题-Find the Difference(Java实现-五种解法)

    这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混 ...

  7. 设置Firefox自动清除缓存,无需手动清除

    1.在firefox的地址栏上输入about:config回车 2.找到browser.cache.check_doc_frequency选项,双击将3改成1保存即可. 那么这个选项每个值都是什么含义 ...

  8. 【项目 · Wonderland】立项报告

    [软件工程实践 · 团队项目] 第二次作业 团 队 作 业 原 文:http://www.cnblogs.com/andwho/p/7598662.html Part 0 · 简 要 目 录 Part ...

  9. Java操作Excel(使用JXL)

    一.本地操作 1.读取 package com.ljf.mb; import java.io.FileInputStream; import java.io.InputStream; import j ...

  10. 《Java大学教程》—第19章 改进用户界面

    用户与程序交互的媒介称为用户界面(user interface)或人机界面(human-computer interface). 19.2    Border接口8个实现Border接口的标准边框类: ...