vue移动端横向滑动,vue弹窗后如何禁止滚动条滚动

  vue移动端横向滑动,vue弹窗后如何禁止滚动条滚动

  本文主要介绍vue解决移动弹窗滚动渗透问题的方法,帮助大家更好的理解和使用Vue框架。感兴趣的朋友可以了解一下。

  

一、问题描述

  在移动端的H5页面中,我们经常会遇到“点击按钮-弹出窗口-选择选项”的场景。当选项过多时,滚动到容器的底部或顶部。当你再次上下拖动滚动条时,滚动动作会穿透,底部的正文也会一起滚动。

  总结:当内容滚动到容器的顶部或底部,然后强行向上或向下滚动,就发生了滚动穿透。

  

二、解决方案思考

  参考了很多网上的解决方案,可以分为三种。经过仔细思考和分析,个人总结如下:

  使用js来控制和改变css

  1.弹出窗口出现

  1.1.记录单击弹出按钮的滚动条。

  1.2.赋予正文样式{overflow: hidden}

  2.关闭弹出窗口

  2.1.取消正文样式{ 溢出:隐藏 }

  2.2.给出正文样式{top: scrollTop}

  优点:实施简单快捷。

  缺点:当弹窗打开和关闭时,如果弹窗不全窗,会看到机身闪烁。

  使用js控制弹出内容区域的默认滚动事件。

  1.弹出窗口出现

  1.1.监听内容容器layoutBox的touchstart和touchmove事件。

  1.2.监听touchstart事件,知道手指滚动内容区域的起始位置,targetY。

  1.3.监听touchmove事件,了解滚动内容区域过程中改变的位置newTargetY。

  1.4.获取scrolltop距容器顶部的距离/可滚动内容的scrollheight当前容器的高度clientHeight。

  1.5.当滚动到顶部和底部时,阻止内容容器的默认行为。(要点)

  2.弹出窗口通常是关闭的。

  优点:从滚动渗透问题的源头入手,解决问题,js实现不存在ios兼容问题

  缺点:根据实机验证,个别品牌机型存在兼容性问题。

  弹出内容区禁止滚动,用js模拟滚动条。

  1.弹出窗口出现

  1.1.监视touchmove事件,以始终阻止默认行为。

  1.2.侦听touchstart和touchmove事件以记录手指的移动距离,并使用transform: translate3d()属性滚动内容。

  2.弹出窗口通常是关闭的。

  优点:js实现没有ios兼容性问题。

  缺点:ios上失去了原生滚动条的反弹体验。

  

三、初步实现

  把它写成mixin

  /**

  * @作者存航_魏

  * @description解决了弹窗内容区滚动到正文的问题。

  * @param $refs.layoutBox需要提前指定内容容器

  */

  导出默认值{

  data () {

  返回{

  目标:0

  }

  },

  已安装(){

  如果(这个。$refs.layoutBox) {

  这个。$ El . addevent listener( touch start ,this.handleTouchstart)

  这个。$ El . addevent listener( touch move ,this.handleTouchmove,false)

  }

  },

  方法:{

  handleTouchstart (e) {

  this . target=math . floor(e . target touches[0])。clienty)//手指的初始触摸位置

  console.log(handleTouchstart ,this.targetY)

  },

  handleTouchmove (e) {

  Layoutbox=this。$ refs.layoutbox//Content集装箱

  设target=math . floor(e . target touches[0])。clienty)//手指滑动时的触摸位置

  stop=layoutbox.scrolltop//The内容滚动到容器顶部的高度

  let height=layoutbox.scrollheight//The内容的可滚动高度

  Cliheight=当前内容容器的layoutbox.clientheight//The高度

  if(sTop=0 new targety-this . targety 0 e . cancelable){

  Console.log(“下拉到页面顶部”)

  预防默认()

  } else if(sTop=she height-cliHeight new target y-this . target y 0 e . cancelable){

  Console.log(“翻到页面底部”)

  预防默认()

  }

  }

  },

  销毁前(){

  如果(这个。$refs.layoutBox) {

  这个。$ El . removeeventlistener( touch start ,this.handleTouchstart)

  这个。$ El . removeeventlistener( touch move ,this.handleTouchmove)

  }

  }

  }

  写完之后发现每次控制弹窗的滚动穿透都需要引入这个mixin文件,比较繁琐。我查了一下Vue的官方文档,找到了一个更好的方法,就是全局指令。

  

四、写法优化

  编写一个全局命令不通过。

  /**

  * @作者存航_魏

  * @description解决了弹窗内容区域滚到正文的问题(覆盖率90%)

  **/

  //@描述用法

  //ul v-不通过

  //李/李

  //李/李

  ///ul

  //使用vuex的保存全局变量

  从“src/vuex/modules/home/state”导入状态

  导出默认值{

  名称:非直通,

  bind:函数(el,binding) {

  const handleTouchstart=函数(事件){

  state . target=math . floor(event . target touches[0])。clienty)//手指的初始触摸位置

  }

  const handleTouchmove=function(event){

  let target=math . floor(event . target coaches[0])。clienty)//手指滑动时的触摸位置

  stop=el.scrolltop//Content滚动到容器顶部的高度

  let height=el.scrollheight//The内容的可滚动高度

  Cliheight=当前内容容器的el.clientheight//The高度

  if(sTop=0 new targety-state . targety 0 event . cancelable){

  Console.log(“下拉到页面顶部”)

  事件. preventDefault()

  } else if(sTop=s height-cliHeight new targety-state . targety 0 event . cancelable){

  Console.log(“翻到页面底部”)

  事件. preventDefault()

  }

  }

  El . addevent listener( touch start ,handleTouchstart)

  el.addEventListener(touchmove ,handleTouchmove,false)

  },

  unbind:函数(el,binding) {

  //重置全局变量targetY

  state.targetY=0

  }

  }

  //最后去main.js注册一个全局指令,就可以用了。

  

实机测试

  Ios测试通过了ios13

  小米和红米手机测试通过Android 10

  一加手机测试通过Android 10

  华为手机测试通过emui11 Android 10

  三星S8上存在兼容性问题(初步估计与三星webView的底层实现有关)

  

总结

  解决问题的关键是清楚地知道什么时候会发生滚动渗透。

  写的优化可以简化代码,让代码更优雅。

  以上是vue解决移动弹窗滚动渗透的详细内容。更多关于Vue解决弹窗滚动渗透的方法,请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: