我正在尝试在一个元素中绑定图像的src,但它似乎不起作用。我得到一个“无效的表达式。生成的函数体:{backgroundImage:{url(image)}”。
documentation说要使用'烤肉串案例'或'驼峰案例'。
<div class="circular" v-bind:style="{ backgroundImage: { url(image) }"></div>
这是一个小提琴:https://jsfiddle.net/0dw9923f/2/
答案 0 :(得分:123)
问题是backgroundImage
的值必须是这样的字符串:
<div class="circular" v-bind:style="{ backgroundImage: 'url(' + image + ')' }"></div>
这是一个简化的小提琴:https://jsfiddle.net/89af0se9/1/
回复:下面关于烤肉串案例的评论,你可以这样做:
<div class="circular" v-bind:style="{ 'background-image': 'url(' + image + ')' }"></div>
换句话说,v-bind:style
的值只是一个普通的Javascript对象,遵循相同的规则。
更新:另一个说明为什么你可能无法让它工作。
您应该确保引用了image
值,以便最终生成的字符串为:
url('some/url/path/to/image.jpeg')
否则,如果您的图片网址中包含特殊字符(例如空格或括号),则浏览器可能无法正确应用它。在Javascript中,赋值看起来像:
this.image = "'some/url/path/to/image.jpeg'"
或
this.image = "'" + myUrl + "'"
从技术上讲,这可以在模板中完成,但保持有效HTML所需的转义是不值得的。
答案 1 :(得分:9)
<div class="img-banner" :style="{'background-image': 'url(' + require('./assets/media/baner1.jpg') + ')'}"></div>
答案 2 :(得分:4)
<div :style="{ backgroundImage: `url(${post.image})` }">
有多种方法,但我发现模板字符串容易
答案 3 :(得分:2)
我尝试了@david的答案,但没有解决我的问题。经过很多麻烦之后,我制作了一个方法,并使用样式字符串返回了图像。
HTML代码
<div v-for="slide in loadSliderImages" :key="slide.id">
<div v-else :style="bannerBgImage(slide.banner)"></div>
</div>
方法
bannerBgImage(image){
return 'background-image: url("' + image + '")';
},
答案 4 :(得分:1)
另一种解决方案:
<template>
<div :style="cssProps"></div>
</template>
<script>
export default {
data() {
return {
cssProps: {
backgroundImage: `url(${require('@/assets/path/to/your/img.jpg')})`
}
}
}
}
</script>
什么使此解决方案更方便? 首先,它更清洁。然后,如果您使用的是Vue CLI(我想是的话),则可以通过webpack加载它。
注意:请不要忘记require()
总是相对于当前文件的路径。
答案 5 :(得分:1)
接受的答案似乎并不能解决我的问题,但这确实可以解决
确保您的backgroundImage声明用url(和引号引起来)进行包装,这样无论文件名如何,样式都能正常工作。
ES2015风格:
<div :style="{ backgroundImage: `url('${image}')` }"></div>
或者没有ES2015:
<div :style="{ backgroundImage: 'url(\'' + image + '\')' }"></div>
答案 6 :(得分:0)
对于单个重复组件,此技术对我来说是有效的
<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+')'
}
},
}
答案 7 :(得分:0)
绑定背景图像样式,如下所示。
<div v-for="i in items" :key="n"
:style="{backgroundImage: 'url('+require('./assets/cars/'+i.src+'.jpg')+')'}">
</div>
答案 8 :(得分:0)
我遇到了一个问题,即文件名中带有空格的背景图像导致无法应用样式。为了解决这个问题,我必须确保将字符串路径封装在单引号中。
在下面的示例中注意转义的\'。
<div :style="{
height: '100px',
backgroundColor: '#323232',
backgroundImage: 'url(\'' + event.image + '\')',
backgroundPosition: 'center center',
backgroundSize: 'cover'
}">
</div>
答案 9 :(得分:0)
据我所知,如果您将图像文件夹放在公用文件夹中,则只需执行以下操作:
<div :style="{backgroundImage: `url(${project.imagePath})`}"></div>
如果您将图像放在 src/assets/
中,则需要使用 require。像这样:
<div :style="{backgroundImage: 'url('+require('@/assets/'+project.image)+')'}">.
</div>
一件重要的事情是,您不能使用像 project.image = '@/assets/image.png'
这样包含完整 URL 的表达式。您需要对 '@assets/'
部分进行硬编码。这就是我发现的。我认为原因是在 Webpack 中,如果您的 require 包含表达式,则会创建一个上下文,因此在编译时不知道确切的模块。相反,它将搜索 @/assets
文件夹中的所有内容。可以在 here 中找到更多信息。这是另一个 doc 解释了 Vue 加载器如何处理单个文件组件中的链接。
答案 10 :(得分:0)
我必须在 .default
之后添加 require
才能使其工作:
:style="{ backgroundImage: `url(${require('@/media/bg-1.jpg').default})` }"
答案 11 :(得分:0)
我在这篇文章中搜索过,但没有人用 require
文件名发布 dynamic
,这就是我发布它的原因。
:style="{ backgroundImage: `url(${require('@/assets/' + banner.image)})` }"
答案 12 :(得分:0)
尝试 encodeURI()
我遇到的问题是由于我尝试使用的 URL 中的特殊字符和/或空格造成的。
所以我不得不改变这个:
:style="{ backgroundImage : 'url(' + item.media.url + ')' }"
为此:
:style="{ backgroundImage : 'url(' + encodeURI(item.media.url) + ')' }"
答案 13 :(得分:-3)
:style="{ backgroundImage: `url('${src}')` }"