| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- /**
- * v-dialogDrag 弹窗拖拽
- * Copyright (c) 2019 ruoyi
- */
- export default {
- bind(el, binding, vnode, oldVnode) {
- const value = binding.value;
- if (value == false) return;
- let initialTouchX = 0;
- let initialTouchY = 0;
- let initialLeft = 0;
- let initialTop = 0;
- el.addEventListener(
- 'touchstart',
- (e) => {
- e.stopPropagation();
- const touch = e.touches[0];
- initialTouchX = touch.clientX;
- initialTouchY = touch.clientY;
- initialLeft = e.currentTarget.offsetLeft;
- initialTop = e.currentTarget.offsetTop;
- },
- false
- );
- el.addEventListener(
- 'touchmove',
- function (e) {
- e.stopPropagation();
- const clientX = e.targetTouches[0].clientX;
- const clientY = e.targetTouches[0].clientY;
- // 限制拖拽范围
- const clientWidth = document.documentElement.clientWidth;
- const clientHeight = document.documentElement.clientHeight;
- // 计算边界限制
- const maxLeft = clientWidth - this.offsetWidth;
- const maxTop = clientHeight - this.offsetHeight;
- // 计算基于初始位置的移动量并应用边界限制
- const deltaX = clientX - initialTouchX;
- const deltaY = clientY - initialTouchY;
- const left = initialLeft + deltaX;
- const top = initialTop + deltaY;
- // 添加边界限制
- this.style.left = `${Math.max(0, Math.min(left, maxLeft))}px`;
- this.style.top = `${Math.max(0, Math.min(top, maxTop))}px`;
- },
- false
- );
- el.addEventListener('touchend', function (e) {}, false);
- },
- };
|