Angular 2从资产文件夹加载CSS背景图像

Posted

技术标签:

【中文标题】Angular 2从资产文件夹加载CSS背景图像【英文标题】:Angular 2 Load CSS background-image from assets folder 【发布时间】:2017-08-05 18:13:26 【问题描述】:

我的文件夹结构是这样的

-myapp
    -assets
        -home-page-img
            -header-bg.jpg
    -src
        -app
        -home-page
            -home-page.component.css
            -home-page.component.html
            -home-page.component.ts

在我的 home-page.component.css 中,我有以下内容

header 
    width: 200px;
    height: 200px;
    background-image: url('/src/assets/home-page-img/header-bg.jpg');


My angular-cli.json
    "assets": [
    "assets",
    "favicon.ico"
]

当我运行代码时,我得到了

GET http://localhost:4200/src/assets/home-page-img/header-bg.jpg 404 (Not Found)

为了演示目的,如果我将背景图像更改为以下内容,我会得到一个完全不同的错误

background-image: url('assets/home-page-img/header-bg.jpg');

./src/app/home-page/home-page.component.css
Module not found: Error: Can't resolve './assets/home-page-img/header-bg.jpg' in '/Users/JohnSmith/Desktop/my-app/src/app/home-page'

我怎样才能加载该图像?

【问题讨论】:

查看图片在dist文件夹中的位置。你永远不应该访问 src 文件夹,无论如何它在生产版本中都不可用。 这是有道理的。但是,如果我引用 dist 文件夹,它会给我一个错误,因为 dist 文件夹在我运行 ng build --prod 之前不存在。 在你的 dist 中使用带有 ref 的相对路径。尝试 ../assets/home-page-img/header-bg.jpg 。这就是在我的 ionic 2 项目中对我有用的东西.. 试试 background-image: url('../../assets/home-page-img/header-bg.jpg'); @Thyagu 成功了!谢谢。请提供答案,我可以投票给它 【参考方案1】:

我用它。 CSS 和 HTML 中的“assets/”总是以“/assets/”开头。我没有问题。 Angular 可以识别它。

CSS

.descriptionModal
    background-image: url("/assets/img/bg-compra.svg");

HTML

<img src="assets/img/ic-logoembajador-horizontal.svg" >

【讨论】:

这是我必须做的——当我将图像样式移动到“styles”文件夹中的 scss 工作表(组件的 scss 文件之外)时。我一直收到编译错误,直到我切换到双引号并刚刚从“/assets/....”开始路径 谢谢你,伙计!它帮助了我! 我使用 SCSS 将背景图像设置为 url(/assets/...),当我构建时不显示错误,但在 WebStorm IDE 中显示此错误 cannot resolve file... 我尝试了 '...'"..." 但仍然得到红色下划线。有什么办法可以消除烦人的错误吗? 或者只是background-image: url('~assets/img/background.svg'); 这应该是公认的答案,它也涵盖了 CSS 和 html 的使用,并且它是一个绝对路径,因此您在移动源文件时不必更改它。【参考方案2】:

试试

background-image: url('../../assets/home-page-img/header-bg.jpg');

【讨论】:

真的很有帮助。 最好使用@samuel-ivan (***.com/a/48890991/10447654) 答案,因为它使用绝对路径,它不会取决于您的文件夹结构。 @huanfeng 不行,路径不对可能会报错【参考方案3】:

对于background-image: url(/assets/images/foo.png),我还有一个i18n + base-href的问题,终于找到了workaround solution。

我的问题通过以下方式解决:

background-image: url(~src/assets/images/foo.png)

图片标签:

<img src="assets/images/foo.jpg" />

【讨论】:

太棒了!我只是在找这个。我也在使用 i18n 我正在使用 --base-href,这是唯一一个可以使用 base-href 并且没有它的。【参考方案4】:

揭开 CSS 文件中资源的 Angular 路径的神秘面纱

这没有记录,据我所知也没有任何人写过它。

Angular 11 确实如此,但肯定已经存在了一段时间。

(注意:在 ng build 中设置 --base-href 或 --deploy-url 对以下内容没有影响)。

在css文件中包含资产的常规方式,例如:

背景图片:url(/assets/someImage.png);

