Come aggiungere un'immagine di sfondo usando ngStyle (angular2)?


103

Come utilizzare ngStyle per aggiungere un'immagine di sfondo? Il mio codice non funziona:

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

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

perché usi le parentesi nell'attributo ngStyle?
gal

Vedi anche stackoverflow.com/questions/37076867/… su un problema correlato in RC.1
Günter Zöchbauer

Risposte:


233

Penso che potresti provare questo:

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

Dalla lettura della tua ngStyleespressione, immagino che ti sia perso un po 'di "'" ...


Testato. Lavorare con RC.1. Non dovrebbe essere necessario per RC.2 e versioni più recenti secondo quello che dicono qui
Lucio Mollinedo,

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

4
Tieni presente che gli spazi nell'URL dell'immagine (nome dell'immagine) possono causare un errore silenzioso [ngStyle]e di [style.background-image]rendering.
vulp

83

Inoltre puoi provare questo:

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


3
@ redfox05 Suppongo che ngStyle sia uno zucchero sintattico. La differenza principale è che ngStyle consente di applicare diverse regole CSS, ma [style. <css_prop>] ne consente solo una. I prossimi sono equivalenti: <div [ngStyle]="{ color: 'red', 'font-size': '22px' }">First</div> e <div [style.color]="'red'" [style.font-size.px]="22">Second</div>
Todmy

Ho usato questo approccio [style.css], anche se non riesco a far funzionare [style.background-repeat], sai perché?
Anders Metnik,

Come eseguire lo styling condizionale utilizzando questo approccio? Diciamo se voglio controllare se la foto non è nulla e quindi applicare solo questo stile?
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>

Guarda anche


6

Sembra che il tuo stile sia stato ripulito, per aggirarlo prova a utilizzare il metodo bypassSecurityTrustStyle di 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

Usa invece

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

3

La mia immagine di sfondo non funzionava perché l'URL aveva uno spazio e quindi avevo bisogno di codificarlo nell'URL.

Puoi verificare se questo è il problema che stai riscontrando provando un URL immagine diverso che non abbia caratteri che necessitano di escape.

È possibile eseguire questa operazione sui dati nel componente semplicemente utilizzando JavaScript incorporati nel metodo encodeURI () .

Personalmente ho voluto creare un tubo per esso in modo che potesse essere utilizzato nel modello.

Per fare questo puoi creare una pipa molto semplice. Per esempio:

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>

0

Puoi usare 2 metodi:

Metodo 1

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

Metodo 2

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

Nota: è importante racchiudere l'URL con " char.


0

Per lo più l'immagine non viene visualizzata perché l'URL contiene spazi. Nel tuo caso hai quasi fatto tutto correttamente. Tranne una cosa: non hai aggiunto virgolette singole come fai se specifichi l'immagine di sfondo in css Ie

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

Per farlo, evita il carattere quot in HTML tramite \ '

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

0

La mia soluzione, usando l'istruzione if..else. È sempre buona norma, se vuoi evitare inutili frustrazioni, verificare che la tua variabile esista e sia impostata. Altrimenti, fornire un'immagine di backup nel caso; Puoi anche specificare più proprietà di stile, come background-position: center, ecc.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.