先给出明确结论:@if 无法实现运行时主题切换。它只在编译阶段决定哪些样式进入最终 CSS 文件。无论用户点击按钮、监听 prefers-color-scheme,还是从 localStorage 读取配置,@if 都无感知——它在浏览器启动前就已执行完毕。 许多开发者曾在此踩坑:编写 @if $t
先给出明确结论:@if 无法实现运行时主题切换。它只在编译阶段决定哪些样式进入最终 CSS 文件。无论用户点击按钮、监听 prefers-color-scheme,还是从 localStorage 读取配置,@if 都无感知——它在浏览器启动前就已执行完毕。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
许多开发者曾在此踩坑:编写 @if $theme == 'dark' 分支后,切换主题页面毫无反应。根本原因在于,@if 的开关并非由用户在页面上触发,而是在编译器内提前设定。
常见错误现象:@if 块中的样式完全未生效,或切换主题后页面纹丝不动。
sass 命令、启动 Vite 或 Webpack 时已执行完成。此时 document 对象尚不存在。$theme 必须是编译期已知的常量,例如 $theme: "dark";。它不能来自 localStorage、prefers-color-scheme 或任何 JS 动态赋值。vue-cli-plugin-style-resources-loader 等工具注入变量,也只是将变量放入编译上下文,变量本身并不会变成运行时可变的。实际上,@if 的正确使用场景是构建时多版本打包,而非运行时控制。核心判断标准是:是否确实需要生成多份物理 CSS 文件。
@if $brand == "internal" { .header { background: #0052cc; } }@if $enable-transitions { transition: all 0.2s ease; }@if $use-rem { font-size: 1rem; } @else { font-size: 16px; }$legacy-support 为 true 时,才编译 IE11 专用的 filter 规则操作方法很直接:通过 CLI 分别执行两次编译。sass --define=theme=light main.scss:light.css 和 sass --define=theme=dark main.scss:dark.css。任务完成。
要实现真正的运行时主题切换,需要拆分为两层设计。
第一层是 Sass 层:预设语义变量和主题 map。例如 $theme-dark: ("text": #e0e0e0, "bg": #121212),所有组件样式通过 map-get($theme, "text") 取值。这样编译出的 CSS 已经是准备好的、可用的样式变量。
第二层是 JS + CSS 层:使用 JS 修改 document.documentElement.classList,或直接设置 style="--bg-color: #121212",再配合对应 CSS 规则响应变化。
有一个易忽略的细节:Sass 编译结果中不会有 @if 的任何痕迹。若未清楚注释变量控制的分支,半年后连自己都可能看不懂为何某个按钮突然变色。这提醒我们编写此类代码时务必写清注释。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述