¿Cómo agregar una imagen de fondo usando ngStyle (angular2)?

102

¿Cómo usar ngStyle para agregar una imagen de fondo? Mi código no funciona:

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

<div [ngStyle]="{'background-image': url(' + photo + ')}"></div>
Ignat
fuente
¿Por qué usa los corchetes en el atributo ngStyle?
gal
Consulte también stackoverflow.com/questions/37076867/… sobre un problema relacionado en RC.1
Günter Zöchbauer

Respuestas:

229

Creo que podrías probar esto:

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

Al leer tu ngStyleexpresión, supongo que te perdiste algunos "'" ...

Thierry Templier
fuente
Probado. Trabajando con RC.1. No debería ser necesario para RC.2 y versiones más recientes de acuerdo con lo que dicen aquí
Lucio Mollinedo
4
Yo prefiero this.photo = `url(${photo})`; [style.background-image]='photo'.
slideshowp2
4
Tenga en cuenta que los espacios en la URL de la imagen (nombre de la imagen) pueden provocar un error de reproducción [ngStyle]y silencio [style.background-image].
vulp
83

También puedes probar esto:

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

Todmy
fuente
3
@ redfox05 Supongo que ngStyle es un azúcar sintáctico. La principal diferencia es que ngStyle le permite aplicar varias reglas CSS, pero [style. <css_prop>] solo permite una. Los siguientes son equivalentes: <div [ngStyle]="{ color: 'red', 'font-size': '22px' }">First</div> y <div [style.color]="'red'" [style.font-size.px]="22">Second</div>
Todmy
He usado este enfoque [style.css], aunque no puedo hacer que [style.background-repeat] funcione, ¿sabes por qué?
Anders Metnik
¿Cómo hacer un estilo condicional usando este enfoque? Digamos si quiero verificar si la foto no es nula y luego solo 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>

Ver también

Günter Zöchbauer
fuente
6

Parece que su estilo ha sido desinfectado, para evitarlo, intente usar el método bypassSecurityTrustStyle de 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>

Uliana Pavelko
fuente
6

Usar en su lugar

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

Mi imagen de fondo no funcionaba porque la URL tenía un espacio y, por lo tanto, necesitaba codificarla.

Puede verificar si este es el problema que tiene probando una URL de imagen diferente que no tenga caracteres que deban escapar.

Puede hacer esto con los datos en el componente simplemente usando Javascripts integrados en encodeURI () método .

Personalmente, quería crear una tubería para que pudiera usarse en la plantilla.

Para hacer esto, puede crear una tubería muy simple. Por ejemplo:

src / app / pipe / 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>
Tom Benyon
fuente
0

Puede utilizar 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>

Nota: es importante rodear la URL con " char.

riofly
fuente
0

En general, la imagen no se muestra porque su URL contiene espacios. En tu caso, casi hiciste todo bien. Excepto una cosa: no ha agregado comillas simples como lo hace si especifica la imagen de fondo en css Es decir

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

Para hacerlo, escape el carácter de comillas en HTML mediante \ '

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

Mi solución, usando la declaración if..else. Siempre es una buena práctica, si quiere evitar frustraciones innecesarias, comprobar que su variable existe y está configurada. De lo contrario, proporcione una imagen de respaldo por si acaso; También puede especificar varias propiedades de estilo, como background-position: center, etc.

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

AllJs
fuente