Como adicionar imagem de fundo usando ngStyle (angular2)?


102

Como usar o ngStyle para adicionar imagem de fundo? Meu código não funciona:

this.photo = 'http://dl27.fotosklad.org.ua/20121020/6d0d7b1596285466e8bb06114a88c903.jpg';

<div [ngStyle]="{'background-image': url(' + photo + ')}"></div>

por que você usa os colchetes no atributo ngStyle?
gal de

Consulte também stackoverflow.com/questions/37076867/… sobre um problema relacionado em RC.1
Günter Zöchbauer

Respostas:


229

Eu acho que você poderia tentar isso:

<div [ngStyle]="{'background-image': 'url(' + photo + ')'}"></div>

Pela leitura de sua ngStyleexpressão, acho que você perdeu alguns "'" ...


Testado. Trabalhando com RC.1. Não deve ser necessário para RC.2 e versões mais recentes de acordo com o que dizem aqui
Lucio Mollinedo

4
Eu prefiro this.photo = `url(${photo})`; [style.background-image]='photo'.
slideshowp2 de

4
Lembre-se de que os espaços no URL da imagem (nome da imagem) podem causar uma falha de silêncio [ngStyle]e de [style.background-image]renderização.
vulp

83

Você também pode tentar isso:

[style.background-image]="'url(' + photo + ')'"


3
@ redfox05 Suponho que ngStyle é um açúcar sintático. A principal diferença é que o ngStyle permite que você aplique várias regras de css, mas [style. <css_prop>] permite apenas uma. Os próximos são equivalentes: <div [ngStyle]="{ color: 'red', 'font-size': '22px' }">First</div> e <div [style.color]="'red'" [style.font-size.px]="22">Second</div>
Todmy

Eu usei essa abordagem [style.css], embora não consiga fazer [style.background-repeat] funcionar, sabe por quê?
Anders Metnik

Como fazer estilo condicional usando essa abordagem? Digamos que se eu queira verificar se a foto não é nula e só aplicar este estilo?
Pankaj

25
import {BrowserModule, DomSanitizer} from '@angular/platform-browser'

  constructor(private sanitizer:DomSanitizer) {
    this.name = 'Angular!'
    this.backgroundImg = sanitizer.bypassSecurityTrustStyle('url(http://www.freephotos.se/images/photos_medium/white-flower-4.jpg)');
  }
<div [style.background-image]="backgroundImg"></div>

Veja também


6

Parece que seu estilo foi higienizado. Para contorná-lo, tente usar o método bypassSecurityTrustStyle do DomSanitizer.

import { Component, OnInit, Input } from '@angular/core';
import { DomSanitizer, SafeStyle } from '@angular/platform-browser';

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
  styleUrls: ['./my-component.component.scss']
})

export class MyComponent implements OnInit {

  public backgroundImg: SafeStyle;
  @Input() myObject: any;

  constructor(private sanitizer: DomSanitizer) {}

  ngOnInit() {
     this.backgroundImg = this.sanitizer.bypassSecurityTrustStyle('url(' + this.myObject.ImageUrl + ')');
  }

}
<div *ngIf="backgroundImg.length > 0" [style.background-image]="backgroundImg"></div>


6

Use em vez disso

[ngStyle]="{'background-image':' url(' + instagram?.image + ')'}"

3

Minha imagem de plano de fundo não estava funcionando porque a URL tinha um espaço e, portanto, precisei codificá-la.

Você pode verificar se esse é o problema que está enfrentando tentando um URL de imagem diferente que não tenha caracteres que precisem de escape.

Você poderia fazer isso com os dados no componente apenas usando Javascripts integrados em encodeURI () método .

Pessoalmente, queria criar um pipe para ele para que pudesse ser usado no modelo.

Para fazer isso, você pode criar um tubo muito simples. Por exemplo:

src / app / pipes / encode-uri.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'encodeUri'
})
export class EncodeUriPipe implements PipeTransform {

  transform(value: any, args?: any): any {
    return encodeURI(value);
  }
}

src / app / app.module.ts

import { EncodeUriPipe } from './pipes/encode-uri.pipe';
...

@NgModule({
  imports: [
    BrowserModule,
    AppRoutingModule
    ...
  ],
  exports: [
    ...
  ],
 declarations: [
    AppComponent,
    EncodeUriPipe
 ],
 bootstrap: [ AppComponent ]
})

export class AppModule { }

src / app / app.component.ts

import {Component} from '@angular/core';

@Component({
  // tslint:disable-next-line
  selector: 'body',
  template: '<router-outlet></router-outlet>'
})
export class AppComponent {
  myUrlVariable: string;
  constructor() {
    this.myUrlVariable = 'http://myimagewith space init.com';
  }
}

src / app / app.component.html

<div [style.background-image]="'url(' + (myUrlVariable | encodeUri) + ')'" ></div>

0

Você pode usar 2 métodos:

Método 1

<div [ngStyle]="{'background-image': 'url(&quot;' + photo + '&quot;)'}"></div>

Método 2

<div [style.background-image]="'url(&quot;' + photo + '&quot;)'"></div>

Observação: é importante cercar o URL com " char.


0

Geralmente, a imagem não é exibida porque seu URL contém espaços. No seu caso você quase fez tudo certo. Exceto uma coisa - você não adicionou aspas simples como faria se especificar a imagem de fundo em css. Ie

.bg-img {                \/          \/
    background-image: url('http://...');
}

Para fazer isso, escape o caractere quot em HTML via \ '

                                          \/                                  \/
<div [ngStyle]="{'background-image': 'url(\''+ item.color.catalogImageLink + '\')'}"></div>

0

Minha solução, usando a instrução if..else. É sempre uma boa prática, se você quiser evitar frustrações desnecessárias, verificar se sua variável existe e está configurada. Caso contrário, forneça uma imagem de backup no caso; Você também pode especificar várias propriedades de estilo, como background-position: centeretc.

<div [ngStyle]="{'background-image': this.photo ? 'url(' + this.photo + ')' : 'https://placehold.it/70x70', 'background-position': 'center' }"></div>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.