Vue.js data-bind style backgroundImage non funzionante


94

Sto cercando di legare lo src di un'immagine in un elemento, ma non sembra funzionare. Ricevo "Espressione non valida. Corpo della funzione generato: {backgroundImage: {url (image)}".

La documentazione dice di usare "Kebab-case" o "camel-case".

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

Ecco un violino: https://jsfiddle.net/0dw9923f/2/

Risposte:


215

Il problema è che il valore per backgroundImagedeve essere una stringa come questa:

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

Ecco un violino semplificato che funziona: https://jsfiddle.net/89af0se9/1/

Re: il commento qui sotto su kebab-case, ecco come puoi farlo:

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

In altre parole, il valore per v-bind:styleè solo un semplice oggetto Javascript e segue le stesse regole.

AGGIORNAMENTO: Un'altra nota sul motivo per cui potresti avere problemi a farlo funzionare.

Assicurati che il tuo imagevalore sia tra virgolette in modo che la stringa finale risultante sia:

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

In caso contrario, se l'URL dell'immagine contiene caratteri speciali (come spazi o parentesi), il browser potrebbe non applicarlo correttamente. In Javascript, l'assegnazione sarebbe simile a:

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

o

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

Tecnicamente, questo potrebbe essere fatto nel modello, ma l'escape richiesto per mantenerlo valido HTML non ne vale la pena.

Maggiori informazioni qui: la citazione del valore di url () è davvero necessaria?


15
a partire da marzo 2016, deve anche essere il caso del cammello ( backgroundImage) e non del caso del kebab ( background-image) anche se i documenti dicono che può essere l'uno o l'altro.
andrewtweber

2
Se qualcuno è uno stupido come me, potresti averlo fatto backgroundImage: imageinvece di backgroundImage: 'url('+image+')'. Sono rimasto così preso dalla sintassi di vue che ho dimenticato il file url().
bendytree

All'interno di un componente Vue, ha funzionato per me solo per dire v-bind:style="{ 'background-image': url(image) }", ma al di fuori di un componente (solo su una pagina normale) sembrava richiedere l'inserimento dell'URL tra virgolette. Qualcuno sa perché potrebbe essere?
Keara

2
@David Penso che in realtà ci fosse un metodo URL che ho scritto e di cui mi sono dimenticato, e che fa esattamente quello che mi aspettavo ... è piuttosto divertente. Non posso davvero provarlo in un violino a causa dei componenti Vue che si trovano in file separati, ma sono sicuro che questo è ciò che ha causato il comportamento strano, dopo tutto. Grazie!
Keara

1
Le citazioni mancanti erano il mio problema. Grazie per questo, sto perdendo ore qui!
DonMB

32
<div :style="{'background-image': 'url(' + require('./assets/media/img.jpg') + ')'}"></div>

16

Un'altra soluzione:

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

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

Cosa rende più conveniente questa soluzione? In primo luogo, è più pulito. E poi, se stai usando Vue CLI (presumo che tu lo faccia), puoi caricarlo con webpack.

Nota: non dimenticare che require()è sempre relativo al percorso del file corrente.


5
<div :style="{ backgroundImage: `url(${post.image})` }">

ci sono molti modi, ma ho trovato la stringa del modello facile e semplice


1
Sono venuto qui per postare questo. Sicuramente il metodo migliore con ES6.
corysimmons

Il letterale del modello ES5 sembra la nuova strada da percorrere. Le concatenazioni sono zoppe 🤓
zEELz

3

Lo stile di immagine di sfondo vincolante utilizzando un valore dinamico da v-for loop potrebbe essere fatto in questo modo.

<div v-for="i in items" :key="n" 
  :style="{backgroundImage: 'url('+require('./assets/cars/'+i.src+'.jpg')+')'}">
</div>

Mi dispiace molto, non ricordo di aver cliccato sul pulsante downvote. Deve essere successo per caso. Annullato.
mtsz

@mtsz non preoccuparti.
Abdelsalam Shahlol

3

Per il singolo componente ripetuto questa tecnica funziona per 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+')'
                }
            },
}

2

Ho provato la risposta @david e non ha risolto il mio problema. dopo un sacco di problemi, ho creato un metodo e restituito l'immagine con una stringa di stile.

Codice HTML

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

Metodo

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

1

Ho riscontrato un problema in cui le immagini di sfondo con spazi nel nome del file causavano la mancata applicazione dello stile. Per correggere questo ho dovuto assicurarmi che il percorso della stringa fosse racchiuso tra virgolette singole.

Nota l'escape \ 'nel mio esempio qui sotto.

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

1

La risposta accettata non sembrava risolvere il problema per me, ma così è stato

Assicurati che le dichiarazioni di backgroundImage siano racchiuse in url (e virgolette in modo che lo stile funzioni correttamente, indipendentemente dal nome del file.

Stile ES2015:

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

O senza ES2015:

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

Fonte: vuejs / vue-loader numero 646


0

In base alle mie conoscenze, se metti la cartella delle immagini nella cartella pubblica, puoi semplicemente fare quanto segue:

   <div :style="{backgroundImage: `url(${project.imagePath})`}"></div>

Se metti le tue immagini in src/assets/, devi usare require. Come questo:

   <div :style="{backgroundImage: 'url('+require('@/assets/'+project.image)+')'}">. 
   </div>

Una cosa importante è che non puoi usare un'espressione che contiene l'URL completo come questo project.image = '@/assets/image.png'. È necessario codificare la '@assets/'parte. Questo è quello che ho trovato. Penso che il motivo sia che in Webpack, viene creato un contesto se la tua richiesta contiene espressioni, quindi il modulo esatto non è noto in fase di compilazione. Invece, cercherà tutto nella @/assetscartella. Maggiori informazioni possono essere trovate qui . Ecco un altro documento che spiega come il caricatore Vue tratta il collegamento nei componenti a file singolo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.