正如其他答案所解释的,无法在客户端设置 SASS 变量并对其进行处理,因为 SASS 在构建时转换为纯 CSS,并且当应用程序运行时或在 APP_INITIALIZER 浏览器中只能处理 CSS。
我看到了两个选项来实现你想要的。
一般情况下,您将拥有一些应用程序的基本 css,然后您需要根据管理员设置加载额外的 css。从 css 的角度需要考虑的是,附加 css 中的所有 css 特异性都应该大于基本 css,因为否则它不会覆盖基本 css。这需要基本的 css 知识,所以我不会详细说明。
方法一
根据服务器请求生成额外的 CSS。当应用程序从服务器 URL 启动时加载它。当管理员更改任何设置时,通过 js 重新加载它。
- 在地址
/additional.css(或者它可能类似于/api/theme/custom-css)定义后端端点,它将从数据库中生成css。例如你在 db 中有background=red,那么端点应该返回
body {background-color: red;}
- 在
<head> 的index.html 中添加<link id="additionalCss" rel="stylesheet" type="text/css" href="additional.css" />。这足以让它发挥作用。
- 要重新加载,您可以使用不同的方法,但我相信这应该可行
document.getElementById('additionalCss').href = document.getElementById('additionalCss').href;
这将向服务器发出新请求,服务器将执行 DB -> css 并返回更新后的 css,该 css 将应用于浏览器。
如果你想酷(或者需要支持大而复杂的主题)可以使用scss。后端应该从数据库中生成 scss 变量定义,然后应该使用一些服务器端应用程序编译 scss -> css,然后将编译后的 css 提供给客户端。但是如果额外的 css 足够简单,这将是矫枉过正。
这种方法的一个重要考虑是浏览器缓存,因为additional.css后面的内容是动态的,但是浏览器可能会缓存它,而不是调用后端并提供过时的版本。
方法二
如果您不想或不能弄乱后端。通过json中的某个API端点从DB加载设置,然后在客户端生成css代码并应用它。
- 使用 HttpClient 获取设置 JSON 并从中生成 css 作为字符串。例如服务器返回
{
"background": "red"
}
然后将其转换为字符串
cssCode = 'body {background-color: red}';
- 使用
let additionalCssStyle = document.getElementById('additionalCss');
if (! additionalCssStyle) {
additionalCssStyle = document.createElement("style");
additionalCssStyle.id = 'additionalCss';
document.head.appendChild(additionalCssStyle);
}
additionalCssStyle.innerText = cssCode;
- 要重新加载 - 保存更改为后端,然后重复 1. 和 2.