Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dialog弹层能做个拖拽吗 #477

Closed
seean-chan opened this issue Mar 2, 2018 · 6 comments
Closed

dialog弹层能做个拖拽吗 #477

seean-chan opened this issue Mar 2, 2018 · 6 comments
Labels

Comments

@seean-chan
Copy link

No description provided.

@somnusnrlq
Copy link

`// v-dialogDrag: 弹窗拖拽 v-dialogDrag
Vue.directive('dialogDrag', {
bind(el, binding, vnode, oldVnode) {
const dialogHeaderEl = el.querySelector('.el-dialog__header');
const dragDom = el.querySelector('.el-dialog');
dialogHeaderEl.style.cursor = 'move';
dialogHeaderEl.style = "cursor:move;border: 1px solid #e2e2e4;";
// dialogHeaderEl.style.backgroundColor = "blue";
// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);

dialogHeaderEl.onmousedown = (e) => {
  // 鼠标按下,计算当前元素距离可视区的距离
  const disX = e.clientX - dialogHeaderEl.offsetLeft;
  const disY = e.clientY - dialogHeaderEl.offsetTop;

  // 获取到的值带px 正则匹配替换
  let styL, styT;

  // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
  if (sty.left.includes('%')) {
    styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100);
    styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);
  } else {
    styL = +sty.left.replace(/\px/g, '');
    styT = +sty.top.replace(/\px/g, '');
  };

  document.onmousemove = function (e) {
    // 通过事件委托,计算移动的距离 
    const l = e.clientX - disX;
    const t = e.clientY - disY;

    // 移动当前元素  
    dragDom.style.left = `${l + styL}px`;
    dragDom.style.top = `${t + styT}px`;

    //将此时的位置传出去
    //binding.value({x:e.pageX,y:e.pageY})
  };

  document.onmouseup = function (e) {
    document.onmousemove = null;
    document.onmouseup = null;
  };
}

}
})
`

使用:
。。。。

@somnusnrlq
Copy link

<el-dialog v-dialogDrag append-to-body :visible.sync="dialogVisible">

@PanJiaChen
Copy link
Owner

@somnusnrlq 欢迎pr

@whjin
Copy link

whjin commented Dec 17, 2019

`// v-dialogDrag: 弹窗拖拽 v-dialogDrag
Vue.directive('dialogDrag', {
bind(el, binding, vnode, oldVnode) {
const dialogHeaderEl = el.querySelector('.el-dialog__header');
const dragDom = el.querySelector('.el-dialog');
dialogHeaderEl.style.cursor = 'move';
dialogHeaderEl.style = "cursor:move;border: 1px solid #e2e2e4;";
// dialogHeaderEl.style.backgroundColor = "blue";
// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
const sty = dragDom.currentStyle || window.getComputedStyle(dragDom, null);

dialogHeaderEl.onmousedown = (e) => {
  // 鼠标按下,计算当前元素距离可视区的距离
  const disX = e.clientX - dialogHeaderEl.offsetLeft;
  const disY = e.clientY - dialogHeaderEl.offsetTop;

  // 获取到的值带px 正则匹配替换
  let styL, styT;

  // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
  if (sty.left.includes('%')) {
    styL = +document.body.clientWidth * (+sty.left.replace(/\%/g, '') / 100);
    styT = +document.body.clientHeight * (+sty.top.replace(/\%/g, '') / 100);
  } else {
    styL = +sty.left.replace(/\px/g, '');
    styT = +sty.top.replace(/\px/g, '');
  };

  document.onmousemove = function (e) {
    // 通过事件委托,计算移动的距离 
    const l = e.clientX - disX;
    const t = e.clientY - disY;

    // 移动当前元素  
    dragDom.style.left = `${l + styL}px`;
    dragDom.style.top = `${t + styT}px`;

    //将此时的位置传出去
    //binding.value({x:e.pageX,y:e.pageY})
  };

  document.onmouseup = function (e) {
    document.onmousemove = null;
    document.onmouseup = null;
  };
}

}
})
`

使用:
。。。。

这个有对应的移动端版本吗?

@sunpu007
Copy link

将对应的监听换成touchstart、touchmove、touchend即可

@whjin
Copy link

whjin commented Dec 18, 2019

这个问题我已经解决了 现在遇到的问题是怎么让手机或ipad浏览器支持HTML5的拖放

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants