元素在有限范围内拖拽及磁性吸附

JS中元素在有限范围内拖拽及磁性吸附

这是我的第一篇博客。

一、在有限范围内的拖拽

原理:也就是在拖拽过程中,我们让元素在规定的范围内拖拽。在移动的过程中,我们对ev.client-oLeft/oTop的值进行限定。 实现过程:将ev.client-oLeft/oTop的值分别用变量存储起来,然后用if语句判断这个值的大小即可。 我们以此来做一个实例。让元素只能在可视区中移动。 以下是实现代码

<script>
window.onload = function() {
	
	var oDiv = document.getElementById('div")
	
	drag(oDiv);
	
	function drag(obj) {
		
		obj.onmousedown = function(ev) {
			var ev = ev || event;
			
			var disX = ev.clientX - this.offsetLeft;
			var disY = ev.clientY - this.offsetTop;
			
			if ( obj.setCapture ) {
				obj.setCapture();
			}
			
			document.onmousemove = function(ev) {
				var ev = ev || event;
				//用变量存储距离
				var L = ev.clientX - disX;
				var T = ev.clientY - disY;
				
				if ( L < 0 ) {
					L = 0;
				} else if ( L > document.documentElement.clientWidth - obj.offsetWidth ) {
					L = document.documentElement.clientWidth - obj.offsetWidth;
				}
				
				if ( T < 0 ) {
					T = 0;
				} else if ( T > document.documentElement.clientHeight - obj.offsetHeight ) {
					T = document.documentElement.clientHeight - obj.offsetHeight;
				}
				
				obj.style.left = L + 'px';
				obj.style.top = T + 'px';
				
			}
			
			document.onmouseup = function() {
				document.onmousemove = document.onmouseup = null;
				if ( obj.releaseCapture ) {
					obj.releaseCapture();
				}
			}
			
			return false;
			
		}
		
	}
	
}
</script>

在线操作

二、磁性吸附

磁性吸附也就是当鼠标将元素移动到某一个另元素附近时,元素直接被吸引过去。 原理:其实这个也是一种在有限范围内移动。只是将上述的代码中变量L和T的值限定一个范围 比如说,我们让元素在离文档距离200px的时候,元素就直接吸附上去。

<script>
window.onload = function() {
	
	var oDiv = document.getElementById('div');
	
	drag(oDiv);
	
	function drag(obj) {
		
		obj.onmousedown = function(ev) {
			var ev = ev || event;
			
			var disX = ev.clientX - this.offsetLeft;
			var disY = ev.clientY - this.offsetTop;
			
			if ( obj.setCapture ) {
				obj.setCapture();
			}
			
			document.onmousemove = function(ev) {
				var ev = ev || event;
				
				var L = ev.clientX - disX;
				var T = ev.clientY - disY;
				
				if ( L < 100 ) {
					L = 0;
				} else if ( L > document.documentElement.clientWidth - obj.offsetWidth ) {
					L = document.documentElement.clientWidth - obj.offsetWidth;
				}
				
				if ( T < 0 ) {
					T = 0;
				} else if ( T > document.documentElement.clientHeight - obj.offsetHeight ) {
					T = document.documentElement.clientHeight - obj.offsetHeight;
				}
				
				obj.style.left = L + 'px';
				obj.style.top = T + 'px';
				
			}
			
			document.onmouseup = function() {
				document.onmousemove = document.onmouseup = null;
				if ( obj.releaseCapture ) {
					obj.releaseCapture();
				}
			}
			
			return false;
			
		}
		
	}
	
}
</script>

在线操作


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过RecyclerView的LayoutManager获取到当前屏幕显示的所有Item的范围,然后在拖动事件的ACTION_DRAG_LOCATION事件中获取当前事件的x和y坐标,判断当前事件是否在当前屏幕显示的Item的范围内。具体实现可以参考以下代码: ``` recyclerView.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { RecyclerView recyclerView = (RecyclerView) v; RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: // do something break; case DragEvent.ACTION_DRAG_LOCATION: int x = (int) event.getX(); int y = (int) event.getY(); int itemCount = layoutManager.getItemCount(); for (int i = 0; i < itemCount; i++) { View itemView = layoutManager.findViewByPosition(i); Rect rect = new Rect(); itemView.getGlobalVisibleRect(rect); if (rect.contains(x, y)) { // 当前事件在当前屏幕显示的Item范围内 // do something break; } } break; case DragEvent.ACTION_DRAG_ENDED: // do something break; default: break; } return true; } }); ``` 在上面的代码中,我们通过RecyclerView的LayoutManager获取到当前屏幕显示的所有Item的范围,并在拖动事件的ACTION_DRAG_LOCATION事件中遍历所有的Item,判断当前事件是否在当前屏幕显示的Item的范围内。如果在范围内,就执行相应的操作。注意,这里使用的是itemView.getGlobalVisibleRect()方法获取到Item的范围,因为局部可见的Item可能会被RecyclerView的滑动机制隐藏掉,所以需要获取全局可见的范围

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值