Angular - 在index.html中引入CSS文件

26

我正在尝试在使用CLI创建的angular项目中使用angular2-busy库,但是导入样式表时遇到了问题:

<link rel="stylesheet" href="/node_modules/angular2-busy/build/style/busy.css">

浏览器告诉我它找不到文件,即使路径正确。我还检查了文件是否存在,确实存在。当我去掉rel=" stylesheet"时,错误就消失了,但动画也不起作用。

输入图像描述此处

如果有人感兴趣,这是我正在尝试使用的包: https://www.npmjs.com/package/angular2-busy


尝试使用单个 ./,如 <link rel="stylesheet" href="./node_modules/angular2-busy/build/style/busy.css"> - penleychan
没有起作用。我怀疑这与Angular有关,因为我不确定他们如何处理像这样的全局CSS文件。 - ecain
你正在使用angular-cli吗? - penleychan
@12秒 是的,使用Angular 4。 - ecain
5个回答

31

Angular CLI有自己的一套方式来初始化全局的 CSS/JS。

它们位于 .angular-cli.json 配置文件中。

找到 "styles": 并在其中添加你的 CSS。

示例:

"styles": [
   "../node_modules/angular2-busy/build/style/busy.css",
   "styles.css"
],
希望这能帮到你。

我仍然无法获得任何动画效果,但我不确定是否是因为没有获取CSS文件。 - ecain
1
@ecain 我不熟悉这个插件,但我刚刚做了一个快速搜索。看起来它需要在您的模板中添加 <div [ngBusy]="busy"></div>。您有吗?另外,还需要将其导入到您的 AppModule 中。 - penleychan
1
@ecain 你能用浏览器的开发者工具来找出吗?你可以有两种方法,一是检查元素并查看是否存在<link />。或者检查网络选项卡以查看样式是否已加载。 - penleychan
1
如果您知道样式是什么,您可以检查styles.xxx.bundle.css文件,看它是否包含所期望的类。 - penleychan
1
是的,问题在于bundle.css文件仅在ng build时生成,ng serve会生成bundle.js文件,但检查样式是否已添加的过程与上述相同。 - Jota.Toledo
显示剩余9条评论

20

基本上有三种不同的方法来完成这个操作:

  1. 将其添加到angular-cli.json文件中的“styles”数组中,就像@penleychan在他的答案中所示。
"styles": [
        "../node_modules/bootstrap/dist/css/bootstrap.min.css",
        "styles.css"
      ]
你可以通过在styles.css文件中添加@import语句,直接将css文件导入其中。需要将该css文件包含在angular-cli.json文件中的“styles”数组中(或任何其他css文件)。
@import "~bootstrap/dist/css/bootstrap.min.css";
  1. 通过添加链接元素,在index.html页面中包含css文件。

<link rel="stylesheet" type="text/css" href="node_modules/bootstrap/dist/css/bootstrap.min.css" />

您可以在此链接找到更详细的解释和更多替代方案。


10

如何使用链接式层叠样式表(CSS)与Angular

始终使用链接式CSS而不是Google Angular使用的已编译和嵌入JavaScript内存版本的CSS。为什么?链接式<link>外部CSS在各个方面都比嵌入式CSS更优秀,主要是因为连接的CSS会跨越成千上万的页面视图、访问和在线用户进行缓存,大幅节省带宽值并提高浏览器中CSS渲染速度,同时实现更简单、更快速的CSS管理。

