Image d'arrière-plan de style de liaison de données Vue.js ne fonctionne pas

89

J'essaye de lier le src d'une image dans un élément, mais cela ne semble pas fonctionner. J'obtiens une "Expression non valide. Corps de la fonction générée: {backgroundImage: {url (image)}".

La documentation dit d'utiliser soit 'Kebab-case' ou 'camel-case'.

<div class="circular" v-bind:style="{ backgroundImage: { url(image) }"></div>

Voici un violon: https://jsfiddle.net/0dw9923f/2/

CosX
la source

Réponses:

208

Le problème est que la valeur de backgroundImagedoit être une chaîne comme celle-ci:

<div class="circular" v-bind:style="{ backgroundImage: 'url(' + image + ')' }"></div>

Voici un violon simplifié qui fonctionne: https://jsfiddle.net/89af0se9/1/

Re: le commentaire ci-dessous sur kebab-case, voici comment vous pouvez le faire:

<div class="circular" v-bind:style="{ 'background-image': 'url(' + image + ')' }"></div>

En d'autres termes, la valeur pour v-bind:styleest juste un objet Javascript simple et suit les mêmes règles.

MISE À JOUR: Une autre remarque sur les raisons pour lesquelles vous pourriez avoir du mal à faire fonctionner cela.

Vous devez vous assurer que votre imagevaleur est entre guillemets afin que la chaîne résultante de fin soit:

url('some/url/path/to/image.jpeg')

Sinon, si l'URL de votre image contient des caractères spéciaux (tels que des espaces ou des parenthèses), le navigateur risque de ne pas l'appliquer correctement. En Javascript, l'affectation ressemblerait à:

this.image = "'some/url/path/to/image.jpeg'"

ou

this.image = "'" + myUrl + "'"

Techniquement, cela pourrait être fait dans le modèle, mais l'échappement requis pour le garder valide HTML n'en vaut pas la peine.

Plus d'infos ici: Est-ce vraiment nécessaire de citer la valeur de url ()?

David K. Hess
la source
15
à partir de mars 2016, il doit également être camel case ( backgroundImage) pas kebab case ( background-image) même si la documentation dit que cela peut l'être non plus.
andrewtweber
2
Si quelqu'un est un gaffeur comme moi, vous l'avez peut-être fait à la backgroundImage: imageplace backgroundImage: 'url('+image+')'. Je suis tellement accro à la syntaxe vue que j'ai oublié le url().
bendytree
Dans un composant Vue, cela fonctionnait pour moi juste de dire v-bind:style="{ 'background-image': url(image) }", mais en dehors d'un composant (juste sur une page normale), il semblait nécessiter de mettre l'URL entre guillemets. Est-ce que quelqu'un sait pourquoi cela pourrait être?
Keara
2
@David Je pense qu'il y avait en fait une méthode d'URL que j'ai écrite et oubliée, et qui fait exactement ce à quoi je m'attendais ... c'est assez hilarant. Je ne peux pas vraiment le tester dans un violon à cause des composants de Vue dans des fichiers séparés, mais je suis sûr que c'est ce qui causait le comportement étrange après tout. Merci!
Keara
1
Les citations manquantes étaient mon problème. Merci pour cela, je perdais des heures ici!
DonMB
29
<div :style="{'background-image': 'url(' + require('./assets/media/img.jpg') + ')'}"></div>
mohammad nazari
la source
14

Une autre solution:

<template>
  <div :style="cssProps"></div>
</template>

<script>
  export default {
    data() {
      return {
        cssProps: {
          backgroundImage: `url(${require('@/assets/path/to/your/img.jpg')})`
        }
      }
    }
  }
</script>

Qu'est-ce qui rend cette solution plus pratique? Premièrement, c'est plus propre. Et puis, si vous utilisez Vue CLI (je suppose que vous le faites), vous pouvez le charger avec webpack.

Remarque: n'oubliez pas que require()c'est toujours relatif au chemin du fichier actuel.

Egdavid
la source
4
<div :style="{ backgroundImage: `url(${post.image})` }">

il y a plusieurs façons mais j'ai trouvé la chaîne de modèle facile et simple

chougle saud
la source
1
Je suis venu ici pour poster ceci. Certainement la meilleure méthode avec ES6.
corysimmons
Le modèle ES5 littéral semble être la nouvelle voie à suivre. Les concaténations sont nulles 🤓
zEELz
3

La liaison du style d'image d'arrière-plan à l'aide d'une valeur dynamique de la boucle v-for pourrait être effectuée comme suit.

<div v-for="i in items" :key="n" 
  :style="{backgroundImage: 'url('+require('./assets/cars/'+i.src+'.jpg')+')'}">
</div>
Abdelsalam Shahlol
la source
Je suis vraiment désolé, je ne me souviens pas d'avoir cliqué sur le bouton de vote défavorable. Doit être arrivé par accident. Défait.
mtsz le
@mtsz pas de soucis.
Abdelsalam Shahlol
2

Pour un seul composant répété, cette technique fonctionne pour moi

<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+')'
                }
            },
}
codeur618
la source
2

J'ai essayé la réponse @david , et cela n'a pas résolu mon problème. après beaucoup de tracas, j'ai créé une méthode et renvoyé l'image avec une chaîne de style.

Code HTML

<div v-for="slide in loadSliderImages" :key="slide.id">
    <div v-else :style="bannerBgImage(slide.banner)"></div>
</div>

Méthode

bannerBgImage(image){
    return 'background-image: url("' + image + '")';
},
devzakir
la source
1

J'ai rencontré un problème où les images d'arrière-plan avec des espaces dans le nom de fichier entraînaient la non-application du style. Pour corriger cela, je devais m'assurer que le chemin de la chaîne était encapsulé entre guillemets simples.

Notez le \ 'échappé dans mon exemple ci-dessous.

<div :style="{
    height: '100px',
    backgroundColor: '#323232',
    backgroundImage: 'url(\'' + event.image + '\')',
    backgroundPosition: 'center center',
    backgroundSize: 'cover'
    }">
</div>
WDuffy
la source
0

La réponse acceptée ne semblait pas résoudre le problème pour moi, mais cela a fait

Assurez-vous que vos déclarations backgroundImage sont enveloppées dans une URL (et des guillemets pour que le style fonctionne correctement, quel que soit le nom du fichier.

Style ES2015:

<div :style="{ backgroundImage: `url('${image}')` }"></div>

Ou sans ES2015:

<div :style="{ backgroundImage: 'url(\'' + image + '\')' }"></div>

Source: vuejs / vue-loader issue # 646

bmatovu
la source