En utilisant l'URL relative dans le fichier CSS, à quel emplacement est-elle relative?

484

Lorsque vous définissez quelque chose comme une URL d'image d'arrière-plan dans un fichier CSS, lorsque vous utilisez une URL relative, où est-elle relative? Par exemple:

Supposons que le fichier /stylesheets/base-styles.csscontienne:

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

Si j'inclus cette feuille de style dans différents documents via <link ... />l'URL relative dans le fichier CSS sera-t-elle relative au document de feuille de style dans /stylesheets/ou relative au document actuel auquel il est inclus? Chemins possibles comme:

/item/details.html
/about/index.html
/about/extra/other.html
/index.html
lâche anonyme
la source

Réponses:

551

Selon W3 :

Les URL partielles sont interprétées par rapport à la source de la feuille de style, et non par rapport au document

Par conséquent, en réponse à votre question, elle sera relative à /stylesheets/.

Si vous y réfléchissez, cela a du sens, car le fichier CSS peut être ajouté à des pages dans différents répertoires, donc la normalisation du fichier CSS signifie que les URL fonctionneront partout où les feuilles de style sont liées.

Alex Rozanski
la source
semble qu'il y ait une exception à la règle: -ms-behaviordans IE :(
pkyeck
2
il existe une autre exception: lorsque l'url est la valeur par défaut d'une propriété personnalisée. Disons que vous définissez .banner { background-image: var(--bgimg, url('images/default.jpg')); }, mais ne définissez pas --bgimgencore de valeur pour . Ensuite sur la page /index.html, un .bannerva chercher /images/default.jpg, mais sur une autre page /about/index.htmlun .bannerva chercher /about/images/default.jpg. IMO très cassé.
chharvey
correction: le bug de valeur par défaut ci-dessus est corrigé dans Chrome v60.
chharvey
si votre css est dans un bundle, le chemin n'a pas vraiment d'importance. Ce n'est pas là où vous pensez que ça va être, rien n'est plus relatif.
Tod
1
J'ai eu des problèmes lors de l'utilisation des propriétés: background: var(--primary-color-background) no-repeat center center url("maps.jpg");cela ne fonctionnait pas dans IOS et Safari. Seul le chemin absolu /resources/maps.jpgfonctionne dans Safari en conjonction avec une propriété css.
andy
69

C'est relatif au fichier CSS.

M4N
la source
50

C'est relatif à la feuille de style, mais je recommanderais de faire les URL par rapport à votre URL:

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

De cette façon, vous pouvez déplacer vos fichiers sans avoir besoin de les refactoriser à l'avenir.

Codebeef
la source
Quelle différence fait le "/" supplémentaire à l'avant?
Casebash
15
Tout comme les chemins d'accès sur la ligne de commande, le début / à l'avant du chemin signifie qu'il pointe vers une ressource absolue sur le serveur Web actuel.
David W. Keith
4
Il y a en fait un cas où il est préférable d'utiliser des URI par rapport au fichier CSS. Dans mon cas, j'ai un répertoire "/ css /" où je mets toutes les données CSS. Maintenant, je veux tester de nouvelles fonctionnalités sur le site Web dans un dossier séparé. Il devient difficile de tester, par exemple, de nouvelles images d'arrière-plan dans le dossier de test. Tout dépend de vos besoins ...
Diego
12
Les chemins absolus rendent difficile la mise en solution dans un sous-dossier du domaine. Il existe un certain nombre de raisons pour lesquelles vous souhaitez prendre en charge les sous-dossiers. Il est plus facile de faire des tests (comme Diego l'a mentionné) où vous pouvez avoir des versions / pré-versions précédentes situées sur le même domaine que prod. Changements futurs où les serveurs proxy d'entreprise sont configurés pour prendre en charge l'authentification unique, déplacer toutes les solutions vers un seul domaine, etc. Surtout avec SSL, on peut vouloir éviter la surcharge de plusieurs noms de domaine à maintenir. Pour moi, ces considérations sont beaucoup plus importantes que "plus facile de déplacer mon fichier .css".
Tedd Hansen
des images et des trucs comme ça vont de toute façon à cdn donc c'est parfait
Muhammad Umer
30

Afin de créer des feuilles de style modulaires qui ne dépendent pas de l'emplacement absolu d'une ressource, les auteurs peuvent utiliser des URI relatifs. Les URI relatifs (tels que définis dans [RFC3986] ) sont résolus en URI complets en utilisant un URI de base. La RFC 3986, section 5, définit l'algorithme normatif pour ce processus. Pour les feuilles de style CSS, l'URI de base est celui de la feuille de style, pas celui du document source.

Par exemple, supposons la règle suivante:

body { background: url("yellow") }

se trouve dans une feuille de style désignée par l'URI:

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

L'arrière-plan du CORPS du document source sera recouvert de n'importe quelle image décrite par la ressource désignée par l'URI

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

Les agents utilisateurs peuvent varier dans la façon dont ils gèrent les URI non valides ou les URI qui désignent des ressources indisponibles ou inapplicables.

Tiré de la spécification CSS 2.1 .

jrista
la source
5

Un problème qui peut survenir, et qui semble le briser, est lors de l'utilisation de la minimisation automatique de CSS Le chemin de demande pour le bundle minifié peut avoir un chemin différent de celui du css d'origine. Cela peut se produire automatiquement et provoquer de la confusion.

Le chemin de demande mappé pour le bundle minifié doit être "/ originalcssfolder / minifiedbundlename" et pas seulement "minifiedbundlename".

En d'autres termes, nommez vos bundles pour avoir le même chemin (avec le /) que la structure de dossiers d'origine, de cette façon toutes les ressources externes comme les polices, les images seront mappées pour corriger les URI par le navigateur. L'alternative est d'utiliser une URL absolue (références dans votre CSS mais ce n'est généralement pas souhaitable.

mms
la source
Cela m'a fait gagner beaucoup de temps! Merci. Cela devrait être documenté plus
mjbates7
0

Cela a fonctionné pour moi. en ajoutant deux points et une barre oblique.

body{
    background: url(../images/yourimage.png);
}
Jakob Sternberg
la source
-4

Essayez d'utiliser:

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

Images étant un dossier contenant l'image que vous souhaitez publier.

Keshh Chiei
la source