如何在每个组件的 body 标签中动态加载图像?

Posted

技术标签:

【中文标题】如何在每个组件的 body 标签中动态加载图像?【英文标题】:How can I dynamically load a image in the body tag in each component? 【发布时间】:2019-09-26 07:27:36 【问题描述】:

我是 Angular 的新手,我试图创建这个示例来让我理解。我希望当我从一个组件导航到另一个组件时,我将背景图像动态加载到body 标签,我不知道为什么它不加载。

styles 部分中包含的每个组件中,我想为每个组件的主体更改图像。

或者我能做什么?我只想为我的路由器插座中加载的组件(在我的情况下,mainComponent 和 anotherComponent)中加载不同的背景图像

这是我的代码:

  @Component(
    selector: 'another',
    template: '<a routerLink="/">main</a>',
    styles: [`body 
     position: fixed;
     min-width: 100%;
     background-image: url("https://source.unsplash.com/1920x1080?landscape") !important;
     background-repeat: no-repeat;
     background-size: 100%;
     background-position: center;
     background-size: cover;
    `]

第二部分:

@Component(
  selector: 'main',
  template: '<a routerLink="/another">anotherComponent</a>',
  styles: [`body 
      position: fixed;
      min-width: 100%;
      background-image: url("https://source.unsplash.com/1920x1080?stars") !important;
      background-repeat: no-repeat;
      background-size: 100%;
    background-position: center;
      background-size: cover;
`]

这是实时代码:

https://stackblitz.com/edit/angular-9kbx4q

【问题讨论】:

我在回答中为您的用例添加了更好的解决方案。阅读本文。 【参考方案1】:

在 Angular 中,您不能从组件样式中覆盖父样式,因为您的组件的样式被封装并且仅适用于您的组件。

您应该在每个组件中添加encapsulation: ViewEncapsulation.None@Componentn()-definition,您希望在其中覆盖css 的body 标签。

这是一个工作示例:

import  Component, Input , ViewEncapsulation from '@angular/core';

@Component(
    selector: 'another',
    template: '<a routerLink="/">main</a>',
    styles: [`body 
    position: fixed;
    min-width: 100%;
    background-image: url("https://source.unsplash.com/1920x1080?landscape") !important;
    background-repeat: no-repeat;
    background-size: 100%;
    background-position: center;
    background-size: cover;
    `],
    encapsulation: ViewEncapsulation.None
)
export class AnotherComponent  
  constructor()


重要提示:通过禁用封装,您的组件样式将被全局采用,并将覆盖具有相同类、ID 或标签的样式。

提示:你可以使用这个方案,但最好将背景图片设置为组件自己的html标签。

为您的用例提供更好的解决方案:

将包装器 div 添加到您的 anothermain 组件模板。然后将您的样式添加到此包装器 div。像这样:

another.component.ts

@Component(
  selector: 'another',
  template: '<div><a routerLink="/">main</a></div>',
  styles: [`div 
    position: fixed;
    min-width: 100%;
    background-image: url("https://source.unsplash.com/1920x1080?landscape") !important;
    background-repeat: no-repeat;
    background-size: 100%;
    background-position: center;
    background-size: cover;
  `]
)

ma​​in.component.ts

@Component(
  selector: 'main',
  template: '<div><a routerLink="/another">anotherComponent</a></div>',
  styles: [`div 
    position: fixed;
    min-width: 100%;
    background-image: url("https://source.unsplash.com/1920x1080?stars") !important;
    background-repeat: no-repeat;
    background-size: 100%;
    background-position: center;
    background-size: cover;
  `]
)

这是stackblitz 的工作示例。

在 Angular docs 上阅读有关 ViewEncapsulation 的更多信息。

【讨论】:

@yavg 阅读我的提示。如果需要从组件样式中覆盖body标签,那就只能这样了。在你的情况下,这不是最好的方法。最好的方法是,当您在组件标签/css-class 上的每个组件中设置背景图像时。【参考方案2】:

如果我理解您的问题,您是否试图在初始化时将相同的背景图像加载到组件的模板中? Angular 不依赖模板层次结构,因此应该在更高级别的模板中实现背景图像等常见元素。我会考虑在 app.component 模板中加载此图像。

【讨论】:

或者我该怎么办?我只想为路由器插座中加载的组件提供不同的背景图像 哦,我误会了。您可以像在任何 HTML 页面上一样设置任何组件的背景图像。将背景图像应用到单个组件的顶层 ,而不是正文。 标签将应用于整个应用程序,就像任何其他 HTML 网页一样。

以上是关于如何在每个组件的 body 标签中动态加载图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何围绕 x-y 坐标动态裁剪图像?

vue如何动态添加多个li

双滚动

javascript基础01

Vuetify和require.js:如何显示动态组件?

自定义 SVG 未加载到我的图像标签中