拖拽效果的实现原理分析2
上文对html5支持的浏览器的拖拽效果进行了分析,本文不采用任何库,来分析下拖拽的过程
先想想我们平时拖拽是怎么操作的,大致可以分为几下几个步骤:
- 鼠标按下,鼠标移动,拖拽,被拖动的物件跟着走
- 鼠标松开,物件停止,无拖动了
- 计算距离,拖拽的距离(鼠标移动)
对应在事件上就是
- onmousedown,onmousemove ,开始拖拽
- onmouseup ,停止拖拽
- 计算相对的拖拽距离
下面我们按照这种思路,写一个拖拽效果,假设我们拖动标题,这块的内容就跟着走。
- 首先我们来写一个含有标题和内容的块
css为: #doc{border:1px solid #a0b3d6; background:white;position:absolute; left:150px; top:150px;} #title{line-height:24px; background:gray; border-bottom:1px solid #a0b3d6; padding-left:5px; cursor:move;} #content{width:320px; height:150px;} html: < div id="doc"> < div id="title">标题</ div > < div id="content"> 内容…… </ div > </ div > |
首先在拖动的时候,我们要计算拖动对象的相对于屏幕的上方和下方的距离
top = target.top;
left = target.left;
书写onmousedown 事件,这个是能够被拖动对象上
title.onmousedown = function(event){
event = event||window.event;
//防止IE中的文字被选定选中
this.unselectstart = function(){
return false;
};
//记录开始的位置
curX = event.pageX ? event.pageX :event.clientX +document.body.scrollLeft||document.documentElement.scrollLeft;
curY = event.pageY ? event.pageY :event.clientY +document.body.scrollTop||document.documentElement.scrollTop;
}
书写onmousemove 事件,这个是在文档中移动的,顾应该加在document上
document.onmousemove = function(event){
event = event||window.event;
var nowX = event.pageX ? event.pageX :event.clientX +document.body.scrollLeft||document.documentElement.scrollLeft,
nowY = event.pageY ? event.pageY :event.clientY +document.body.scrollTop||document.documentElement.scrollTop;
var disX = nowX - curX,
disY = nowY - curY;
target.style.top = top +disY;
target.style.left = left +disX;
书写onmouseup 事件,这个也是在文档中的,加在document上吧
document.onmouseup = function(event){
event = event||window.event;
left = target.left;
top = target.top;
}
完整的代码如下:
var params = {
left: 0,
top: 0,
currentX: 0,
currentY: 0,
flag: false
};
//获取相关CSS属性
var getCss = function(o,key){
return o.currentStyle? o.currentStyle[key] : document.defaultView.getComputedStyle(o,false)[key];
};
var startDrag = function(title, target){
params.left = getCss(target, "left");
params.top = getCss(target, "top");
title.onmousedown = function(event){
event = event||window.event;
bar.onselectstart = function(){
return false;
}
params.flag = true;
params.currentX = event.pageX ? event.pageX :event.clientX +document.body.scrollLeft||document.documentElement.scrollLeft,
params.currentY = event.pageY ? event.pageY :event.clientY +document.body.scrollTop||document.documentElement.scrollTop;
};
document.onmouseup = function(){
params.flag = false;
params.left = getCss(target, "left");
params.top = getCss(target, "top");
};
document.onmousemove = function(event){
event = event ||window.event;
if(params.flag){
var nowX = event.pageX ? event.pageX :event.clientX +document.body.scrollLeft||document.documentElement.scrollLeft,
nowY = event.pageY ? event.pageY :event.clientY +document.body.scrollTop||document.documentElement.scrollTop;
var disX = nowX - params.currentX,
disY = nowY - params.currentY;
target.style.left = parseInt(params.left) + disX + "px";
target.style.top = parseInt(params.top) + disY + "px";
}
}
};
本文完。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述