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

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

分享一个 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

责任编辑:武晓燕 来源: 前端侦探
相关推荐

2022-09-19 19:16:42

轮播图has

2022-06-23 06:42:06

CSSJS 监听

2022-10-31 19:10:39

CSS元素focus

2024-01-22 09:28:23

CSS前端滚动驱动

2023-11-22 07:47:34

2023-12-18 09:15:58

CSS前端容器查询

2010-09-13 16:04:27

CSS控制自动换行

2010-09-08 09:54:16

CSS自动换行CSS

2023-06-19 08:36:30

频率setData元素

2022-05-05 18:32:18

浏览器图片CSS

2011-09-02 10:14:10

JQuery滚动Xslider

2023-10-30 09:18:28

CSSColumns布局

2010-09-09 11:25:55

滚动条CSS

2014-11-17 15:20:07

SAPSAP HANA业务转型

2012-05-25 09:20:25

2010-09-09 10:56:56

CSS

2021-01-12 10:16:42

CSS 容器优化滚动

2009-06-03 10:32:36

Oracle性能优化分区技术

2015-03-18 14:56:58

负载均衡服务器集群

2023-07-31 09:35:49

图片对比功能CSS
点赞
收藏

51CTO技术栈公众号