必须作用于页面内容容器(如#app)而非body,因遮罩层独立挂载于body末尾,不包裹业务DOM;需用计数器管理多层弹窗blur状态,并为IE/旧Edge提供opacity降级方案。
直接给或加没用,还会模糊弹窗自己——必须作用于你页面真正的内容容器(如),且需配合计数器和降级逻辑才能稳定生效。
为什么
里加
样式完全没反应
Layui 的遮罩层(
)和弹窗层(
)是直接挂到
尾部的独立节点,不包裹你的业务 DOM。你给
加
,只模糊了
自身(几乎不可见),而真实页面内容在视觉层级上已被遮罩盖住,根本不在同一渲染上下文中。滤镜不会“穿透”遮罩去模糊它背后的东西。
真正起效的路径只有一条:找到那个包裹全部业务代码的稳定根容器(比如
、
或
),在弹窗打开时给它加类,关闭时移除。
确认页面存在唯一、静态、不随
动态插入/删除的容器,例如:
不要选
——
等浮动组件可能脱离其流,导致部分区域漏模糊
避免用
这类模糊选择器,一旦 DOM 结构微调就失效
如何用
实现更现代的毛玻璃效果
如果你的用户基本是 Chrome/Firefox/Safari/Edge ≥18,优先用
替代
。它专为「背景模糊」设计,不影响元素自身内容清晰度,性能也更好。但注意它必须搭配半透明背景才可见:
给根容器(如
)加样式:
必须有
或
背景色(哪怕透明度极低),否则
不触发
禁用父级的
或
,它们会截断 backdrop 渲染
iOS Safari 下若出现白屏或闪烁,立即停用
,切回
+ 遮罩方案
多层弹窗时
状态怎么不乱套
连续打开两个
,第一个还没关,第二个又给
加了
;这时关掉第一个,如果直接
,背景立刻变清晰,第二个弹窗就失去模糊背景了——这是典型状态未计数导致的。
解决方式极简:
基于Layui自定义内容轮播插件
基于Layui自定义内容轮播插件是一款表格数据为ajax加载的本地json数据,本地查看会有跨域问题导致数据不能显示。
下载
全局声明计数器:
每次调用
前:
,并检查是否为 1,是则加类:
在
或
后:
,再判断是否为 0,是则移除类
别依赖
或
回调做加类——它们在遮罩渲染后才触发,可能有闪动
IE 和旧 Edge 怎么降级处理
和
在 IE 全系、Edge ≤17 中直接被忽略,强行写入不仅无效,还可能因样式层叠引发布局错位(尤其当其他规则依赖
触发 BFC 时)。
稳妥做法是运行时检测:
用
判断(推荐,现代浏览器支持好)
或 UA 检测:
不支持时,放弃模糊,改为提升遮罩层透明度:
,同时确保
无任何
类残留
切记:不要同时启用
和高 opacity 遮罩,iOS Safari 下易触发渲染异常
最易被忽略的一点:模糊值不是越大越好。超过
后,文字边缘会严重弥散,可读性骤降;生产环境建议控制在
区间,并在不同屏幕密度下实机验证。
bodyhtmlfilter: blur()#applayer.openfilter.layui-layer-shade.layui-layerbodybodyfilter: blur(4px)body#app.wrappermainlayer...body.layui-fixbardocument.querySelector('main')backdrop-filterbackdrop-filter: blur(8px)filter#app.blur-bg { background: rgba(255,255,255,0.01); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); }rgba()hsla()backdrop-filteroverflow: hiddencontain: strictbackdrop-filterfilterblurlayer#appblur-bgremovewindow.layerBlurCount = 0layer.openwindow.layerBlurCount++if (window.layerBlurCount === 1) document.getElementById('app').classList.add('blur-bg')layer.closelayer.closeAllwindow.layerBlurCount = Math.max(0, window.layerBlurCount - 1)layer.readysuccessfilter: blur()backdrop-filterfilterCSS.supports('filter', 'blur(1px)')navigator.userAgent.indexOf('MSIE') > -1 || navigator.userAgent.indexOf('Trident') > -1$('.layui-layer-shade').css('opacity', '0.85')#appfilterfilterblur(10px)4px–8px