跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Layui弹出层layer如何实现窗口背景的实时磨砂玻璃模糊滤镜

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

相关文章