css全局变量必须定义在:root下且通过非scoped的加载,否则小程序端直接失效;因uni-app编译器会隔离scoped样式中的伪类作用域,:root声明被忽略,h5可能侥幸生效但破坏多端一致性。

CSS 全局变量必须定义在 :root 下且通过非 scoped 的 <style></style> 加载,否则在小程序端直接失效。
为什么 App.vue 里写 :root { --x: y } 在小程序不生效
uni-app 编译器对小程序平台会隔离 scoped style 中的伪类作用域;即使你写了 :root,只要它被包裹在 <style scoped></style> 里,微信/支付宝小程序就会忽略该声明。H5 端可能侥幸跑通,但多端一致性立刻崩塌。
- 必须用
<style></style>(无任何属性)块,放在App.vue最外层 - 不能写在
<style lang="scss"></style>或<style scoped></style>里 - 不要依赖条件编译(如
// #ifdef MP-WEIXIN)包裹变量定义——CSS 变量不参与条件编译,会被全端加载,但小程序端解析失败时静默丢弃
移动端适配常用 CSS 变量怎么定义才可靠
适配核心是把“系统状态”转为可计算的 CSS 变量,比如安全区、胶囊按钮位置、dpr 值。这些不能写死,得靠 JS 注入 + CSS fallback。
- 在
App.vue的onLaunch中调用uni.getSystemInfo,拿到statusBarHeight、safeAreaInsets、pixelRatio后,用document.documentElement.style.setProperty动态设置,例如:document.documentElement.style.setProperty('--status-bar-height', statusBarHeight + 'px') - 在
<style></style>里提供默认值(防 JS 未执行或报错)::root { --status-bar-height: 20px; --capsule-height: 32px; } - 避免在
@keyframes或calc(--x + --y)多层嵌套中使用变量——小程序原生渲染层不支持,会回退到默认值甚至白屏
rpx 和 CSS 变量怎么配合做真·响应式
rpx 解决的是等比缩放,CSS 变量解决的是逻辑分支。比如:侧边栏在 PC 显示、移动端收起,不能只靠 width: 200rpx,得结合媒体查询 + 变量控制显隐和布局流。
- 定义断点变量:
:root { --breakpoint-pad: 768px; --breakpoint-pc: 1024px; } - 在媒体查询中切换变量值:
@media (min-width: 1024px) { :root { --sidebar-show: 1; } } - 组件内用
display: var(--sidebar-show, 0) == 1 ? 'block' : 'none'不行——CSS 不支持表达式,得换思路:.sidebar { display: var(--sidebar-display, none); },再由 JS 或媒体查询设--sidebar-display: flex - 注意:变量值是字符串,
var(--x, 0)的0是字面量,不是数字,不能参与 calc 运算
最易被忽略的一点:CSS 变量修改后,不会触发 Vue 组件重渲染。你想让某个 <view class="header"></view> 随 --status-bar-height 变化而调整内边距?光改变量不够,还得手动 this.$forceUpdate() 或绑定 :style="{ paddingTop: getComputedStyle(document.documentElement).getPropertyValue('--status-bar-height') }"——后者更可控,也避开响应式陷阱。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











