Używając względnego adresu URL w pliku CSS, do jakiej lokalizacji się odnosi?

484

Kiedy definiujesz coś w rodzaju adresu URL obrazu tła w pliku CSS, kiedy używasz względnego adresu URL, gdzie jest on względny? Na przykład:

Załóżmy, że plik /stylesheets/base-styles.csszawiera:

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

Gdybym to arkusz stylów do różnych dokumentów za pośrednictwem <link ... />będzie względny adres URL w pliku CSS być w stosunku do dokumentu arkusza stylów w /stylesheets/lub w stosunku do bieżącego dokumentu to jest wliczone do? Możliwe ścieżki takie jak:

/item/details.html
/about/index.html
/about/extra/other.html
/index.html
anonimowy tchórz
źródło

Odpowiedzi:

551

Według W3 :

Częściowe adresy URL są interpretowane względem źródła arkusza stylów, a nie względem dokumentu

Dlatego w odpowiedzi na twoje pytanie będzie ono względne /stylesheets/.

Jeśli się nad tym zastanowić, ma to sens, ponieważ plik CSS można dodać do stron w różnych katalogach, więc standaryzacja go do pliku CSS oznacza, że ​​adresy URL będą działać wszędzie tam, gdzie połączone są arkusze stylów.

Alex Różański
źródło
wygląda na to, że istnieje wyjątek od reguły: -ms-behaviorw IE :(
pkyeck
2
istnieje inny wyjątek: gdy URL jest domyślną wartością właściwości niestandardowej. Powiedz, że definiujesz .banner { background-image: var(--bgimg, url('images/default.jpg')); }, ale nie definiuj jeszcze wartości --bgimg. Następnie na stronie /index.html, A .bannerbędzie szukać /images/default.jpg, ale na innej stronie będzie wyglądać . bardzo zepsute IMO. /about/index.html.banner/about/images/default.jpg
chharvey
korekta: powyższy błąd wartości domyślnej został naprawiony w Chrome v60.
chharvey
jeśli twój css jest w pakiecie, ścieżka naprawdę nie ma znaczenia. Nie jest tak, jak myślisz, że będzie, nic już nie jest względne.
Tod
1
Miałem problemy podczas korzystania z właściwości: background: var(--primary-color-background) no-repeat center center url("maps.jpg");To nie działało w IOS i Safari. Tylko ścieżka bezwzględna /resources/maps.jpgdziała w przeglądarce Safari w połączeniu z właściwością css.
andy
69

Jest względny w stosunku do pliku CSS.

M4N
źródło
50

Jest względny w stosunku do arkusza stylów, ale zalecam, aby adresy URL były względne w stosunku do adresu URL:

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

W ten sposób możesz przenosić swoje pliki bez konieczności ich refaktoryzacji w przyszłości.

Codebeef
źródło
Jaką różnicę robi dodatkowe „/” z przodu?
Casebash
15
Podobnie jak nazwy ścieżek w wierszu poleceń, wiodący / z przodu ścieżki oznacza, że ​​wskazuje na absolutny zasób na bieżącym serwerze internetowym.
David W. Keith
4
W rzeczywistości jest taki przypadek, w którym lepiej jest używać identyfikatorów URI w stosunku do pliku CSS. W moim przypadku mam katalog „/ css /”, w którym umieszczam wszystkie dane CSS. Teraz chcę przetestować nowe funkcje w witrynie w osobnym folderze. Trudno jest przetestować np. Nowe obrazy tła w folderze testowym. Wszystko zależy od twoich potrzeb ...
Diego
12
Ścieżki bezwzględne utrudniają umieszczenie rozwiązania w podfolderze domeny. Istnieje wiele powodów, dla których chcesz obsługiwać podfoldery. Ułatwia to testowanie (jak wspomniał Diego), w którym można mieć poprzednie wersje / przedpremierowe zlokalizowane w tej samej domenie co prod. Przyszłe zmiany, w których skonfigurowano korporacyjne serwery proxy do obsługi logowania jednokrotnego, przeniesienia wszystkich rozwiązań do jednej domeny itp. Szczególnie w przypadku protokołu SSL można uniknąć nakładania się wielu nazw domen. Dla mnie te rozważania są znacznie ważniejsze niż „łatwiejsze przenoszenie pliku .css”.
Tedd Hansen
takie zdjęcia i tak trafiają na cdn, więc to jest idealne
Muhammad Umer
30

Aby utworzyć modułowe arkusze stylów, które nie są zależne od bezwzględnej lokalizacji zasobu, autorzy mogą użyć względnych identyfikatorów URI. Względne identyfikatory URI (zgodnie z definicją w [RFC3986] ) są rozwiązywane do pełnych identyfikatorów URI przy użyciu podstawowego identyfikatora URI. RFC 3986, sekcja 5, określa algorytm normatywny dla tego procesu. W przypadku arkuszy stylów CSS podstawowym identyfikatorem URI jest arkusz stylów, a nie dokumentu źródłowego.

Załóżmy na przykład następującą zasadę:

body { background: url("yellow") }

znajduje się w arkuszu stylów wyznaczonym przez URI:

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

Tło BODY dokumentu źródłowego zostanie sąsiadująco z dowolnym obrazem opisanym przez zasób wskazany przez URI

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

Programy klienckie mogą różnić się sposobem obsługi niepoprawnych identyfikatorów URI lub identyfikatorów URI oznaczających niedostępne lub niemożliwe do zastosowania zasoby.

Na podstawie specyfikacji CSS 2.1 .

jrista
źródło
5

Jednym z problemów, który może wystąpić i pozornie zepsuć, jest użycie automatycznej minimalizacji css. Ścieżka żądania dla zminimalizowanego pakietu może mieć inną ścieżkę niż oryginalny css. Może się to zdarzyć automatycznie, więc może powodować zamieszanie.

Ścieżka zmapowanego żądania dla zminimalizowanego pakietu powinna mieć postać „/ originalcssfolder / minifiedbundlename”, a nie tylko „minifiedbundlename”.

Innymi słowy, nazwij swoje pakiety, aby miały tę samą ścieżkę (z /) co oryginalna struktura folderów, w ten sposób wszelkie zasoby zewnętrzne, takie jak czcionki, obrazy będą mapowane do poprawnych identyfikatorów URI przez przeglądarkę. Alternatywą jest użycie bezwzględnego adresu URL (referencje w css, ale zwykle nie jest to pożądane.

mms
źródło
Zaoszczędziło mi to mnóstwo czasu! Dzięki. Należy to udokumentować więcej
mjbates7
0

To zadziałało dla mnie. dodając dwie kropki i ukośnik.

body{
    background: url(../images/yourimage.png);
}
Jakob Sternberg
źródło
-4

Spróbuj użyć:

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

Images będący folderem zawierającym zdjęcie, które chcesz opublikować.

Keshh Chiei
źródło