美文网首页
js 拖拽元素(vue)

js 拖拽元素(vue)

作者: 你猜_3214 | 来源:发表于2019-07-26 14:06 被阅读0次

标题为啥写vue呢?原因我的这个功能是在vue的项目里面的,然而实际上是用js实现的,与vue并无太大的关系。

如果你跟我一样,也是vue项目,那在拖拽的函数内部this的指向是有问题的,一定要在外部定义that。

这样编辑看着好丑呀,不知道别人的代码段是咋放上来的。

我发布该文章,一方面是造福跟我有一样需求的小伙伴,另外一方面是做个记录,方便自己以后查询。

闲话少叙,言归正传。如果你发现safari里面拖拽距离计算的有问题,那可能是样式影响的,也可能是浏览器的什么问题。反正我当时做完后在谷歌浏览器是完美的。后来优化了其他的样式问题,发现在Safari里好用了,也OK了。我也想还原找到原因,奈何改了太多样式了,且没有备份。尝试改回去,复现bug,但失败了。

上干货!

元素1:id="leftVideoOut",335px*188px

元素2:ref="mainVideo"。

功能需求:两个元素大概这样布局。当元素2全屏的时候,元素1要可以随意拖放,但要全部显示在屏幕内。

mounted() {

const that = this

var e = e || window.event; //兼容IE浏览器

var x1 = 0;

var y1 = 0;

var x2 = 0;

var y2 = 0;

var leftVideo = document.getElementById('leftVideoOut')

leftVideo.ondragstart = function(e) {

x1 = e.clientX

y1 = e.clientY

}

leftVideo.ondragend = function(e) {

const w0 = that.$refs.mainVideo.offsetWidth

const h0 = document.body.clientHeight

x2 = e.clientX

y2 = e.clientY

var left = leftVideo.offsetLeft - (x1 - x2)

var top = leftVideo.offsetTop - (y1 - y2)

left<0?left = 0 :left = left

left>w0-335?left = w0-335:left = left;

top<0?top = 0 :top = top

top>h0-188?top = h0-188:top = top;

leftVideo.style.left = left + "px"

leftVideo.style.top = top + "px"

}

上面方法莫名奇妙的由原来的不好用变好用了,现在又莫名其妙的表不好用了。

百度到了一个比较好的处理方法,暂时是没有发现问题:基于vue实现元素拖拽

ps:主要还是时间上的表现不一致,drag  api是html5的规范,mouse模型很古老了,几乎所有的浏览器都实现的差不多。mouse模型可以做到元素跟随鼠标移动。 drag只能做到一个虚的轮廓跟随鼠标移动,实际上元素还在原来的位置上。

相关文章

网友评论

      本文标题:js 拖拽元素(vue)

      本文链接:https://www.haomeiwen.com/subject/subrrctx.html