Используя относительный URL в файле CSS, к какому расположению он относится?

484

Когда вы определяете что-то вроде URL-адреса фонового изображения в файле CSS, когда используете относительный URL-адрес, где он находится относительно? Например:

Предположим, что файл /stylesheets/base-styles.cssсодержит:

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

Если я включу эту таблицу стилей в разные документы, <link ... />будет ли относительный URL-адрес в файле CSS относительно документа таблицы стилей в текущем документе/stylesheets/ или относительно него? Возможные пути, такие как:

/item/details.html
/about/index.html
/about/extra/other.html
/index.html
анонимный трус
источник

Ответы:

551

Согласно W3 :

Частичные URL-адреса интерпретируются относительно источника таблицы стилей, а не относительно документа

Поэтому, в ответ на ваш вопрос, это будет относительно /stylesheets/.

Если подумать об этом, это имеет смысл, поскольку файл CSS можно добавлять на страницы в разных каталогах, поэтому его стандартизация в файле CSS означает, что URL-адреса будут работать везде, где связаны таблицы стилей.

Алекс Розанский
источник
похоже, что есть исключение из правила: -ms-behaviorв IE :(
pkyeck
2
есть еще одно исключение: когда URL-адрес является значением по умолчанию для пользовательского свойства. Допустим, вы определили .banner { background-image: var(--bgimg, url('images/default.jpg')); }, но пока не определяете значение --bgimg. Затем на странице /index.html, .bannerбудет искать /images/default.jpg, но на другой странице будет выглядеть . очень сломанный ИМО. /about/index.html.banner/about/images/default.jpg
chharvey
Исправление: ошибка значения по умолчанию выше исправлена ​​в Chrome v60.
Чарви
если ваш css находится в связке, путь действительно не имеет значения. Это не то, где вы думаете, что это будет, ничто больше не является относительным.
Tod
1
У меня были проблемы при использовании свойств: background: var(--primary-color-background) no-repeat center center url("maps.jpg");это не работало в IOS и Safari. В /resources/maps.jpgSafari работает только абсолютный путь вместе со свойством css.
Энди
50

Это относительно таблицы стилей, но я бы рекомендовал сделать URL-адреса относительно вашего URL:

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

Таким образом, вы можете перемещать файлы без необходимости их рефакторинга в будущем.

Codebeef
источник
Какое значение имеет дополнительный «/» на передней панели?
Casebash
15
Точно так же, как пути в командной строке, ведение / впереди пути означает, что он указывает на абсолютный ресурс на текущем веб-сервере.
Дэвид В. Кит
4
На самом деле есть случай, когда лучше использовать URI относительно файла CSS. В моем случае у меня есть каталог "/ css /", куда я помещаю все данные CSS. Теперь я хочу протестировать новые функции на сайте в отдельной папке. Трудно проверить, например, новые фоновые изображения в тестовой папке. Все зависит от ваших потребностей ...
Диего
12
Абсолютные пути затрудняют размещение решения в подпапке домена. Существует ряд причин, по которым вы хотите поддерживать подпапки. Это облегчает проведение тестирования (как упоминал Диего), когда вы можете иметь предыдущие версии / предварительные выпуски, расположенные в том же домене, что и prod. Будущие изменения, когда корпоративные прокси-серверы настроены для поддержки единого входа, переноса всех решений в один домен и т. Д. Особенно с SSL можно избежать издержек на поддержку нескольких доменных имен. Для меня эти соображения гораздо важнее, чем «легче переместить мой .css-файл».
Тедд Хансен
в любом случае изображения и тому подобное идут в cdn, так что это прекрасно
Мухаммед Умер
30

Для создания модульных таблиц стилей, которые не зависят от абсолютного местоположения ресурса, авторы могут использовать относительные URI. Относительные URI (как определено в [RFC3986] ) преобразуются в полные URI с использованием базового URI. RFC 3986, раздел 5, определяет нормативный алгоритм для этого процесса. Для таблиц стилей CSS базовый URI - это таблица стилей, а не исходный документ.

Например, предположим следующее правило:

body { background: url("yellow") }

находится в таблице стилей, обозначенной URI:

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

Фон BODY исходного документа будет облицован любым изображением, описанным ресурсом, обозначенным URI

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

Пользовательские агенты могут различаться в том, как они обрабатывают недопустимые URI или URI, которые обозначают недоступные или неприменимые ресурсы.

Взято из спецификации CSS 2.1 .

jrista
источник
5

Одна проблема, которая может возникнуть и, казалось бы, сломать это, при использовании автоматической минимизации CSS. Путь запроса для минимизированного пакета может иметь путь, отличный от исходного CSS. Это может произойти автоматически, что может привести к путанице.

Путь сопоставленного запроса для минимизированного пакета должен быть "/ originalcssfolder / minifiedbundlename", а не просто "minifiedbundlename".

Другими словами, назовите ваши пакеты так, чтобы они имели тот же путь (с /), что и исходная структура папок. Таким образом, любые внешние ресурсы, такие как шрифты и изображения, будут сопоставляться браузеру с исправлением URI. Альтернативой является использование абсолютного URL (ссылки в вашем CSS, но это обычно не желательно.

ммс
источник
Это сэкономило мне массу времени! Спасибо. Это должно быть документировано больше
mjbates7
0

Это сработало для меня. добавив две точки и косую черту.

body{
    background: url(../images/yourimage.png);
}
Якоб Штернберг
источник
-4

Попробуйте использовать:

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

Images Быть папкой с изображением, которое вы хотите опубликовать.

Keshh Chiei
источник