前言:前几天没事干写了个小网站,打算用原生的javascript实现元素的拖动,但是事情并没有想象的那么顺利,首先是实现了拖动的元素卡的不能再卡,简直不能够,上图~~

看见没?这就是效果,简直让人欲哭无泪啊,查了大量的资料也无济于事,根本就没有人会遇到过这个问题,但是经过N次试验,终于找到了原因——竟然是我给这个元素添加了transition属性导致的,元凶:

去掉这个属性之后,就变得完全不一样了

至于原因,我现在也不知道为什么,很无奈╮(╯▽╰)╭

接下来就是性能优化了,我原来的实现方式是给元素添加一个mousemove事件,然后判断事件对象的buttons是否为1,如果是1的话表明此时左键按下,然后记录此时鼠标的x和y的坐标,当下次触发mousemove事件的时候用当前鼠标的位置减去上次记录的鼠标的位置就是鼠标移动的距离,然后用元素当前的位置加上鼠标移动的距离就实现了拖动,代码如下:

//实现拖动

var lastClientX = 0;var lastClientY = 0;var count = 0;

addCommandCard.addEventListener('mousemove', function() {if(arguments[0].buttons == 1) {

addCommandCard.style.cursor= "default";

arguments[0].preventDefault();if(count == 0) {

lastClientX= arguments[0].clientX;

lastClientY= arguments[0].clientY;

count++;

}else{

addCommandCard.style.left= addCommandCard.offsetLeft + arguments[0].clientX - lastClientX + "px";

addCommandCard.style.top= addCommandCard.offsetTop + arguments[0].clientY - lastClientY + "px";

lastClientX= arguments[0].clientX;

lastClientY= arguments[0].clientY;

count++;

}

}

});

今天看了个实现拖动的代码,基本思路是,给元素添加mousedown事件,在这个事件处理程序中,首先记录当前鼠标的位置与元素的offsetLeft和offsetTop的差值,然后给document添加mousemove和mouseup事件,在document的mousemove事件中,将元素的left设置为当前鼠标X坐标减去上面记录的鼠标X坐标和元素offsetLeft的差值,top值设置为当前鼠标Y坐标减去上面记录的鼠标Y坐标和元素offsetTop的差值,在mouseup事件中,设置document的mousemove和mouseup为null,上面的话可能有些拗口,通俗点说就是首先记录元素的左边框和鼠标X坐标的差值,然后记录元素的上边框和鼠标Y坐标的差值,在鼠标移动的时候将元素的左边框的值设置为鼠标当前X坐标的值减去鼠标和元素左边框之间的相对距离,上边框类似,因为在元素拖动的过程中,鼠标和元素的相对位置始终没有发生变化,所以只要用鼠标当前的位置减去鼠标和元素之间的相对距离就是元素拖动后的位置,代码:

//实现拖动

addCommandCard.addEventListener('mousedown', function() {

arguments[0].preventDefault();var disX = arguments[0].clientX -addCommandCard.offsetLeft;var disY = arguments[0].clientY -addCommandCard.offsetTop;

document.οnmοusemοve= function() {

addCommandCard.style.left= arguments[0].clientX - disX + 'px';

addCommandCard.style.top= arguments[0].clientY - disY + 'px';

}

document.οnmοuseup= function() {

document.οnmοusemοve= null;

document.οnmοuseup= null;

}

});

总结:在chrome中测试结果表明,两种拖动方式都可以稳定在60fps,总得来说,差别不大,但是第一种有比较慢明显的缺点,首先,第一种给元素添加了mousemove事件,那就意味着不管元素当前是否拖动,只要有鼠标移动到元素上,这个事件就不断的触发,虽然只有一条判断语句,但是造成性能的白白浪费,而第二种是添加了mousedown事件,只有鼠标按下的时候才会触发,所以没有这个问题,但是,如果在别处给document指定了mousemove和mouseup事件,那么在元素拖动开始和结束之后,这些事件处理程序会变得无效,因为覆盖的原因,但是可以通过DOM2级事件处理程序来解决,不算大问题

