加载遮罩怎么才能盖住整个页面?

皇甫综敏 阅读 38

我做了一个全局加载遮罩,但发现它只盖住了视口,滚动后下面的内容还能操作,这不就失去遮罩意义了吗?

我试过用 fixed 定位加 100% 宽高,但页面内容很长时,遮罩层高度还是只有当前屏幕那么高。是不是应该用别的定位方式?或者要监听 body 高度?

.loading-mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.5);
  z-index: 9999;
}
我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
シ子贺
シ子贺 Lv1
当时我也卡在这,fixed定位确实只能覆盖视口高度,解决办法其实挺简单,就是用 fixed 定位没错,但要记得给 html 和 body 都设置 100% 高度。

直接改下你的样式:

html, body {
height: 100%;
}

.loading-mask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh; /* 这里改成vh单位 */
background: rgba(0, 0, 0, 0.5);
z-index: 9999;
}


记得 vh 是视口高度单位,比百分比更靠谱。我以前试过用百分比,结果在某些移动端表现不太一致,换了 vh 就稳多了。还有个小细节,如果页面有滚动条,可能会影响遮罩宽度,可以加个 box-sizing: border-box 给 loading-mask,这样就不用操心边距问题了。
点赞
2026-03-30 20:12
司空欣胜
别走弯路,问题出在你用了 fixed 定位,它只相对于视口定位,所以只能盖住当前屏幕,滚动后就露馅了。

要真正盖住整个页面,得用 absolute 定位,并且让它的包含块是整个文档(也就是 或 ),最稳妥的做法是:

把遮罩层直接 append 到 里,然后这样写样式:

.loading-mask {
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.5);
z-index: 9999;
}


等等,100vw 和 100vh 在移动端有时候会有滚动条导致多出一点高度,保险起见还是用:

.loading-mask {
position: absolute;
top: 0;
left: 0;
min-width: 100vw;
min-height: 100vh;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
z-index: 9999;
}


不过最简单粗暴又兼容性好的方案其实是——直接让 的 position 设为 relative,然后遮罩用 position: fixed 就行,但别忘了在遮罩出现时禁止页面滚动:

body.loading-active {
position: relative;
}

.loading-mask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
z-index: 9999;
}


然后 JS 里加个 class:

document.body.classList.add('loading-active');

加载完记得删掉:

document.body.classList.remove('loading-active');

这样遮罩永远是全屏的,而且配合禁止滚动(比如加 overflow: hidden 到 body)就万无一失了。我之前就踩过这个坑,以为 fixed 不行,其实关键是要控制住 body 的定位上下文,而不是硬改遮罩定位。
点赞 4
2026-02-25 22:03