我正在定制一个长期使用的自定义主题,希望让汉堡/侧边栏菜单(.menu-panel)拥有与 .d-header 上已经正常工作的半透明模糊效果。透明度是生效的,但模糊效果没有——我想将此作为反馈提出,因为核心样式对该组件的某些处理方式使得这比预期更困难。
我想实现的效果
一个半透明的菜单面板,背后带有 backdrop-filter: blur(),这样页面内容仍能透过面板隐约可见,类似于许多原生应用使用的毛玻璃效果。对我来说,透明效果和模糊效果都很重要——在繁忙的主题列表上,没有模糊的透明效果看起来很杂乱。
已经生效的部分
在 .d-header 上,只需以下代码即可可靠地工作(已在 iOS Safari 和桌面版 Chrome 上测试):
.d-header {
background-color: color-mix(in srgb, var(--header_background) 50%, transparent);
-webkit-backdrop-filter: blur(3px) saturate(1.2);
backdrop-filter: blur(3px) saturate(1.2);
}
不生效的部分
将完全相同的配方应用于 .menu-panel 时,在 iOS Safari 上只能得到透明度,但永远没有模糊效果:
.menu-panel {
background-color: color-mix(in srgb, var(--secondary) 85%, transparent) !important;
-webkit-backdrop-filter: blur(6px) saturate(1.2);
backdrop-filter: blur(6px) saturate(1.2);
border-radius: 14px;
}
我尝试了以下方法让模糊效果显示出来,但都没有帮助:
- 在
backdrop-filter/-webkit-backdrop-filter声明本身添加!important。 - 使用
transform: translateZ(0)结合overflow: hidden强制创建专用的合成层(这是解决其他 backdrop-filter 问题的常见 Safari 变通方法)——这里没有任何区别,所以我再次移除了它,而不是保留一个不起作用的 hack。 - 确认我针对的是正确的元素:根据
menu-panel.scss,不透明背景是直接设置在.menu-panel上的(而不是像.panel-body这样的子元素),我最初搞错了这一点,后来纠正了。
如果任何人知道为什么 .menu-panel 在这里的行为与 .d-header 不同,或者有可用的配方,我很乐意听到。
第二个问题:单个菜单行上的硬编码背景
即使将面板本身的背景设为透明,其中的一些元素仍然渲染为实心,因为核心直接设置它们的背景,而不是通过面板本身的背景:
.user-notifications-list .read和.bookmark— 用户菜单中的已读通知和书签直接获得background-color: var(--secondary),因此每一行都显示为浮在半透明面板上的不透明块。.hamburger-panel .sidebar-footer-wrapper .sidebar-footer-container— 侧边栏底部的个人资料/登录页脚存在同样的问题。
我可以在(并且已经)我的主题中覆盖这些,但这意味着要逐个查找 menu-panel.scss 中每个硬编码的 var(--secondary),并且下次核心添加具有相同模式的新元素时,它又会再次损坏。如果这些能回退到 CSS 自定义属性,例如类似 --d-menu-panel-background 并默认为 var(--secondary) 的东西,那将非常有帮助,这样主题只需重新定义一个变量就能使整个面板(包括其行)一致地透明,而不是去追逐单个选择器。
如果有用,我很乐意分享修改前后的截图,并在我这边测试任何建议的修复方案。

