App端全局灰色必须通过manifest.json中plus→style→grayscale:true配置生效,需HBuilderX 3.6.13+及重新打包,JS动态切换需结合class+CSS或原生桥接,原生控件无法灰度。
uni-app 的 App 端(iOS/Android)不支持纯 CSS 滤镜(如 filter: grayscale(1))在根节点上全局生效,尤其在原生渲染层(WebView 或原生容器)里会被忽略或降级。必须通过原生层注入样式或修改渲染策略。
document.documentElement.style.filter = 'grayscale(1)' 有效,但 App 端无效manifest.json 中配置 plus → style → grayscale 开关(仅 HBuilderX 3.6.13+ 支持)picker、camera、状态栏图标)仍保持彩色 —— 这是系统限制,无法通过前端覆盖这个配置只对 App 端有效,且必须写在 manifest.json 的 plus 节点下,位置错或层级错都不生效。
"plus": { "style": { "grayscale": true } }
"grayscale": true 直接写在 plus 外层,或写在 h5 / mp-weixin 下true,不能是字符串 "true" 或数字 1
{ "name": "myapp", "appid": "", "description": "", "versionName": "1.0.0", "versionCode": "100", "transformPx": true, "app-plus": { "usingComponents": true, "nvueStyleCompiler": "uni-app" }, "plus": { "style": { "grayscale": true } }}
如果需要根据服务端指令或用户操作临时开启/关闭(比如哀悼日倒计时自动启用),manifest.json 静态配置就不够用了。此时只能走 JS 注入 + 原生桥接配合。
uni.setStorageSync('grayscale_enabled', true) 存状态,再触发原生重载(plus.runtime.restart())—— 但会闪退重进,体验差App.vue 的 onLaunch 里读取本地开关,然后给 <body> 加 class(如 grayscale-mode),再用 CSS 规则强制作用于所有可控制的 Webview 内容区域filter 支持不稳定,建议 fallback 到 opacity + background-color 混合模拟(不推荐,仅应急)这是 iOS 原生 WebView 渲染管线对 grayscale 的实现差异导致的 —— 它不是标准 CSS filter,而是底层像素转换,会叠加 gamma 校正和亮度压缩。
border 和 box-shadow 的对比度下降比背景更明显filter,那只会浪费调试时间。