
本文介绍如何在 jquery ajax 请求期间,通过纯 css 方式为整个页面添加半透明灰色遮罩层,突出显示居中旋转的加载图标,无需修改 html 结构或引入额外 dom 元素。
本文介绍如何在 jquery ajax 请求期间,通过纯 css 方式为整个页面添加半透明灰色遮罩层,突出显示居中旋转的加载图标,无需修改 html 结构或引入额外 dom 元素。
实现“全页灰屏 + 加载图标”的核心目标,是让用户视觉焦点自然聚焦于加载状态,同时禁用(或弱化)背景交互感。许多开发者会本能地新增一个
配合 #loader 使用,但其实——仅靠一个 #loader 元素,配合巧妙的 CSS box-shadow 技巧,即可零 HTML 变更达成等效效果。✅ 推荐方案:利用超大 box-shadow 模拟全屏遮罩
关键思路是:将 #loader 的 box-shadow 扩展为覆盖整个视口的深色半透明层。由于 box-shadow 支持 inset 和 spread,我们使用 极大发散值(如 100vw)配合透明度控制,让阴影“撑满”屏幕,形成视觉上的灰屏。
以下是优化后的完整 CSS(已适配现代浏览器并增强可维护性):
#loader {
position: absolute;
left: 50%;
top: 50%;
z-index: 9999; /* 确保高于所有内容 */
width: 120px;
height: 120px;
margin: -60px 0 0 -60px; /* 更精确的居中:-height/2, -width/2 */
border: 16px solid #f3f3f3;
border-radius: 50%;
border-top-color: #3498db;
animation: spin 2s linear infinite;
/* ? 核心:全屏灰色遮罩(半透明白色底 + 深灰阴影)*/
background: rgba(255, 255, 255, 0.9);
box-shadow:
inset 0 0 0 100vw rgba(0, 0, 0, 0.4), /* 内阴影全覆盖,模拟遮罩 */
0 0 0 100vw rgba(0, 0, 0, 0.4); /* 外阴影兜底(兼容性补充)*/
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}? 为什么用 inset?
inset 内阴影会从元素自身边界向内扩散,结合 100vw 的 spread 值,可稳定覆盖整个视口宽度(即使页面有横向滚动条也基本兼容)。相比外阴影,它更不易受父容器 overflow 影响,且渲染性能更优。
✅ jQuery 控制逻辑(保持简洁可靠)
你现有的 ajaxStart / ajaxStop 绑定完全可用,只需确保 #loader 初始为隐藏状态:
<!-- HTML 中仅需保留这一行 --> <div id="loader" style="display: none;"></div>
$(document).ajaxStart(function() {
$("#loader").show();
});
$(document).ajaxStop(function() {
$("#loader").hide();
$('#cancelBtn').removeAttr('hidden');
});⚠️ 注意事项与最佳实践
- 层级安全:z-index: 9999 是保守设定,若项目中存在更高 z-index(如弹窗、导航栏),请统一检查并调整,推荐使用 CSS 自定义属性管理层级变量。
-
移动端适配:100vw 在 iOS Safari 中可能因地址栏缩放产生微小偏差,可追加媒体查询微调:
@media (max-width: 768px) { #loader { box-shadow: inset 0 0 0 101vw rgba(0,0,0,0.4); } } - 无障碍友好:灰屏期间建议临时禁用键盘 Tab 导航(document.body.setAttribute('aria-hidden', 'true'))并在加载结束时恢复,提升残障用户操作体验。
- 性能提示:避免在 box-shadow 中使用过大的模糊值(如 50px),本例中 0 模糊值保证了 GPU 加速渲染,无卡顿风险。
✅ 总结
无需新增 DOM、不依赖 JavaScript 动态插入 overlay、不修改现有 HTML 结构——仅通过一行 box-shadow: inset 0 0 0 100vw ...,即可优雅实现专业级全屏加载遮罩。该方案轻量、高效、兼容性强,是现代前端加载态 UI 的推荐实践之一。










