angularjs ng-style: background-image isn't working

JavascriptAngularjsAngularjs DirectiveAngularjs Ng-RepeatNg Style

Javascript Problem Overview


I'm trying to apply a background image to a div by using the angular ng-style ( I tried a custom directive before with the same behaviour ), but it doesn't seem to be working.

<nav
	class="navigation-grid-container"
	data-ng-class="{ bigger: isNavActive == true }"
	data-ng-controller="NavigationCtrl"
	data-ng-mouseenter="isNavActive = true; $parent.isNavActive = true"
	data-ng-mouseleave="isNavActive = false; $parent.isNavActive = false"
	data-ng-show="$parent.navInvisible == false"
	data-ng-animate="'fade'"
	ng-cloak>
	
	<ul class="navigation-container unstyled clearfix">
		<li
			class="navigation-item-container"
			data-ng-repeat="(key, item) in navigation"
			data-ng-class="{ small: $parent.isNavActive, big: isActive == true }"
			data-ng-mouseenter="isActive = true; isInactive= false"
			data-ng-mouseleave="isActive = false; isInactive= true">
			
			<div data-ng-switch on="item.id">

				<div class="navigation-item-default" data-ng-switch-when="scandinavia">
					<a class="navigation-item-overlay" data-ng-href="{{item.id}}">
						<div class="navigation-item-teaser">
							<span class="navigation-item-teaser-text" data-ng-class="{ small: isScandinavia }">{{item.teaser}}</span>
						</div>
					</a>
					<span class="navigation-item-background" data-ng-style="{ 'background-image': 'public/img/products/{{item.id}}/detail/wide/{{item.images.detail.wide[0]}}' }"></span>
				</div>

				<div class="navigation-item-last" data-ng-switch-when="static">
					<div class="navigation-item-overlay">
						<div class="navigation-item-teaser">
							<span class="navigation-item-teaser-text">
								<img data-ng-src="{{item.teaser}}">
							</span>
						</div>
					</div>
					<span class="navigation-item-background">
						<img class="logo" data-ng-src="{{item.images.logo}}">
					</span>
				</div>

				<div class="navigation-item-default" data-ng-switch-default>
					<a class="navigation-item-overlay" data-ng-href="{{item.id}}">
						<div class="navigation-item-teaser">
							<span class="navigation-item-teaser-text">{{item.teaser}}</span>
						</div>
					</a>
					<span class="navigation-item-background" data-ng-style="{ 'background-image': 'public/img/products/{{item.id}}/detail/wide/{{item.images.detail.wide[0]}}' }"></span>
				</div>

			</div>
		</li>
	</ul>
</nav>

Though, if I do try a background color, it seems to be working fine. I tried a remote source and a local source too http://lorempixel.com/g/400/200/sports/, neither worked.

Javascript Solutions


Solution 1 - Javascript

It is possible to parse dynamic values in a couple of way.

Interpolation with double-curly braces:

ng-style="{'background-image':'url({{myBackgroundUrl}})'}"

String concatenation:

ng-style="{'background-image': 'url(' + myBackgroundUrl + ')'}"

ES6 template literals:

ng-style="{'background-image': `url(${myBackgroundUrl})`}"

Solution 2 - Javascript

Correct syntax for background-image is:

background-image: url("path_to_image");

Correct syntax for ng-style is:

ng-style="{'background-image':'url(https://www.google.com/images/srpr/logo4w.png)'}">

Solution 3 - Javascript

IF you have data you're waiting for the server to return (item.id) and have a construct like this:

ng-style="{'background-image':'url(https://www.myImageplusitsid/{{item.id}})'}"

Make sure you add something like ng-if="item.id"

Otherwise you'll either have two requests or one faulty.

Solution 4 - Javascript

For those who are struggling to get this working with IE11

HTML

<div ng-style="getBackgroundStyle(imagepath)"></div>

JS

$scope.getBackgroundStyle = function(imagepath){
    return {
        'background-image':'url(' + imagepath + ')'
    }
}

Solution 5 - Javascript

This worked for me, curly braces are not required.

ng-style="{'background-image':'url(../../../app/img/notification/'+notification.icon+'.png)'}"

notification.icon here is scope variable.

Solution 6 - Javascript

> If we have a dynamic value that needs to go in a css background or > background-image attribute, it can be just a bit more tricky to > specify. > > Let’s say we have a getImage() function in our controller. This > function returns a string formatted similar to this: > url(icons/pen.png). If we do, the ngStyle declaration is specified the > exact same way as before:

ng-style="{ 'background-image': getImage() }"

> Make sure to put quotes around the background-image key name. > Remember, this must be formatted as a valid Javascript object key.

Solution 7 - Javascript

Just for the records you can also define your object in the controller like this:

this.styleDiv = {color: '', backgroundColor:'', backgroundImage : '' };

and then you can define a function to change the property of the object directly:

this.changeBackgroundImage = function (){
		this.styleDiv.backgroundImage = 'url('+this.backgroundImage+')';
	}

Doing it in that way you can modify dinamicaly your style.

Solution 8 - Javascript

The syntax is changed for Angular 2 and above:

[ngStyle]="{'background-image': 'url(path)'}"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRolandView Question on Stackoverflow
Solution 1 - JavascriptsqrenView Answer on Stackoverflow
Solution 2 - JavascriptStewieView Answer on Stackoverflow
Solution 3 - JavascriptflakyView Answer on Stackoverflow
Solution 4 - JavascriptTakuView Answer on Stackoverflow
Solution 5 - JavascriptmkkhedawatView Answer on Stackoverflow
Solution 6 - JavascriptMohammed AmineView Answer on Stackoverflow
Solution 7 - JavascriptEzequielView Answer on Stackoverflow
Solution 8 - JavascriptMaihan NijatView Answer on Stackoverflow