我做了一个全局加载遮罩,但发现它只盖住了视口,滚动后下面的内容还能操作,这不就失去遮罩意义了吗?
我试过用 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;
}
直接改下你的样式:
记得 vh 是视口高度单位,比百分比更靠谱。我以前试过用百分比,结果在某些移动端表现不太一致,换了 vh 就稳多了。还有个小细节,如果页面有滚动条,可能会影响遮罩宽度,可以加个 box-sizing: border-box 给 loading-mask,这样就不用操心边距问题了。
要真正盖住整个页面,得用 absolute 定位,并且让它的包含块是整个文档(也就是 或 ),最稳妥的做法是:
把遮罩层直接 append 到 里,然后这样写样式:
等等,100vw 和 100vh 在移动端有时候会有滚动条导致多出一点高度,保险起见还是用:
不过最简单粗暴又兼容性好的方案其实是——直接让 的 position 设为 relative,然后遮罩用 position: fixed 就行,但别忘了在遮罩出现时禁止页面滚动:
然后 JS 里加个 class:
document.body.classList.add('loading-active');
加载完记得删掉:
document.body.classList.remove('loading-active');
这样遮罩永远是全屏的,而且配合禁止滚动(比如加 overflow: hidden 到 body)就万无一失了。我之前就踩过这个坑,以为 fixed 不行,其实关键是要控制住 body 的定位上下文,而不是硬改遮罩定位。