css鼠标拖拉卡顿_JavaScript实现元素拖动性能优化相关推荐

  1. css鼠标拖拉卡顿_66个值得收藏的CSS开发技巧

    来源:https://mp.weixin.qq.com/s/hEWqQYfrbTrEJ4CIa16DCQ 作者:前端宇宙 何为技巧,意指表现在文学.工艺.体育等方面的巧妙技能.代码作为一门现代高级工艺 ...

  2. css鼠标拖拉卡顿_vue中解决拖拽改变存在iframe的div大小时卡顿问题

    写在最前 针对于在vue中实现拖拽改变两左右个div大小的方式,请查看上一篇文章<vue中实现拖动调整左右两侧div的宽度>.此文章主要针对于实际应用中需要拖拽改变大小的组件中使用ifra ...

  3. css鼠标拖拉卡顿_浅谈CSS3 动画卡顿解决方案

    为什么会卡顿? 有一个前提必须要提,前端开发者们都知道,浏览器是单线程运行的.但是我们要明确以下几个概念:单线程,主线程和合成线程. 虽然说浏览器执行js是单线程执行(注意,是执行,并不是说浏览器只有 ...

  4. css鼠标拖拉卡顿_在jQuery中拖动Div – 当鼠标缓慢时就很好,但是在鼠标移动快的时候会失败...

    有两个问题.一个是你在鼠标离开元素时取消拖动,你不想这样做.第二个是mousemove只是在盒子上,一旦光标开箱即可,不再执行mousemove.您可以存储要拖动的元素,然后将mousemove添加到 ...

  5. css鼠标拖拉卡顿_详解overflow-scrolling解决滚动卡顿问题

    前言 如果你对某个div或模块使用了overflow: scroll属性,在iOS系统的手机上浏览时,则会出现明显的卡顿现象.但是在android系统的手机上则不会出现该问题. 解决方法 以下代码可解 ...

  6. IT:前端进阶技术路线图(初级→中级→高级)之初级(研发工具/HTML/CSS/JS/浏览器)/中级(研发链路/工程化/库/框架/性能优化/工作原理)/高级(搭建/中后台/体验管理等)之详细攻略

    IT:前端进阶技术路线图(初级→中级→高级)之初级(研发工具/HTML/CSS/JS/浏览器)/中级(研发链路/工程化/库/框架/性能优化/工作原理)/高级(搭建/Node/IDE/中后台/体验管理/ ...

  7. C# 解决datagridview控件显示大量数据拖拉卡顿问题

    问题描述: 由于在使用SQL查询大量的数据并一次显示到dataGridView控件,出现拖拉的时候卡顿. 解决方法: 1.首先分页. 2.其次把显示控件设置双buffer. 解决过程如下: 1.设置d ...

  8. android帧动画卡顿现象,css3针对移动端卡顿问题的解决(动画性能优化)

    一.使用css,jquery,canvas制作动画 1.Canvas 优点:性能好,强大,支持多数浏览器(除了IE6.IE7.IE8),画出来的图形可以直接保存为 .png 或者 .jpg的图形: 缺 ...

  9. vue--百度地图之离线地图--大量标注点造成卡顿问题--海量点聚合性能优化

    如果你啥都不想看,只想解决问题,直接跳转–四.步骤 目录 一.需求 二.地图的引入.聚合点的使用 1.如图:引入百度地图和其他相关插件(按需引入,这些百度地图官网上都可以下载到) 2.初始化地图准备: ...

最新文章

  1. 当RabbitMQ使用Publish发布消息出现数据格式问题的解决方法
  2. bootstrap获取表格中选中行的值_这才是No.1的Excel表格核对技巧
  3. 国外机房供电模式不如国内的?对比一下就知道了
  4. 深度丨机器学习的理论局限性与因果推理的七大特性zhuan'z
  5. reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...
  6. ie8 ajaxSubmit 上传文件提示下载
  7. linux mask 特殊权限位,Linux 特殊权限
  8. mysql8 修改密码_MySQL 8.0 解决:ERROR 2002、ERROR 1045 登陆问题
  9. LOJ #6268. 分拆数
  10. 一文搞懂激活函数(Sigmoid/ReLU/LeakyReLU/PReLU/ELU)
  11. 日语入门选什么书好?
  12. 微型计算机主要性能指标是什么,微型计算机的主要性能指标
  13. 个税计算python版(2021最新版)
  14. chrome 隐藏 地址栏_如何在Chrome中隐藏地址栏
  15. mysql b 树 字符串索引_Mysql从入门到入神之(四)B+树索引
  16. 当年腾讯为什么从QQ转移扶植到微信,如今微信已撑起腾讯半壁江山
  17. Samsung手机常用工程命令
  18. 软件项目管理实验一附加
  19. 微博点赞数等信息和公众号点赞数等信息爬取
  20. shell脚本实现文件改名/重命名

热门文章

  1. 大数据可视化有什么优点
  2. python3入门基础语法总结_Python基础语法总结(3)
  3. java项目整合mybatis_JavaWeb项目整合Spring,SpringMVC,Mybatis框架
  4. Java回调网址_极光短信- 回调接口 - 极光文档
  5. AcWing 878. 线性同余方程(拓展欧几里得)
  6. java jersey get_java – Jersey GET请求可以返回一个多态实体吗​​?
  7. python gui下载进度条_对python GUI实现完美进度条的示例详解
  8. 邓迪大学计算机专业,邓迪大学计算机科学本科专业申请.pdf
  9. ML Pipeline原理
  10. Caffe︱构建lmdb数据集、binaryproto均值文件及各类难辨的文件路径名设置细解