需求:实现页面中有个可拖动的悬浮球
问题:在ios中,由于微信浏览器存在下拉回弹的特性,所以悬浮球拖拽的时候会引起整个页面的拖动,所以需要禁止掉浏览器默认事件,这样在拖动悬浮球时就不会出现问题了
解决办法:
(1)最简单粗暴的方法,就是禁止掉浏览器整个页面的滑动
document.body.addEventListener('touchmove', function (e) {
e.preventDefault()
}, {passive: false})
上边代码块中的方法一般不建议使用,除非整个页面都不可以滚动时
(2)除了需要滚动的部分,禁止掉浏览器滚动的默认事件(VUE中组件的部分代码)
methods: {
// 某些元素可以滚动的方法
overscroll (el){
el.addEventListener('touchstart', function() {
let top = el.scrollTop
let totalScroll = el.scrollHeight
let currentScroll = top + el.offsetHeight
if(top === 0) {
el.scrollTop = 1;
}else if(currentScroll === totalScroll) {
el.scrollTop = top - 1;
}
})
el.addEventListener('touchmove', function (evt) {
if(el.offsetHeight < el.scrollHeight)
evt._isScroller = true
})
},
// 监听事件方法
hiddenPrevent () {
if (!evt._isScroller) {
evt.preventDefault()
}
}
},
mounted () {
this.overscroll(document.querySelector('.content')) // 让class为content的部分有默认滚动事件
document.body.addEventListener('touchmove', this.hiddentPrevent, {passive: false})
},
destroyed () {
// 销毁时移除监听
document.body.removeEventListener('touchstart', this.hiddentPrevent, {passive: false})
document.body.removeEventListener('touchmove', this.hiddentPrevent, {passive: false})
}
注意:this.hiddenPrevent必须要写成一个方法,在监听事件事调用,如果写到监听中,移除时不会起作用,是由于在添加监听和移除监听中写的函数不是同一个内存地址了,所以移除监听会失效。