Zu welchem ​​Speicherort gehört die relative URL in der CSS-Datei?


484

Wenn Sie so etwas wie eine Hintergrundbild-URL in einer CSS-Datei definieren und eine relative URL verwenden, wo ist sie relativ zu? Zum Beispiel:

Angenommen, die Datei /stylesheets/base-styles.cssenthält:

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

Wenn ich dieses Stylesheet über in verschiedene Dokumente einbinde, <link ... />ist die relative URL in der CSS-Datei relativ zum Stylesheet-Dokument in /stylesheets/oder relativ zu dem aktuellen Dokument, in dem es enthalten ist? Mögliche Wege wie:

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

Antworten:


551

Laut W3 :

Teil-URLs werden relativ zur Quelle des Stylesheets interpretiert, nicht relativ zum Dokument

Als Antwort auf Ihre Frage wird es daher relativ zu sein /stylesheets/.

Wenn Sie darüber nachdenken, ist dies sinnvoll, da die CSS-Datei zu Seiten in verschiedenen Verzeichnissen hinzugefügt werden kann. Wenn Sie sie also auf die CSS-Datei standardisieren, funktionieren die URLs überall dort, wo die Stylesheets verknüpft sind.


Es sieht so aus, als gäbe es eine Ausnahme von der Regel: -ms-behaviorin IE :(
pkyeck

2
Es gibt eine weitere Ausnahme: Wenn die URL der Standardwert einer benutzerdefinierten Eigenschaft ist. Angenommen, Sie definieren .banner { background-image: var(--bgimg, url('images/default.jpg')); }, definieren aber noch keinen Wert für --bgimg. Dann auf der Seite /index.html, eine .bannersucht nach /images/default.jpg, aber auf einer anderen Seite /about/index.htmlein .banneraussehen wird /about/images/default.jpg. sehr kaputte IMO.
Chharvey

Korrektur: Der oben genannte Standardwertfehler wurde in Chrome v60 behoben.
Chharvey

Wenn sich Ihr CSS in einem Bundle befindet, spielt der Pfad keine Rolle. Es ist nicht dort, wo du denkst, dass es sein wird, nichts ist mehr relativ.
Tod

1
Ich hatte Probleme bei der Verwendung von Eigenschaften: background: var(--primary-color-background) no-repeat center center url("maps.jpg");Dies funktionierte unter IOS und Safari nicht. /resources/maps.jpgIn Safari funktioniert nur der absolute Pfad in Verbindung mit einer CSS-Eigenschaft.
andy


50

Es ist relativ zum Stylesheet, aber ich würde empfehlen, die URLs relativ zu Ihrer URL zu machen:

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

Auf diese Weise können Sie Ihre Dateien verschieben, ohne sie in Zukunft umgestalten zu müssen.


Welchen Unterschied macht das zusätzliche "/" an der Vorderseite?
Casebash

15
Genau wie Pfadnamen in der Befehlszeile bedeutet das führende / am Anfang des Pfads, dass es auf eine absolute Ressource auf dem aktuellen Webserver verweist.
David W. Keith

4
Es gibt tatsächlich einen Fall, in dem es besser ist, URIs relativ zur CSS-Datei zu verwenden. In meinem Fall habe ich ein Verzeichnis "/ css /", in dem ich alle CSS-Daten ablege. Jetzt möchte ich neue Funktionen auf der Website in einem separaten Ordner testen. Es wird schwierig, z. B. neue Hintergrundbilder im Testordner zu testen. Es hängt alles von Ihren Bedürfnissen ab ...
Diego

12
Absolute Pfade machen es schwierig, die Lösung in einem Unterordner der Domäne abzulegen. Es gibt eine Reihe von Gründen, warum Sie Unterordner unterstützen möchten. Dies erleichtert das Testen (wie von Diego erwähnt), bei dem sich frühere Versionen / Vorabversionen in derselben Domäne wie prod befinden können. Zukünftige Änderungen, bei denen Unternehmens-Proxy-Server so eingerichtet sind, dass sie SSO unterstützen, alle Lösungen in eine Domäne verschieben usw. Insbesondere bei SSL möchten Sie möglicherweise den Aufwand für die Verwaltung mehrerer Domänennamen vermeiden. Für mich sind diese Überlegungen viel wichtiger als "einfacher meine CSS-Datei zu verschieben".
Tedd Hansen

Bilder und ähnliches geht sowieso auf CDN, also ist das perfekt
Muhammad Umer

30

Um modulare Stylesheets zu erstellen, die nicht vom absoluten Speicherort einer Ressource abhängig sind, können Autoren relative URIs verwenden. Relative URIs (wie in [RFC3986] definiert ) werden mithilfe eines Basis-URI in vollständige URIs aufgelöst. RFC 3986, Abschnitt 5, definiert den normativen Algorithmus für diesen Prozess. Bei CSS-Stylesheets ist der Basis-URI der des Stylesheets und nicht der des Quelldokuments.

Angenommen, die folgende Regel gilt:

body { background: url("yellow") }

befindet sich in einem von der URI festgelegten Stylesheet:

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

Der Hintergrund des KÖRPERS des Quelldokuments wird mit dem Bild gekachelt, das von der von der URI angegebenen Ressource beschrieben wird

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

Benutzeragenten können sich darin unterscheiden, wie sie mit ungültigen URIs oder URIs umgehen, die nicht verfügbare oder nicht anwendbare Ressourcen angeben.

Entnommen aus der CSS 2.1-Spezifikation .



5

Ein Problem, das auftreten kann und anscheinend nicht funktioniert, ist die automatische Minimierung von CSS. Der Anforderungspfad für das minimierte Bundle kann einen anderen Pfad als das ursprüngliche CSS haben. Dies kann automatisch geschehen, was zu Verwirrung führen kann.

Der zugeordnete Anforderungspfad für das minimierte Bundle sollte "/ originalcssfolder / minifiedbundlename" und nicht nur "minifiedbundlename" sein.

Mit anderen Worten, benennen Sie Ihre Bundles so, dass sie denselben Pfad (mit dem /) wie die ursprüngliche Ordnerstruktur haben. Auf diese Weise werden externe Ressourcen wie Schriftarten und Bilder vom Browser den korrekten URIs zugeordnet. Die Alternative ist die Verwendung einer absoluten URL (Refs in Ihrem CSS, aber das ist normalerweise nicht wünschenswert.


Das hat mir viel Zeit gespart! Vielen Dank. Es sollte mehr dokumentiert werden
mjbates7

0

Das hat bei mir funktioniert. Hinzufügen von zwei Punkten und Schrägstrich.

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

-4

Versuchen Sie es mit:

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

Images Ordner mit dem Bild, das Sie veröffentlichen möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.