Как добавить фоновое изображение с помощью ngStyle (angular2)?

105

Как использовать ngStyle для добавления фонового изображения? Мой код не работает:

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

<div [ngStyle]="{'background-image': url(' + photo + ')}"></div>
Игнат
источник
почему вы используете скобки для атрибута ngStyle?
gal
См. Также stackoverflow.com/questions/37076867/… о связанной проблеме в RC.1
Günter Zöchbauer

Ответы:

234

Я думаю, вы могли бы попробовать это:

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

Читая ваше ngStyleвыражение лица, я предполагаю, что вы пропустили "'" ...

Тьерри Темплиер
источник
Проверено. Работа с RC.1. Это should't необходимы для РК - 2 и новых релизов в соответствии с тем, что они говорят , что здесь
Лусио Мольинедо
4
Я предпочитаю this.photo = `url(${photo})`; [style.background-image]='photo'.
slideshowp2
4
Имейте в виду, что пробелы в URL-адресе изображения (имя изображения) могут вызвать молчание [ngStyle]и [style.background-image]сбой при визуализации.
vulp
83

Также вы можете попробовать это:

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

Тодми
источник
3
@ redfox05 Я полагаю, что ngStyle - это синтаксический сахар. Основное отличие в том, что ngStyle позволяет применять несколько правил CSS, а [style. <css_prop>] допускает только одно. Следующие эквивалентны: <div [ngStyle]="{ color: 'red', 'font-size': '22px' }">First</div> и <div [style.color]="'red'" [style.font-size.px]="22">Second</div>
Тодми
Я использовал этот подход [style.css], хотя я не могу заставить [style.background-repeat] работать, знаете почему?
Андерс Метник
Как сделать условную стилизацию с помощью этого подхода? Скажем, если я хочу проверить, не является ли фотография нулевым, а затем применить только этот стиль?
Панкадж
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>

Смотрите также

Гюнтер Цохбауэр
источник
6

Похоже, ваш стиль обработан, чтобы обойти его, попробуйте использовать метод bypassSecurityTrustStyle из 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

Использовать вместо

[ngStyle]="{'background-image':' url(' + instagram?.image + ')'}"
Виджей Чаухан
источник
3

Мое фоновое изображение не работало, потому что в URL-адресе был пробел, и поэтому мне нужно было его закодировать.

Вы можете проверить, возникла ли у вас проблема, попробовав другой URL-адрес изображения, в котором нет символов, требующих экранирования.

Вы можете сделать это с данными в компоненте, просто используя Javascripts, встроенные в encodeURI () метод .

Лично я хотел создать для него канал, чтобы его можно было использовать в шаблоне.

Для этого вы можете создать очень простую трубу. Например:

SRC / приложение / трубы / кодировать-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.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

Вы можете использовать 2 метода:

Способ 1

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

Способ 2

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

Примечание: важно заключить URL-адрес в « char.

шумно
источник
0

В большинстве случаев изображение не отображается, потому что ваш URL-адрес содержит пробелы. В вашем случае вы почти все сделали правильно. За исключением одного - вы не добавляли одинарные кавычки, как если бы вы указывали фоновое изображение в css, т.е.

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

Для этого экранируйте символ кавычки в HTML через \ '

                                          \/                                  \/
<div [ngStyle]="{'background-image': 'url(\''+ item.color.catalogImageLink + '\')'}"></div>
просто хорошо
источник
0

Мое решение с использованием оператора if..else. Если вы хотите избежать ненужных разочарований, всегда рекомендуется проверять, существует ли ваша переменная и установлена ​​ли она. В противном случае предоставьте резервную копию на всякий случай; Вы также можете указать несколько свойств стиля, например background-position: center, и т. Д.

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

AllJs
источник