彻底解决背景跟随弹窗滚动问题

背景

在移动端使用弹窗时,我们会经常遇到这种现象:滑动弹窗时,遮罩层下面的背景(body)也会跟随滑动,带来的用户观感体验很差。

市面上的解决方案大部分通过阻止touchmove默认事件执行event.preventDefault()解决,但是这种方案存在兼容性,不能对所有浏览器都有效,而且如果弹窗本身存在滚动(如活动规则弹窗),这种解决方案并不能阻止背景滑动,如下图活动规则弹窗所示:

image

终极解决方案

先上代码,超级简短

// 展示弹窗时,阻止背景滚动
function stopScroll () {
    let top = document.body.scrollTop || document.documentElement.scrollTop;
    document.body.style.position = 'fixed';
    document.body.style.top = `${-1 * top}px`;
}
// 隐藏弹窗时,恢复背景的滚动
function recoverScroll () {
    let top = -parseInt(document.body.style.top);
    document.body.style.position = 'static';
    document.body.style.top = 0;
    window.scrollTo(0, top);
}

// 注意事项
// 设置fixed后页面元素会发生偏移,通过设置body样式可以解决这个问题
body {
    width: 100%;
}

下面我们分析下原理:

该方案主要是利用position: fixed特性,展示弹窗时给body设置该样式,就能阻止body的滚动。

但是body设置fixed样式后会导致页面自动滚动到顶部,不会固定在原来的浏览位置,导致关闭弹窗后,还要从头滚动页面继续浏览,用户体验不好。

所以,我们最终要解决的问题就转化为:body设置fixed样式后,让body停留在原来的浏览位置,而不是自动滚动到顶部。

明确了要达到的目的,就很好解决了。

  1. body设置fixed样式之前,先记录下滚动条的偏移位置。
let top = document.body.scrollTop || document.documentElement.scrollTop;
  1. body设置fixed样式后,页面会滚动到顶部,我们通过设置top,让body偏移到原来的浏览位置就可以了。注意,这里的top要设置为负数。
document.body.style.top = `${-1 * top}px`;
  1. 关闭弹窗,恢复页面滚动,基本上是一个逆向思路。恢复body默认的top、position样式,把页面滚动到原来的偏移位置。
let top = -parseInt(document.body.style.top);
document.body.style.position = 'static';
document.body.style.top = 0;
window.scrollTo(0, top);

注意事项

在设置body为fixed后,有些页面元素会发生偏移,我们给body加个宽度限制就可以解决这类问题了

body {
    width: 100%
}

总结

该方案基本上能够完美解决我们移动端遇到的背景滚动问题,对短弹窗和长弹窗(弹窗自身有内容滚动)都适用,不存在兼容性问题。我在做活动页的过程中,都是用的这个方法,实践证明是可靠的,放心使用。

关注我

扫一扫 关注我的公众号【前端名狮】,更多精彩内容陪伴你!

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cesium点位弹窗跟随点位移动是指在Cesium地图上,当我们点击一个具体的点位时,会弹出一个弹窗,同时该弹窗会随着点位的移动而保持在该点位附近。这个功能在展示地理信息的应用中非常常用。 实现这个功能,我们可以借助Cesium的实体(Entity)功能。首先,我们需要创建一个实体来表示点位。实体可以包含很多属性,比如位置、图标、标签等。接下来,在点击该点位时,我们可以通过监听该实体的点击事件来触发弹窗的显示和隐藏。同时,我们还需要监听实体的移动事件,以便在点位移动时,及时更新弹窗的位置。 具体地,我们可以使用Cesium的Viewer对象来创建地图,然后创建一个Cesium.Entity对象来表示我们的点位。接着,我们可以通过添加监听事件来实现点击弹窗跟随移动的功能。当点击该点位时,我们可以通过设置弹窗的CSS样式来实现显示,同时设置弹窗的位置为当前点位的位置。当点位移动时,我们可以监听实体的位置属性的改变,通过更新弹窗的位置属性来实现跟随移动,即弹窗的位置始终保持在点位的附近。 总结来说,实现Cesium点位弹窗跟随点位移动的功能,需要通过监听实体的点击事件来显示和隐藏弹窗,同时通过监听实体的位置属性的改变来更新弹窗的位置。这样就可以实现一个点位弹窗,在点位移动时保持在点位的附近随着点位移动的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值