如何修复关于链接式CSS的Angular问题

  1. angular.json中删除所有“styles”下的CSS文件引用。现在它应该看起来像这样:

      "styles": [],
    
    将CSS文件移动到项目内的“src”文件夹中,然后在index.html中添加链接<link>,链接到您的外部CSS文件。在链接路径中加入CSS文件的路径,从“src”文件夹开始,包括“styles”文件夹或任何您想要的文件夹系统(见下文)。现在您可以将CSS存储在项目中任何位置,只要这些文件夹和文件位于“src”根文件夹下即可。在此路径下,我的实际CSS文件现在位于“src/styles”下。因此,链接路径应该是我的“styles”文件夹加上文件名:
        <link href="styles/mystyles.css" rel="stylesheet" />
    
    1. 如果你想在项目中使用 Bootstrap, Font Awesome等的CSS文件,必须从你的项目的 "node_modules" 文件夹中手动复制到 "src" 文件夹下的某个文件夹中,就像在#2中使用CSS文件的位置一样。或者,你也可以从网络上引用一些完全合格的URL地址。如果你想像上面在“index.html”中创建链接,或者将它们直接导入到HTML文件中(如下例),也可以这样做。如果之前是从“node_modules”文件夹导入它们的话,那么这种方式将不起作用,因为Angular CLI或webpack通过将CSS导入编译为JavaScript来解析这些路径。当您将这些CSS文件移动并从src文件夹链接或导入它们时,它们现在将不会编译为Angular JavaScript。使用@import时,请确保将Bootstrap和Font Awesome CSS文件放在与主样式表相同的“src / styles”文件夹中,并像这样导入它们:
        <style type="text/css">
            @import "bootstrap.min.css";
            @import "font-awesome.min.css";
        </style>
    
    1. 在同一个angular.json文件中,在“assets”JSON设置下,添加对#2和#3中CSS文件位置的引用,以便生成器可以将它们复制到您的dist文件夹中。任何链接或从该文件夹导入的CSS文件都将在Angular编译时由“dist”文件夹系统移动。请注意底部的新样式路径。如果您有其他文件夹中的CSS,请在此处添加它们。这告诉生成器在Angular使用的“dist”文件夹中创建CSS目录,并复制其中的所有CSS文件,因此当您为生产建立时,您的index.html链接指向服务器上正确的CSS文件:

     "assets": [
       "src/favicon.ico",
       "src/assets",
       "src/api",
       "src/styles"
     ],
    

您现在拥有了一组强大的链接元素,可将所有CSS链接到index.html文件的head中,并可以像通常情况下一样在 Angular 项目中进行编辑,知道它们将在 Angular 开发测试服务器和 dist 生产副本中都能正常工作。此外,您的网站还将受益于浏览器缓存 CSS 文件一次性地存储在内存和永久文件缓存中。

我花了一天时间查阅文档和测试才弄清楚应该是任何简单网站 API 中自然的部分,但谷歌的 Angular 让这个过程变得如此复杂。但这种改变很好!

这只是从编译和构建 Angular 系统中删除您的 CSS,该系统会将所有 CSS 推送到 JavaScript 文件中,然后将您的 CSS 嵌入到浏览器的内存和 HTML 页面的 head 中的内联样式表块中。使用自己的链接 CSS html 标签要优越得多,并且允许更好地缓存和控制 CSS 级联规则。

祝您好运!


3

尝试

  <link rel="stylesheet" href="node_modules/angular2-busy/build/style/busy.css" >

仍然出现相同的错误。我应该补充说明,我也在使用 Bootstrap,并且从CDN导入他们的CSS文件没有任何问题。 - ecain
你的索引文件在哪里?根据那个,你需要调整路径。 - Sajeetharan
索引是距离 node_modules 文件夹1个文件夹的位置。我尝试使用 .. 来返回上一级文件夹,但仍然无法正常工作。 - ecain

0

您的代码末尾缺少自闭合符号“/”。可能是浏览器没有自动修复。

<link rel="stylesheet" href="/node_modules/angular2-busy/build/style/busy.css" />

同时,删除 rel="stylesheet" 绝对不会解决问题,因为浏览器需要确切地知道你所引用的是哪种参考。

如果修复闭合标签无效,那么你的路径可能是错误的。你也可以尝试在路径的开头添加 ../ 。这将使其相对于站点所在的文件夹。

<link rel="stylesheet" href="../node_modules/angular2-busy/build/style/busy.css" />

链接末尾不需要加上 / - ecain
如果你试图使你的代码与旧版浏览器兼容,那么你需要这样做,否则编译该行时会出错。它不在链接的末尾,而是在HTML行的末尾。它是一个自闭合标签 /,而不是超链接引用的结束 /。 - Scornwell
明白了。不幸的是,那并没有解决问题。 - ecain
@ecain,能否请您发布一下您的目录结构?这可能有助于我们弄清楚为什么您的链接无法正常工作。请尝试这样做。将文件添加到根WWW文件夹中,然后只需使用其名称“busy.css”引用它。 - Scornwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接