带有前导斜杠。在构建过程中(ng serve 或 ng build),如果 angular 看到前导斜杠,它将忽略该路径,这意味着它将按原样复制它。所以浏览器会看到路径'/assets/someImage.png',并会从根目录开始寻找那个文件,或者我们称之为域。 (注意:CSS 中的路径是相对于 CSS 文件的位置的,但即使在 CSS 中,前导斜杠也意味着查找从根目录开始的文件)。 Angular 假设您将该文件放在默认 assets 文件夹中,其内容将按原样复制到 dist 文件夹中,并且默认位于根目录中,因此 someDomain.com/assets/someImage.png 可以正常工作。

但是,如果由于某种原因您试图做其他事情,并且您删除了该斜线,那么一个全新的过程正在发生。例如,假设你现在写

背景图片:url(assets/someImage.png);

没有斜线。 (例如,当您将应用程序部署到域“someDomain.com/some-folder/”中的内部文件夹时,资产位于该文件夹中。使用斜线,它将在根目录中查找资产,但它不存在,它在某个文件夹中。因此您删除斜线认为它也会按原样复制该代码并从 css 文件所在的位置查找资产,这就是浏览器将执行的操作)。

惊喜! 这次 Angular 并没有忽略那个文件路径!!它在构建期间寻找它!但这并不好,你会得到那个恼人的错误,说 angular 找不到那个文件。 所以你要做的是重写那个路径,直到 angular 可以找到它(在你的文件系统中),例如:如果你在一个深度嵌套的组件中

背景图片:url(../../../../assets/someImage.png);

然后,繁荣,它工作,但看看你的 dist 文件夹和你的 CSS 代码发生了什么。 Angular 制作了 someImage.png 文件的两个副本。一个在常规资产文件夹中,另一个在根目录中,就在所有 js 包旁边。在你的 CSS 文件中

背景图片:url(../../../../assets/someImage.png);

将被改写为

背景图片:url(someImage.png);

这可行,但不是很好的 dist 文件夹结构。 对于注入到 index.html 或 shadowRoot (ViewEncapsulation.shadowDom) 的全局 style.css 或组件样式,此行为器是相同的

(注意:在 html 模板中没有检查或重写)

【讨论】:

嗨@gidon,非常感谢您的解释。但是如果我们的资产是从子文件夹提供的,我们如何在 css 中配置 url,以便从子文件夹加载它,并且图像不会在 dist 文件夹中复制两次? @lincetto 在 css 文件中始终以斜杠开头。因此,如果图像位于 assets/some_subfolder 中,则路径为:background-image:url(/assets/some_subfolder/someImage.png);。如果你想要一个不同位置的文件夹,你可以编辑 angular.json 中的 assets 属性,并用斜杠从 css 指向该文件夹。 谢谢,这很有帮助!【参考方案5】:

我们可以使用相对路径代替绝对路径:

.logo
  background-image: url('assets/home-page-img/header-bg.jpg');

.logo
  background-image: url('~src/assets/home-page-img/header-bg.jpg');

【讨论】:

不知道为什么这不是第一答案。 谢谢@numerical25【参考方案6】:

Angular 9+这对我有用。

.main-bg
  background-image: url("src/assets/main-bg.png");

【讨论】:

【参考方案7】:

尝试在下面使用这个:

background-image: url('./../assets/home-page-img/header-bg.jpg');

【讨论】:

【参考方案8】:

我的问题通过以下方式解决:

背景图片:url(~src/assets/images/foo.png) .

Hieu Tran AGI

相同

【讨论】:

【参考方案9】:

您应该修复文件路径。我的问题解决了:

background-image: url('../assets/img/logo.jpg')

【讨论】:

【参考方案10】:

@Samuel Ivan 的回答对我不起作用。也许是因为我正在开发一个国际化项目。最后,^ 帮助我

.descriptionModal
    background-image: url("^assets/img/bg-compra.svg");


而答案来自https://github.com/angular/angular-cli/issues/12797

【讨论】:

以上是关于Angular 2从资产文件夹加载CSS背景图像的主要内容,如果未能解决你的问题,请参考以下文章

无法从组件中的资产加载 css

角度应用程序图像未从浏览器中的资产文件夹加载所有文件夹

从 Rails 应用程序的数据库中提取 CSS 资产(如背景图像)?

Angular - 捆绑时加载资产

在利用资产管道的 Rails 应用程序中,用于 css 文件中背景图像的正确路径是啥?

如何让 Flutter 的 webview 处理从本地 html 加载的本地资产?