拖动效果,可以形象的帮助用户处理一些问题,比如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. springboot 数据验证

    不能相信前端传过来的任何数据 一定不能相信前端传过来的任何数据 绝对不能相信前端传过来的任何数据 @JsonFormat 时间必须是指定的格式(这里是接收参数格式,不是取数据来格式化) @Null 必 ...

  2. 「破解」Xposed强

    「破解」Xposed强 Hook Hook Hook! 两张图片,第一张是我的微信截图,第二张是我从微信Hook出的一些类名. 一段代码,Hook这些类名出来的源码. 知道这些我们能干嘛,当然是分析( ...

  3. Xamarin.Forms 使用本地数据库之 SQLite

    前言 Xamarin.Forms支持使用SQLite数据库引擎.本文介绍了Xamarin.Forms应用程序如何读取和写入数据到使用SQLite.Net的本地SQLite数据库. 在Xamarin.F ...

  4. Mysql 自定义函数示例

    创建定义函数的的基本语法如下 # DELIMITER是用来设置边界符的 DELIMITER // CREATE FUNCTION 函数名(形参列表) RETURNS 返回类型 begin # 函数体 ...

  5. Android沉浸式状态栏的简单实现

    随着卡片式设计在Android系统的上越来越流行,比如现在早已经烂大街的沉浸式状态栏,几乎所有的主流的APP都支持沉浸式状态栏,如QQ.UC浏览器等等.所以觉得有必要学习一下,找了点资料,总结了一下, ...

  6. recovery 升级前兼容性检查(Vendor Interface Object)

    从android P(9.0)版本开始,我们发现编译出来的OTA升级了里面多了一个文件,compatibility.zip,这个里面存储这system与vendor分区的一些特性,用来做升级前的兼容性 ...

  7. Mycat实现Mysql主从读写分离

    一.概述 关于Mycat的原理网上有很多,这里不再详述,对于我来说Mycat的功能主要有如下几种: 1.Mysql主从的读写分离 2.Mysql大表分片 3.其他数据库例如Oracle,MSSQL,D ...

  8. SMM框架--maven创建web项目

    1.首先新建一个maven项目,看图: 2.按照以上步骤就可以创建一个maven项目,可以看到最下图的目录结构,但是这样的目录结构是不对的,需要做一些修改. 首先为了避免乱码,我们应该将项目编码换成U ...

  9. LeetCode算法题-Merge Sorted Array(Java实现)

    这是悦乐书的第161次更新,第163篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第20题(顺位题号是88).给定两个排序的整数数组nums1和nums2,将nums2中 ...

  10. 028实现strStr()

    #pragma once #include "000库函数.h" /*********************自解**************/ //使用算法中的find 12ms ...