Html 最后包含静态CSS文件(用于品牌)

Html 最后包含静态CSS文件(用于品牌),html,css,angular,angular-cli,Html,Css,Angular,Angular Cli,我们有一个嵌入式web应用程序,它需要能够在应用程序构建和部署后由集成商重新标记。该要求规定,集成商可以上传branding.css,该文件将使用品牌颜色等覆盖现有样式 问题在于,似乎不可能通过角度和角度CLI来满足这一需求。在我编写一个可以完成任务的黑客后处理python脚本之前,我想在这里仔细检查一下 基本上,我只想在执行ng构建之后,我希望我的index.html如下所示: <head> <meta charset="utf-8"> <meta

我们有一个嵌入式web应用程序,它需要能够在应用程序构建和部署后由集成商重新标记。该要求规定,集成商可以上传
branding.css
,该文件将使用品牌颜色等覆盖现有样式

问题在于,似乎不可能通过角度和角度CLI来满足这一需求。在我编写一个可以完成任务的黑客后处理python脚本之前,我想在这里仔细检查一下

基本上,我只想在执行
ng构建
之后,我希望我的
index.html
如下所示:

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
    <title [translate]="'index.title'"></title>
    <base href="/">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link rel="icon" type="image/x-icon" href="favicon.ico">
    <link href="styles.f14ea32bf407dc2d4831.bundle.css" rel="stylesheet" />
    <link href="branding.css" rel="stylesheet" />
</head>

这样,
branding.css
是最后一个,这意味着其中的任何类都将覆盖styles捆绑包中的类,并且integrator可以简单地用合作伙伴的品牌覆盖该文件。有没有办法做到这一点(或类似的方法)?

您可以在
的末尾添加
,而不是在
中添加。这不是一个很好的做法,但在这种情况下可能有意义

您的源index.html:

<head>
  <!--Base, title, meta tags-->
</head>
<body>
  <my-app></my-app>
  <!--Branding style overrides-->
  <link href="branding.css" rel="stylesheet" />
</body>

建成后,您应获得:

<head>
  <!--Base, title, meta tags-->
  <link href="styles.f14ea32bf407dc2d4831.bundle.css" rel="stylesheet" />
</head>
<body>
  <my-app></my-app>
  <!--Branding style overrides-->
  <link href="branding.css" rel="stylesheet" />
  <script type="text/javascript" src="main.js">
</body>

由于Angular将样式注入到
,因此您的品牌css将在文档中稍后出现,并具有更高的特殊性

元素可以出现在
元素中,具体取决于其链接类型是否正确。例如,样式表链接类型为body ok,因此允许在body中使用
。然而,这并不是一个好的实践;将
元素与正文内容分开,将它们放在
中,这样做更有意义


您还可以尝试动态加载css

this.http.get('assets/test.css', { responseType: 'text' })
  .subscribe((css) => {
    let head = document.getElementsByTagName('head')[0];
    let link = document.createElement('style');
    link.type = 'text/css';
    link.appendChild(document.createTextNode(css));
    head.appendChild(link);
  });
在angular.json中

 ...
 "extractCss": true,
 "assets": [
   "src/assets" /* "src/favicon.ico", other assets */
 ],
 ...
演示: 您可以调整test.css并刷新嵌入页面以查看实际效果


鉴于css在这里只不过是纯文本,您还可以让用户上传css,对其进行消毒并通过端点提供服务。

(对不起,我在stackoverflow中找不到,我知道存在响应)OP不想导入css文件。他们只是希望链接在那里,这样他们的客户就可以添加CSS文件@EliseoI guess,说服品牌团队使用CSS变量是不行的?:)您可以在
的末尾添加
,因为Angular会将其他样式注入
@Gillespie。如果您事先知道可以参数化的内容,CSS变量就是一种方法。一开始需要你做更多的工作,但从长远来看,这可能会有回报,因为相信我,品牌团队很快就会向你提出“你能添加一个类吗”、“你能改变顺序吗”、“你能在一个div中包装一下吗”等问题。使用vars,可以将它们绑定到可以更改的内容。文件的顺序无关紧要,因为它们会定义变量,而且对于不支持的浏览器,CSS中也有一个有效的回退。