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 铺满页面的。
这样就大功告成了。
感谢其他分享的博主