【uniapp滚动穿透】 在u-modal中使用scroll-view底下主页面会跟随滚动

uniapp 在u-modal中使用scroll-view完美解决滚动穿透

看了很多关于这方面的内容,最后综合所有的方案,在真机上很好的实现了需求。
我取巧 通过在显隐dialog的时候 获取 当前的top 然后 动态改变overflow的状态,并修改top 以达到可以保存页面位置不变。同时让主页面在显示弹窗的时候,弹窗中的scrollview怎么滚动都不会导致主页滚动,隐藏弹窗又可以滚动
下面说下实现 show表示弹窗显隐
动态修改根view的style,都是根据弹窗显隐改变属性。
一、在页面根view动态设置style,顺序为 show?‘’:‘’
- overflow: visible/scroll
- top:getTop()
- height: winH
- position: fixed/unset
二、在显隐弹窗的view 设置id
三、思路
显示弹窗的时候,show改变时先获取该view的top,然后设为true,
此时 根view的样式 变为 不可滚动,top定义一个方法返回top + ’px‘ 即可,这样就保证了view不会滚动到顶部。 隐藏的时候是不需要top的,返回0px即可
四、代码如下

 <!--rootview-->
 :style="{
	'position':show?'fixed':'unset',
	'top': getTop(),
	'height':winH,
	'overflow':show?'visible':'scroll'
	}"
<!--设置id-->
<btton id="tpl" @clink='showDialog'...
showDialog() {
	uni.createSelectorQuery().in(this).select('.root-f')
	    .boundingClientRect()
		.exec(res => {
			this.show= true;
			this.rootTop = res [0].top;
			console.log("*** show dialog this.rootTop", this.rootTop)
	})

还有一个获取root页面高度的winH,这里就不写了,没有这个高度好像不能实现这个功能。我的是root view 铺满页面的。

这样就大功告成了。
感谢其他分享的博主

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
如果在Vue的a-modal组件外还有一个滚动区域,那么你需要在backToTop方法使用递归来实现回到顶部的功能。 具体的实现方法如下: 1. 在a-modal组件添加一个按钮元素,例如: ```html <a href="#" class="back-to-top" @click="backToTop">回到顶部</a> ``` 2. 在Vue实例定义backToTop方法,如下所示: ```javascript methods: { backToTop() { let scrollTop = document.documentElement.scrollTop || document.body.scrollTop; if (scrollTop > 0) { window.requestAnimationFrame(this.backToTop); window.scrollTo(0, scrollTop - scrollTop / 8); } } } ``` 在backToTop方法,我们使用递归和requestAnimationFrame函数来定时执行滚动操作,直到页面滚动到顶部为止。其scrollTop属性用于获取当前页面滚动的高度,scrollTo函数用于将页面滚动到指定的位置。 注意:需要在CSS设置.back-to-top元素的样式,以确保按钮始终在页面的右下角显示。例如: ```css .back-to-top { position: fixed; bottom: 20px; right: 20px; } ``` 同时,需要在外层滚动区域的父元素上添加一个ref属性,例如: ```html <div class="scroll-wrapper" ref="scrollWrapper"> <!-- 外层滚动区域的内容 --> </div> ``` 然后,在backToTop方法使用this.$refs.scrollWrapper来获取外层滚动区域的元素,例如: ```javascript methods: { backToTop() { let scrollWrapper = this.$refs.scrollWrapper; let scrollTop = scrollWrapper.scrollTop; if (scrollTop > 0) { window.requestAnimationFrame(this.backToTop); scrollWrapper.scrollTo(0, scrollTop - scrollTop / 8); } } } ``` 这样,就可以实现在a-modal组件回到顶部,并且处理了外层滚动区域的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值