正如其他答案所解释的那样,无法在客户端设置SASS变量并进行处理,因为SASS在构建时转换为纯CSS,当应用程序运行或在APP_INITIALIZER浏览器中时,仅能处理CSS。
我看到实现您想要的有两个选项。
通常,您会有一些应用程序的基本css,然后根据管理员设置需要加载附加的css。从css的角度来考虑,所有附加的css中的css特异性都应该大于基本css,否则它将无法覆盖基本css。这需要基本的css知识,因此我不会详细说明。
方法1
在服务器请求上生成额外的css。在应用程序从服务器URL启动时加载它。当管理员更改任何设置时,通过js重新加载它。
- 在地址
/additional.css
(或类似于/api/theme/custom-css
)定义后端端点,它将从数据库中生成css。例如,您的数据库中有background=red
,则端点应返回
body {background-color: red;}
- 在
index.html
的<head>
中添加<link id="additionalCss" rel="stylesheet" type="text/css" href="additional.css" />
,这样就足以使其起作用。
- 重新加载页面有许多方法,但我认为这个应该可行。
document.getElementById('additionalCss').href = document.getElementById('additionalCss').href;
这将向服务器发出新请求,服务器将执行DB -> css并返回更新后的css,然后应用于浏览器。
如果你想要酷炫一些(或需要支持大型和复杂的主题),可以使用scss。后端应该将数据库中的scss变量定义生成为后端应用程序来编译 scss -> css,然后将编译后的css返回给客户端。但如果附加的css足够简单,则这将是不必要的。
这种方法的一个重要考虑因素是浏览器缓存,因为additional.css后面的内容是动态的,但浏览器可能会将其缓存,而不调用后端并提供过时的版本。
方法2:
如果您不想或无法干扰后端,请通过json中的某个API端点从DB加载设置,然后在客户端上生成CSS代码并应用它。
1.使用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。