css 拖拽事件

转载:https://blog.csdn.net/u013040887/article/details/83059094

这里写的是一个原生js实现拖拽的效果,首先:

1、实现拖拽的三大事件,是要首先清楚的

onmousedown (鼠标按下的时候)、onmousemove(鼠标移动的时候)、onmouseup(鼠标松开的时候)

2、给目标元素加上onmousedown时间,记录鼠标按下的时候,鼠标距离所在元素的位置(就是鼠标距离所在元素边界的距离left、top)记录为disX、disY。要注意的是,要移动的是这个元素,就要算出鼠标坐标与这个元素边界的距离,拖动过程中,鼠标与元素边界位置距离是不变的。

3、当onmousedown发生后,给document添加onmousemove事件,可以根据一下公司不断刷新目标元素的实时位置
--------------------- 
 

 
  1. 目标元素.left = oEvent。clientX - disX + 'px';

  2.  
  3. 目标元素.top = oEvent .clientY - disY + 'px';

4、在onmousemove完成后,给document再添加omouseup时间,取消document的onmousemove时间

过程就是以上3个步骤,直接看原理也许晦涩难懂,这里就用代码来直接显示吧;

 
  1. var obox = document.getElementById('drag')

  2. //1、给需要移动的元素添加onmousedown事件,给拖动做好准备

  3. obox.onmousedown = function(evt) {

  4. var oEvent = evt || event; //获取事件对象,这个是兼容写法

  5. var disX = oEvent.clientX - parseInt(obox.style.left);

  6. var disY = oEvent.clientY - parseInt(obox.style.top);

  7.  
  8. //这里就解释为什么要给document添加onmousemove时间,原因是如果你给obox添加这个事件的时候,当你拖动很快的时候就很快脱离这个onmousemove事件,而不能实时拖动它

  9. document.onmousemove = function(evt) { //实时改变目标元素obox的位置

  10. var oEvent = evt || event;

  11. obox.style.left = oEvent.clientX - disX + 'px';

  12. obox.style.top = oEvent.clientY - disY + 'px';

  13. }

  14. //停止拖动

  15. document.onmouseup = function() {

  16. document.onmousemove = null;

  17. document.onmouseup = null;

  18. }

  19. }

上面是就实现拖拽的原理;还有一些原理不清楚就是clientX这些距离问题,我这里用一张图来表示吧

 

在拖拽的过程中,每次都要算出这个top,left只也是很麻烦,在js有几个很好用的属性:

offsetLeft:相对参照物的左边距离
offsetTop:相对参照物的上边距离(就如box.offsetTop,就是相对于父元素上边边距的距离)
offsetWidth:元素节点的宽度(相对于width,但是没有单位)
offsetHeight:元素节点的高度
offsetX:事件对象的属性,用这个属性,就可以不用计算鼠标距离所在元素边界的距离disX的值了,可以直接disX = oEvent.offsetX;得到
offsetY:事件对象的属性,同理offsetX;
offsetParent:参照物父元素
这里要注意的是,offsetLeft / offsetTop 都是只读的
--------------------- 

您想实现一个可以拖动放大的效果,可以使用CSS3的transform属性和JavaScript的事件监听功能来实现。 首先,您可以使用CSS3的transform属性中的scale()方法来实现放大效果。比如,您可以设置一个元素的transform属性为scale(2),表示将该元素放大两倍。 接下来,您可以使用JavaScript的事件监听功能来监听鼠标的拖拽事件。当用户在元素上按下鼠标时,记录下当前的鼠标位置。然后,在用户拖动鼠标时,计算出鼠标移动的距离,并将该距离应用到元素的transform属性中,实现拖动放大的效果。 下面是一个简单的示例代码,可以帮助您理解如何实现该效果: HTML代码: ``` <div id="box"></div> ``` CSS代码: ``` #box { width: 100px; height: 100px; background-color: red; transition: transform 0.3s ease; } ``` JavaScript代码: ``` var box = document.getElementById('box'); var isDragging = false; var startX, startY; box.addEventListener('mousedown', function(e) { isDragging = true; startX = e.clientX; startY = e.clientY; }); document.addEventListener('mousemove', function(e) { if (!isDragging) { return; } var deltaX = e.clientX - startX; var deltaY = e.clientY - startY; var scale = Math.max(1, deltaX / 100 + 1); box.style.transform = 'scale(' + scale + ')'; }); document.addEventListener('mouseup', function(e) { isDragging = false; }); ``` 在这个例子中,我们在页面中创建了一个红色的正方形元素,使用CSS的transition属性实现了平滑的动画效果。然后,我们使用JavaScript实现了拖动放大的效果。当用户按下鼠标时,我们记录下当前的鼠标位置,并将isDragging变量置为true,表示用户正在拖动元素。当用户拖动鼠标时,我们计算出鼠标移动的距离,并根据该距离计算出放大的比例。最后,我们将该比例应用到元素的transform属性中,实现拖动放大的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值