文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

借助CSS has实现打开弹窗时自动锁定滚动

2024-11-30 00:11

关注

分享一个 CSS 小技巧

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

图片

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

一、传统的实现方式

传统的方式其实也不复杂,就是在打开弹窗时阻止滚动就行了,通常是改变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

来源:前端侦探内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