
本文介绍如何在 jquery ajax 请求期间,通过纯 css 实现全屏灰色遮罩效果,并保持原有加载图标居中显示,无需修改 html 结构,兼容性强且性能轻量。
本文介绍如何在 jquery ajax 请求期间,通过纯 css 实现全屏灰色遮罩效果,并保持原有加载图标居中显示,无需修改 html 结构,兼容性强且性能轻量。
在 Web 开发中,当发起异步请求(如 AJAX)时,为提升用户体验,常需暂时“禁用”页面交互并突出显示加载状态。常见的做法是叠加一层半透明灰色背景(即遮罩层),再将加载图标置于其中心。但许多开发者倾向于新增 dom 元素(如
实际上,仅通过优化现有 #loader 元素的 CSS 即可达成等效效果——无需改动 HTML 或 JavaScript,也无需监听额外事件。
核心原理:利用 box-shadow 模拟全屏遮罩
关键技巧在于使用超大尺寸的内阴影(box-shadow)覆盖整个视口。由于 #loader 已设置 position: absolute 且 z-index: 1,我们可通过以下方式扩展其视觉影响范围:
#loader { position: absolute; left: 50%; top: 50%; z-index: 1; width: 120px; height: 120px; margin: -76px 0 0 -76px; /* 精确居中偏移 */ border: 16px solid #f3f3f3; border-radius: 50%; border-top: 16px solid #3498db; animation: spin 2s linear infinite; /* ? 关键:用 box-shadow 创建全屏灰色遮罩 */ background: rgba(0, 0, 0, 0.4); /* 可选:增强图标自身对比度 */ box-shadow: 0 0 0 100vw rgba(0, 0, 0, 0.4); /* 水平/垂直偏移为 0,扩散半径 = 视口宽度 */ }
✅ 为什么有效?
box-shadow: 0 0 0 100vw 表示:无偏移、无模糊、但扩展半径达 100vw(即整个视口宽度)。配合 rgba(0,0,0,0.4),它会在 #loader 周围均匀渲染一层半透明黑色遮罩——由于扩散足够大,实际覆盖整个页面,形成视觉上的“灰屏”。
完整 CSS 示例(含动画兼容性)
#loader { position: absolute; left: 50%; top: 50%; z-index: 1050; /* 建议提高 z-index,避免被其他绝对定位元素遮挡 */ width: 120px; height: 120px; margin: -76px 0 0 -76px; border: 16px solid #f3f3f3; border-radius: 50%; border-top: 16px solid #3498db; animation: spin 2s linear infinite; background: rgba(255, 255, 255, 0.9); /* 白色底增强图标清晰度 */ box-shadow: 0 0 0 100vw rgba(0, 0, 0, 0.4); } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
JavaScript 保持简洁(无需任何变更)
你当前的 jQuery 事件绑定已完全适用:
$(document).ajaxStart(function() { $("#loader").show(); }); $(document).ajaxStop(function() { $("#loader").hide(); $('#cancelBtn').removeAttr('hidden'); });
✅ 加载开始时 #loader.show() → 遮罩自动生效;
✅ 加载结束时 #loader.hide() → 遮罩同步消失。
注意事项与最佳实践
- z-index 值建议 ≥ 1050:确保遮罩层高于常见组件(如 bootstrap Modal 默认为 1050),避免被意外遮挡。
- 慎用 100vh 替代 100vw:100vw 覆盖宽度足够,而 100vh 在移动端可能因地址栏缩放导致遮罩不完整;100vw 更鲁棒。
- 无障碍考虑:若页面需支持屏幕阅读器,建议在 ajaxStart 时添加 aria-busy=”true” 到 ,并在 ajaxStop 时移除:
$(document).ajaxStart(() => { $('body').attr('aria-busy', 'true'); $('#loader').show(); }); $(document).ajaxStop(() => { $('body').removeAttr('aria-busy'); $('#loader').hide(); $('#cancelBtn').removeAttr('hidden'); }); - 性能提示:该方案纯 CSS 实现,无重排(reflow),比动态插入/删除 DOM 元素更高效。
通过这一轻量级优化,你既保留了原有代码结构的简洁性,又显著提升了加载态的视觉引导效果——真正做到了“零 HTML 修改,一行 CSS 升级体验”。