Utilizzando l'URL relativo nel file CSS, a quale posizione è relativo?


484

Quando si definisce qualcosa come un URL di immagine di sfondo in un file CSS, quando si utilizza un URL relativo, a che punto è relativo? Per esempio:

Supponiamo che il file /stylesheets/base-styles.csscontenga:

div#header { 
    background-image: url('images/header-background.jpg');
}

Se includo questo foglio di stile in diversi documenti via <link ... />sarà l'URL relativo al file CSS sia rispetto al documento foglio di stile in /stylesheets/o relativo al documento corrente è incluso a? Percorsi possibili come:

/item/details.html
/about/index.html
/about/extra/other.html
/index.html

Risposte:


551

Secondo W3 :

Gli URL parziali vengono interpretati in relazione all'origine del foglio di stile, non in relazione al documento

Pertanto, in risposta alla tua domanda, sarà relativa a /stylesheets/.

Se ci pensate, questo ha senso, poiché il file CSS potrebbe essere aggiunto a pagine in diverse directory, quindi standardizzarlo con il file CSS significa che gli URL funzioneranno ovunque i fogli di stile siano collegati.


sembra che ci sia un'eccezione alla regola: -ms-behaviorin IE :(
pkyeck,

2
c'è un'altra eccezione: quando l'URL è il valore predefinito di una proprietà personalizzata. Di 'che definisci .banner { background-image: var(--bgimg, url('images/default.jpg')); }, ma non definire ancora un valore --bgimg. Poi sulla pagina /index.html, un .bannercercherà /images/default.jpg, ma in un'altra pagina /about/index.htmldi un .bannerguarderà /about/images/default.jpg. IMO molto rotto.
Chharvey,

correzione: il bug del valore predefinito sopra è stato corretto in Chrome v60.
Chharvey,

se il tuo CSS è in un bundle, il percorso non ha davvero importanza. Non è dove pensi che sarà, niente è più relativo.
Tod

1
Ho riscontrato problemi durante l'utilizzo delle proprietà: background: var(--primary-color-background) no-repeat center center url("maps.jpg");non funzionava in IOS e Safari. Solo il percorso assoluto /resources/maps.jpgfunziona in Safari insieme a una proprietà css.
andy,


50

È relativo al foglio di stile, ma ti consiglio di creare gli URL relativi al tuo URL:

div#header { 
  background-image: url(/images/header-background.jpg);
}

In questo modo, puoi spostare i tuoi file senza doverli riformattare in futuro.


Che differenza fa la "/" extra nella parte anteriore?
Casebash,

15
Proprio come i percorsi nella riga di comando, il comando / all'inizio del percorso indica che punta a una risorsa assoluta sul server Web corrente.
David W. Keith,

4
In realtà c'è un caso in cui è meglio usare gli URI relativi al file CSS. Nel mio caso, ho una directory "/ css /" in cui inserisco tutti i dati CSS. Ora, voglio testare nuove funzionalità sul sito Web in una cartella separata. È difficile testare, ad esempio, nuove immagini di sfondo nella cartella test. Tutto dipende dalle tue esigenze ...
Diego,

12
I percorsi assoluti rendono difficile mettere la soluzione in una sottocartella del dominio. Esistono diversi motivi per cui si desidera supportare le sottocartelle. Semplifica i test (come menzionato Diego) in cui è possibile avere versioni / pre-release precedenti situate nello stesso dominio di prod. Cambiamenti futuri in cui i server proxy aziendali sono impostati per supportare SSO, spostando tutte le soluzioni in un dominio, ecc. Soprattutto con SSL si potrebbe voler evitare il sovraccarico di più nomi di dominio da mantenere. Per me queste considerazioni sono molto più importanti di "più facile spostare il mio file .css".
Tedd Hansen,

immagini e cose del genere vanno comunque su cdn, quindi è perfetto
Muhammad Umer,

30

Al fine di creare fogli di stile modulari che non dipendono dalla posizione assoluta di una risorsa, gli autori possono utilizzare URI relativi. Gli URI relativi (come definiti in [RFC3986] ) vengono risolti in URI completi utilizzando un URI di base. RFC 3986, sezione 5, definisce l'algoritmo normativo per questo processo. Per i fogli di stile CSS, l'URI di base è quello del foglio di stile, non quello del documento di origine.

Ad esempio, supponiamo che la seguente regola:

body { background: url("yellow") }

si trova in un foglio di stile designato dall'URI:

http://www.example.org/style/basic.css

Lo sfondo del BODY del documento di origine verrà piastrellato con qualsiasi immagine descritta dalla risorsa designata dall'URI

http://www.example.org/style/yellow

I programmi utente possono variare nel modo in cui gestiscono URI o URI non validi che designano risorse non disponibili o inapplicabili.

Tratto dalle specifiche CSS 2.1 .



5

Un problema che può verificarsi e che sembra interromperlo è quando si utilizza la minimizzazione automatica dei CSS. Il percorso della richiesta per il bundle minimizzato può avere un percorso diverso rispetto al css originale. Ciò può accadere automaticamente, quindi può creare confusione.

Il percorso della richiesta mappata per il bundle minimizzato dovrebbe essere "/ originalcssfolder / minifiedbundlename" non solo "minifiedbundlename".

In altre parole, nomina i tuoi bundle in modo che abbiano lo stesso percorso (con /) della struttura di cartelle originale, in questo modo tutte le risorse esterne come i caratteri, le immagini verranno mappate per correggere gli URI dal browser. L'alternativa è usare l'URL assoluto (rif nel tuo CSS ma che di solito non è desiderabile.


Questo mi ha fatto risparmiare un sacco di tempo! Grazie. Dovrebbe essere documentato di più
mjbates7

0

Questo ha funzionato per me. aggiungendo due punti e una barra.

body{
    background: url(../images/yourimage.png);
}

-4

Prova a usare:

body {
  background-attachment: fixed;
  background-image: url(./Images/bg4.jpg);
}

Images essendo una cartella che contiene l'immagine che desideri pubblicare.

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.