伪元素遮罩层更轻量因无需额外DOM节点,减少渲染树深度和重排开销;需父容器设position: relative、::after设content: "",用inset: 0或四边定位控制尺寸,配合flex居中内容并避免伪元素内嵌文本。
伪元素
遮罩层为什么比
更轻量
因为不用额外 DOM 节点,减少渲染树深度和重排开销。尤其在列表项、卡片组件里反复使用时,
避免了成百上千个冗余
标签,CSS 引擎直接复用同一套样式逻辑。
常见错误是给父容器加了
却忘了设
,导致遮罩层被其他元素盖住;或者父容器没设宽高,
默认尺寸为 0,根本看不见。
父容器必须有明确的
(通常是
)
必须声明
,否则不渲染
遮罩尺寸靠
或
控制,不能只靠
若需响应式适配,优先用
替代四边分别写
半透明背景 + 内容居中怎么一起实现
很多人以为遮罩层和文字居中要分两层写,其实可以用一个
扛背景,再用
或
在父容器里垂直水平居中内容——这样既避免嵌套遮罩层,又不会因
引发模糊或闪烁。
典型错误是把文字也塞进
,但伪元素不能包含子节点,也不支持
;还有人给
加
想让它自己居中文本,结果发现完全无效。
立即学习
“
前端免费学习笔记(深入)
”;
遮罩用
,内容用真实子元素(比如
或
)
父容器设
的
推荐用
,别用
,否则会透出父容器里其他内容
如果父容器本身有 padding,记得在 flex 居中前确认是否要
:after 遮罩层在 Safari 和旧版 Chrome 的兼容细节
本身兼容性极好(IE8+),但容易出问题的是组合用法:比如
在 Safari 14.1 之前不支持,
叠加在遮罩上时,在 iOS 15.4 以下会失效且不报错。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
最常踩的坑是用了
优化性能,结果遮罩层突然消失——因为
会剪裁伪元素的绘制区域,必须配合
或显式提升合成层。
要兼容 Safari ≤14,用
替代
如果遮罩需要毛玻璃效果,
必须和
同时写
移动端真机测试必做:iOS 微信内置浏览器对
在伪元素上的行为和桌面 Chrome 不一致
不要对伪元素设
同时又依赖
,某些 Android WebView 会触发白屏
遮罩层要响应点击事件怎么办
默认
是不可交互的,哪怕加了
,点击也不会触发任何 JS 事件。想让它“可点”,本质不是让伪元素捕获事件,而是把事件委托到父容器,再靠
判断是否点在遮罩覆盖区。
有人试图给
加
,但这是无效的——伪元素永远无法成为事件目标。强行加
和
也没用,浏览器规范就禁止了。
监听父容器的
,用
算点击坐标是否落在遮罩范围内
如果只是要“禁用点击穿透”,直接给父容器加
,再给内部可点元素单独设
需要 hover 效果?用父容器的
,而不是尝试给伪元素自己加
复杂交互(如拖拽遮罩边缘调整大小)必须用真实 DOM 元素,伪元素不适合这类场景
伪元素遮罩看着简单,真正卡住人的往往是那些“应该能行但就是不行”的边界情况:Safari 的 inset、iOS 的 backdrop-filter、事件委托的坐标换算……这些地方没真正在真机上点过、缩放过、切过横竖屏,光看文档很容易漏掉。
::afterdivposition: relativez-index::afterpositionrelative::aftercontent: ""top/left/right/bottomwidth/heightbackgroundinset: 0top: 0; left: 0; ...::afterflexgridtransform: translate(-50%, -50%)::afterinnerHTML::afterdisplay: flex::afterdisplay: flex; align-items: center; justify-content: center;::afterbackgroundrgba(0,0,0,0.6)opacitybox-sizing: border-box::afterinset: 0backdrop-filtercontain: layout paintcontainwill-change: transformtop: 0; right: 0; bottom: 0; left: 0;inset: 0backdrop-filter: blur(4px)-webkit-backdrop-filterpointer-events: noneanimationwill-change::aftercursor: pointerevent.target === event.currentTarget::afterpointer-events: autoz-indexpointer-events: allclickelement.getBoundingClientRect()pointer-events: nonepointer-events: auto:hover::after:hover