'Vue.js data-bind style backgroundImage not working
I'm trying to bind the src of an image in an element, but it doesn't seem to work. I'm getting an "Invalid expression. Generated function body: { backgroundImage:{ url(image) }".
The documentation says to use either 'Kebab-case' or 'camel-case'.
<div class="circular" v-bind:style="{ backgroundImage: { url(image) }"></div>
Heres a fiddle: https://jsfiddle.net/0dw9923f/2/
Solution 1:[1]
<div :style="{'background-image': 'url(' + require('./assets/media/img.jpg') + ')'}"></div>
Solution 2:[2]
Another solution:
<template>
<div :style="cssProps"></div>
</template>
<script>
export default {
data() {
return {
cssProps: {
backgroundImage: `url(${require('@/assets/path/to/your/img.jpg')})`
}
}
}
}
</script>
What makes this solution more convenient? Firstly, it's cleaner. And then, if you're using Vue CLI (I assume you do), you can load it with webpack.
Note: don't forget that require() is always relative to the current file's path.
Solution 3:[3]
<div :style="{ backgroundImage: `url(${post.image})` }">
there are multiple ways but i found template string easy and simple
Solution 4:[4]
I searched in this post but no one posted require with dynamic filename that's why I am posting it.
:style="{ backgroundImage: `url(${require('@/assets/' + banner.image)})` }"
Solution 5:[5]
For single repeated component this technic work for me
<div class="img-section" :style=img_section_style >
computed: {
img_section_style: function(){
var bgImg= this.post_data.fet_img
return {
"color": "red",
"border" : "5px solid ",
"background": 'url('+bgImg+')'
}
},
}
Solution 6:[6]
Binding background image style using a dynamic value from v-for loop could be done like this.
<div v-for="i in items" :key="n"
:style="{backgroundImage: 'url('+require('./assets/cars/'+i.src+'.jpg')+')'}">
</div>
Solution 7:[7]
I experienced an issue where background images with spaces in the filename where causing the style to not be applied. To correct this I had to ensure the string path was encapsulated in single quotes.
Note the escaped \' in my example below.
<div :style="{
height: '100px',
backgroundColor: '#323232',
backgroundImage: 'url(\'' + event.image + '\')',
backgroundPosition: 'center center',
backgroundSize: 'cover'
}">
</div>
Solution 8:[8]
The accepted answer didn't seem to solve the problem for me, but this did
Ensure your backgroundImage declarations are wrapped in url( and quotes so the style works correctly, no matter the file name.
ES2015 Style:
<div :style="{ backgroundImage: `url('${image}')` }"></div>
Or without ES2015:
<div :style="{ backgroundImage: 'url(\'' + image + '\')' }"></div>
Source: vuejs/vue-loader issue #646
Solution 9:[9]
I use the VUE options (~@/)
I defined a class
<template>
<v-container class="bgExampleClass" fuild>
<!-- Content-->
</v-container>
</template>
<script></script>
<style>
.bgExampleClass{
background-image: url('~@/assets/imgs/backgroundExample.jpg');
}
</style>
Solution 10:[10]
I tried @david answer, and it didn't fix my issue. after a lot of hassle, I made a method and return the image with style string.
HTML Code
<div v-for="slide in loadSliderImages" :key="slide.id">
<div v-else :style="bannerBgImage(slide.banner)"></div>
</div>
Method
bannerBgImage(image){
return `background-image: url(${image})`;
},
Solution 11:[11]
Based on my knowledge, if you put your image folder in your public folder, you can just do the following:
<div :style="{backgroundImage: `url(${project.imagePath})`}"></div>
If you put your images in the src/assets/, you need to use require. Like this:
<div :style="{backgroundImage: 'url('+require('@/assets/'+project.image)+')'}">.
</div>
One important thing is that you cannot use an expression that contains the full URL like this project.image = '@/assets/image.png'. You need to hardcode the '@assets/' part. That was what I've found. I think the reason is that in Webpack, a context is created if your require contains expressions, so the exact module is not known on compile time. Instead, it will search for everything in the @/assets folder. More info could be found here. Here is another doc explains how the Vue loader treats the link in single file components.
Solution 12:[12]
Try encodeURI()
The issue I had was due to special chars and/or whitespace in the URL I was attempting to use.
So I had to change this:
:style="{ backgroundImage : 'url(' + item.media.url + ')' }"
To this:
:style="{ backgroundImage : 'url(' + encodeURI(item.media.url) + ')' }"
Solution 13:[13]
the easiest wat to add background image by style tag in vuejs is
<style>
.somediv {
background-image: url('~@/image-path')
}
</style>
you need to add `~` before source alias
Solution 14:[14]
A solution I'd recommend, without modifying too much of your fiddle code, only requires a simple tweak:
To quote a snippet of the Vue.js v2 documentation;
In-template expressions are very convenient, but they are meant for simple operations. Putting too much logic in your templates can make them bloated and hard to maintain.
As it applies to this very case, (assuming the value/state of the image data property isn't likely to change), using a computed property will keep your template cleaner and more maintainable.
See refactor --
<!-- HTML -->
<div id="app"></div>
// JS
var template = "<div class=\"circular\" v-bind:style=\"imageUrl\"></div>";
var el = document.querySelector("#app");
var data = {
image: "http://1.bp.blogspot.com/-8PfnHfgrH4I/TylX2v8pTMI/AAAAAAAAJJ4/TICBoSEI57o/s1600/search_by_image_image.png"
};
new Vue({
el: el,
replace: false,
template: template,
data: data,
computed: {
imageUrl: function() {
return {'background-image': `url(${this.image})`}
}
}
})
Solution 15:[15]
I had to add .default after require for this to work:
:style="{ backgroundImage: `url(${require('@/media/bg-1.jpg').default})` }"
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
