在CSS文件中使用相对URL,它相对于哪个位置?


484

在CSS文件中定义诸如背景图片URL之类的内容时,使用相对URL时,它相对于哪里?例如:

假设文件/stylesheets/base-styles.css包含:

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

如果我包括通过这个样式表到不同的文件<link ... />会在CSS文件中的相对URL是相对于样式表文件/stylesheets/相对于当前文档包括它是什么?可能的路径如下:

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

Answers:


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。IMO非常破损。
chharvey '17

更正:上面的默认值错误已在Chrome v60中修复。
chharvey

如果您的CSS位于捆绑包中,则路径实际上无关紧要。它不是您想的那样,没有相对的东西了。
Tod

1
使用属性时出现问题:background: var(--primary-color-background) no-repeat center center url("maps.jpg");在IOS和Safari中不起作用。/resources/maps.jpg在Safari中,只有绝对路径与css属性结合使用。
安迪


50

它是相对于样式表的,但是我建议将URL相对于您的URL:

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

这样,您就可以移动文件而无需将来重构它们。


前面的额外“ /”有什么区别?
Casebash

15
就像命令行上的路径名一样,路径的前导/表示它指向当前Web服务器上的绝对资源。
David W. Keith

4
实际上,在某些情况下,最好使用相对于CSS文件的URI。就我而言,我有一个目录“ / css /”,其中放置了所有CSS数据。现在,我想在一个单独的文件夹中测试网站上的新功能。很难测试,例如,测试文件夹中有新的背景图像。这完全取决于您的需求...
2014年

12
绝对路径使得很难将解决方案放在域的子文件夹中。您想要支持子文件夹的原因有很多。它使测试变得更加容易(如Diego所述),在此您可以将以前的版本/预发行版本与prod放在同一域中。未来的变化是设置公司代理服务器以支持SSO,将所有解决方案移至一个域等。尤其是使用SSL时,人们可能希望避免维护多个域名的开销。对我来说,这些考虑比“更容易移动我的.css文件”更为重要。
Tedd Hansen 2014年

图像和类似的东西无论如何都会进入CDN,所以这很完美
Muhammad Umer

30

为了创建不依赖于资源绝对位置的模块化样式表,作者可以使用相对URI。相对URI(在[RFC3986]中定义)使用基本URI解析为完整URI。RFC 3986第5节定义了此过程的规范算法。对于CSS样式表,基本URI是样式表的基础URI,而不是源文档的基础URI。

例如,假设以下规则:

body { background: url("yellow") }

位于URI指定的样式表中:

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

源文档的正文的背景将与URI指定的资源描述的任何图像平铺

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

用户代理在处理无效URI或指定不可用或不可用资源的URI方面可能会有所不同。

取自CSS 2.1规范



5

使用css的自动最小化时,可能会发生的一个问题,并且似乎打破了这一问题。缩小捆绑包的请求路径可以具有与原始CSS不同的路径。这可能会自动发生,因此可能引起混乱。

缩小包的映射请求路径应为“ / originalcssfolder / minifiedbundlename”,而不仅仅是“ minifiedbundlename”。

换句话说,将包命名为与原始文件夹结构具有相同的路径(带有/),这样,任何外部资源(如字体,图像)都将被浏览器映射为正确的URI。另一种方法是在CSS中使用绝对url(refs,但这通常是不希望的。


这节省了我很多时间!谢谢。应该记录更多
mjbates7'7


-4

尝试使用:

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

Images 是保存要发布图片的文件夹。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.