Comment ajouter une image de fond en utilisant ngStyle (angular2)?


103

Comment utiliser ngStyle pour ajouter une image d'arrière-plan? Mon code ne fonctionne pas:

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

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

pourquoi utilisez-vous les crochets sur l'attribut ngStyle?
gal

Voir aussi stackoverflow.com/questions/37076867/… à propos d'un problème connexe dans RC.1
Günter Zöchbauer

Réponses:


233

Je pense que vous pouvez essayer ceci:

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

En lisant votre ngStyleexpression, je suppose que vous avez manqué quelques "" "...


Testé. Travailler avec RC.1. Cela ne devrait pas être nécessaire pour RC.2 et les versions plus récentes selon ce qu'ils disent ici
Lucio Mollinedo

4
Je préfère this.photo = `url(${photo})`; [style.background-image]='photo'.
diaporamap2

4
Gardez à l'esprit que les espaces dans l'URL de l'image (nom de l'image) peuvent provoquer un échec de silence [ngStyle]et de [style.background-image]rendu.
vulp

83

Vous pouvez également essayer ceci:

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


3
@ redfox05 Je suppose que ngStyle est un sucre syntaxique. La principale différence est que ngStyle vous permet d'appliquer plusieurs règles css, mais [style. <css_prop>] n'en autorise qu'une. Les suivants sont équivalents: <div [ngStyle]="{ color: 'red', 'font-size': '22px' }">First</div> et <div [style.color]="'red'" [style.font-size.px]="22">Second</div>
Todmy

J'ai utilisé cette approche [style.css], bien que je ne puisse pas faire fonctionner [style.background-repeat], vous savez pourquoi?
Anders Metnik

Comment faire du style conditionnel en utilisant cette approche? Disons que si je veux vérifier si la photo n'est pas nulle et appliquer uniquement ce style?
Pankaj le

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>

Voir également


6

On dirait que votre style a été nettoyé, pour le contourner, essayez d'utiliser la méthode 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>


6

Utilisez plutôt

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

3

Mon image de fond ne fonctionnait pas car l'URL contenait un espace et j'avais donc besoin de l'encoder par URL.

Vous pouvez vérifier si c'est le problème que vous rencontrez en essayant une URL d'image différente qui ne contient pas de caractères à échapper.

Vous pouvez faire cela pour les données du composant en utilisant simplement les Javascripts intégrés à la méthode encodeURI () .

Personnellement, je voulais créer un tuyau pour cela afin qu'il puisse être utilisé dans le modèle.

Pour ce faire, vous pouvez créer un tuyau très simple. Par exemple:

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

Vous pouvez utiliser 2 méthodes:

Méthode 1

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

Méthode 2

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

Remarque: il est important d'entourer l'URL de " char.


0

La plupart du temps, l'image n'est pas affichée car votre URL contient des espaces. Dans votre cas, vous avez presque tout fait correctement. Sauf une chose - vous n'avez pas ajouté de guillemets simples comme vous le faites si vous spécifiez background-image dans css Ie

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

Pour ce faire, échappez le caractère quot en HTML via \ '

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

0

Ma solution, en utilisant l'instruction if..else. C'est toujours une bonne pratique si vous voulez éviter des frustrations inutiles, pour vérifier que votre variable existe et qu'elle est définie. Sinon, fournissez une image de sauvegarde au cas où; Vous pouvez également spécifier plusieurs propriétés de style, telles que background-position: center, etc.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.