Wie füge ich ein Hintergrundbild mit ngStyle (angle2) hinzu?

101

Wie verwende ich ngStyle, um ein Hintergrundbild hinzuzufügen? Mein Code funktioniert nicht:

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

<div [ngStyle]="{'background-image': url(' + photo + ')}"></div>
Ignat
quelle
Warum verwenden Sie die Klammern für das Attribut ngStyle?
gal
Siehe auch stackoverflow.com/questions/37076867/… zu einem verwandten Problem in RC.1
Günter Zöchbauer

Antworten:

226

Ich denke, Sie könnten dies versuchen:

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

Nach dem Lesen Ihres ngStyleGesichtsausdrucks haben Sie wahrscheinlich ein "'" verpasst ...

Thierry Templier
quelle
Geprüft. Arbeiten mit RC.1. Es sollte nicht für RC.2 und neuere Versionen benötigt werden, wie hier angegeben
Lucio Mollinedo
4
Ich bevorzuge this.photo = `url(${photo})`; [style.background-image]='photo'.
Slideshowp2
4
Beachten Sie, dass Leerzeichen in Bild URL (Bildname) kann ein stilles verursachen [ngStyle]und [style.background-image]Rendering - Versagen.
Vulp
83

Sie können dies auch versuchen:

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

Todmy
quelle
3
@ redfox05 Ich nehme an, ngStyle ist ein syntaktischer Zucker. Der Hauptunterschied besteht darin, dass Sie mit ngStyle mehrere CSS-Regeln anwenden können, [style. <Css_prop>] jedoch nur eine. Die nächsten sind gleichwertig: <div [ngStyle]="{ color: 'red', 'font-size': '22px' }">First</div> und <div [style.color]="'red'" [style.font-size.px]="22">Second</div>
Todmy
Ich habe diesen [style.css] -Ansatz verwendet, obwohl ich [style.background-repeat] nicht zum Laufen bringen kann. Weißt du warum?
Anders Metnik
Wie mache ich bedingtes Styling mit diesem Ansatz? Angenommen, ich möchte überprüfen, ob das Foto nicht null ist, und dann nur diesen Stil anwenden.
Pankaj
24
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>

Siehe auch

Günter Zöchbauer
quelle
6

Ihr Stil wurde anscheinend bereinigt. Um ihn zu umgehen, verwenden Sie die bypassSecurityTrustStyle-Methode von 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
quelle
6

Verwenden Sie stattdessen

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

Mein Hintergrundbild funktionierte nicht, da die URL ein Leerzeichen enthielt und ich sie daher per URL codieren musste.

Sie können überprüfen, ob dies das Problem ist, indem Sie eine andere Bild-URL ausprobieren, die keine Zeichen enthält, die maskiert werden müssen.

Sie können dies mit den Daten in der Komponente tun, indem Sie nur in encodeURI () integrierte Javascripts verwenden. -Methode integrierten verwenden.

Persönlich wollte ich eine Pipe dafür erstellen, damit sie in der Vorlage verwendet werden kann.

Dazu können Sie eine sehr einfache Pipe erstellen. Beispielsweise:

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>
Tom Benyon
quelle
0

Sie können 2 Methoden verwenden:

Methode 1

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

Methode 2

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

Hinweis: Es ist wichtig, die URL mit " char " zu umgeben .

riofly
quelle
0

Meistens wird das Bild nicht angezeigt, da Ihre URL Leerzeichen enthält. In Ihrem Fall haben Sie fast alles richtig gemacht. Abgesehen von einer Sache - Sie haben keine einfachen Anführungszeichen hinzugefügt, wie Sie es tun, wenn Sie das Hintergrundbild in CSS Ie angeben

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

Um dies zu tun, maskieren Sie das Anführungszeichen in HTML über \ '

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

Meine Lösung mit der Anweisung if..else. Es ist immer eine gute Praxis, wenn Sie unnötige Frustrationen vermeiden möchten, um zu überprüfen, ob Ihre Variable vorhanden und festgelegt ist. Andernfalls geben Sie für den Fall ein Backup-Image an. Sie können auch mehrere Stileigenschaften wie background-position: centerusw. angeben .

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

AllJs
quelle