不用 JS,轻松锁定页面滚动!

在平时开发中,经常会遇到这样一种问题:当打开一个弹窗时,后面的页面是可以滚动的,演示如下:

那么,该如何锁定页面的滚动呢?

一、传统的实现方式

传统的方式其实也不复杂,就是在打开弹窗时阻止滚动就行了,通常是改变overflow属性

const openModal = () => {
document.body.style.overflow = 'hidden'
}

const closeModal = () => {
document.body.style.overflow = 'auto'
}

如果是在现代框架里,比如vue,可以用监听弹窗状态来实现

watch(
() => show.value,
(val) => {
if (val) {
document.body.style.overflow = 'hidden'
} else {
document.body.style.overflow = 'auto'
}
},
)

这样就能锁定滚动了

二、传统方式的局限

虽然上面的实现看似完美,其实还有潜在问题的。比如有多个弹窗,弹窗覆盖的情况下,这个时候锁定就会出问题了。

因为在关闭第二个弹窗的时候,页面已经解除锁定了,所以在第一个弹窗还在的时候,页面已经可以滚动了

如果想要优化这个问题,还需要做进一步判断。

三、借助 CSS has 实现

现在有了CSS :has伪类,一切就好办了,无需过多的判断,直接一个选择器搞定

body:has(dialog[open]){
overflow: hidden
}

这行选择器表示,只要有属性为open的弹窗,body就自动锁定,无论有多少层弹窗

是不是非常简单?

完整代码可以查看:CSS has lock scroll (juejin.cn)[1]

四、has已经全兼容了

提一下兼容性,目前现代浏览器都支持了,如下

[1] CSS has lock scroll (juejin.cn): https://code.juejin.cn/pen/7357637625827573800


推荐阅读  点击标题可跳转

1、React 渲染流程可视化,有大佬实现了!

2、重磅更新!ECMAScript 2024 全新特性全面解析

3、VSCode无限画布模式(可能会惊艳到你的一个小功能)

相关推荐

  • RAG中的Query改写思路之查询-文档对齐评分优化:兼看昨日大模型进展总结回顾
  • 统计学入门:时间序列分析基础知识详解
  • 李飞飞创业:3 个月估值破 10 亿美元
  • CVPR 2024 录用数据出炉!这几个方向爆火 。。。
  • 假开源真噱头?Meta再陷「开源」争议,LeCun被炮轰Meta只是开放模型
  • 清华提出时间序列大模型:面向通用时序分析的生成式Transformer | ICML 2024
  • xAI创立未足年,创始工程师Kosic离职重返老东家OpenAI,巨头人才之战热度升级
  • 「数据墙」迫近?苹果OpenAI等巨头走投无路,被迫「偷师」YouTube视频!
  • 奥特曼深夜发动价格战,GPT-4o mini暴跌99%!清华同济校友立功,GPT-3.5退役
  • 13个漂亮的登录页面,附源代码地址
  • 30s到0.8s,记录一次接口优化成功案例!
  • 45K*16薪,这波跳槽不亏。。。
  • 大模型知识机理与编辑专场 | 7月23日 19:00直播
  • 公理训练让LLM学会因果推理:6700万参数模型比肩万亿参数级GPT-4
  • 15 年功臣、英伟达首席科学家在股价巅峰期黯然辞职:手握大笔财富,但我为我的工作感到遗憾
  • 经五轮面试终于拿到微信的offer,却只能无奈放弃
  • Vue 组件管理的新趋势!以后可能不再需要组件库了?
  • 重磅推荐:一个开源的即时通讯应用 Tailchat
  • 两个各有特长的即时通讯开源项目
  • 2024年最新的50个AI工具来了,网友评论:yyds!这也太好用了!