Usando URL relativo no arquivo CSS, para qual local é relativo?

484

Ao definir algo como um URL de imagem de plano de fundo em um arquivo CSS, ao usar um URL relativo, aonde ele é relativo? Por exemplo:

Suponha que o arquivo /stylesheets/base-styles.csscontenha:

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

Se eu incluir esse estilo em documentos diferentes através <link ... />vai a URL relativa no arquivo CSS ser em relação ao documento de estilo em /stylesheets/ou em relação ao documento atual é incluído para? Caminhos possíveis, como:

/item/details.html
/about/index.html
/about/extra/other.html
/index.html
covarde anônimo
fonte

Respostas:

551

De acordo com o W3 :

URLs parciais são interpretados em relação à origem da folha de estilos, não em relação ao documento

Portanto, em resposta à sua pergunta, será relativa a /stylesheets/.

Se você pensar sobre isso, isso faz sentido, já que o arquivo CSS pode ser adicionado a páginas em diretórios diferentes; portanto, padronizá-lo no arquivo CSS significa que os URLs funcionarão onde quer que as folhas de estilo estejam vinculadas.

Alex Rozanski
fonte
parece que há uma exceção à regra: -ms-behaviorno IE :(
pkyeck
2
existe outra exceção: quando o URL é o valor padrão de uma propriedade customizada. Digamos que você defina .banner { background-image: var(--bgimg, url('images/default.jpg')); }, mas ainda não defina um valor --bgimg. Em seguida, na página /index.html, um .bannerprocurará /images/default.jpg, mas em outra página, /about/index.htmlum .bannerprocurará /about/images/default.jpg. IMO muito quebrado.
chharvey
correção: o bug do valor padrão acima é corrigido no Chrome v60.
chharvey
se o seu css estiver em um pacote, o caminho realmente não importa. Não é onde você acha que vai ser, nada é relativo.
21418 Tod
1
Tive problemas ao usar propriedades: background: var(--primary-color-background) no-repeat center center url("maps.jpg");isso não funcionou no IOS e no Safari. Somente o caminho absoluto /resources/maps.jpgfunciona no Safari em conjunto com uma propriedade css.
andy
69

É relativo ao arquivo CSS.

M4N
fonte
50

É relativo à folha de estilo, mas eu recomendo que os URLs sejam relativos ao seu URL:

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

Dessa forma, você pode mover seus arquivos sem precisar refatorá-los no futuro.

Codebeef
fonte
Que diferença faz o "/" extra na frente?
Casebash 12/05
15
Assim como os nomes de caminho na linha de comando, a frente / frente do caminho significa que aponta para um recurso absoluto no servidor da Web atual.
David W. Keith
4
Na verdade, existe um caso em que é melhor usar URIs em relação ao arquivo CSS. No meu caso, tenho um diretório "/ css /" onde coloco todos os dados CSS. Agora, quero testar novos recursos no site em uma pasta separada. É difícil testar, por exemplo, novas imagens de plano de fundo na pasta de teste. Tudo depende de suas necessidades ... #
2120 Diego Diego
12
Caminhos absolutos dificultam a solução em uma subpasta do domínio. Há várias razões pelas quais você deseja dar suporte às subpastas. Torna mais fácil fazer testes (como Diego mencionou), onde você pode ter versões / pré-lançamentos anteriores localizados no mesmo domínio que o prod. Mudanças futuras em que os servidores proxy corporativos estão configurados para oferecer suporte ao SSO, movendo todas as soluções para um domínio, etc. Especialmente com SSL, é possível evitar a sobrecarga de vários nomes de domínio. Para mim, essas considerações são muito mais importantes do que "mais fácil mover meu arquivo .css".
Tedd Hansen 22/09
imagens e coisas do tipo que vai para cdn de qualquer maneira assim que este é perfeito
Muhammad Umer
30

Para criar folhas de estilo modulares que não dependem da localização absoluta de um recurso, os autores podem usar URIs relativos. URIs relativos (conforme definido em [RFC3986] ) são resolvidos para URIs completos usando um URI base. A RFC 3986, seção 5, define o algoritmo normativo para esse processo. Para folhas de estilo CSS, o URI base é o da folha de estilos, não o do documento de origem.

Por exemplo, suponha a seguinte regra:

body { background: url("yellow") }

está localizado em uma folha de estilos designada pelo URI:

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

O plano de fundo do BODY do documento de origem será lado a lado com qualquer imagem descrita pelo recurso designado pelo URI

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

Os agentes do usuário podem variar na maneira como lidam com URIs ou URIs inválidos que designam recursos indisponíveis ou não aplicáveis.

Retirado da especificação do CSS 2.1 .

jrista
fonte
5

Um problema que pode ocorrer e aparentemente interrompe isso é ao usar a minimização automática de css. O caminho da solicitação para o pacote configurável minificado pode ter um caminho diferente do css original. Isso pode acontecer automaticamente e causar confusão.

O caminho da solicitação mapeada para o pacote compactado minificado deve ser "/ originalcssfolder / minifiedbundlename" e não apenas "minifiedbundlename".

Em outras palavras, nomeie seus pacotes configuráveis ​​com o mesmo caminho (com o /) da estrutura de pastas original, desta forma, quaisquer recursos externos, como fontes e imagens, serão mapeados para corrigir URIs pelo navegador. A alternativa é usar o URL absoluto (refs no seu css, mas isso geralmente não é desejável).

mms
fonte
Isso me salvou muito tempo! Obrigado. Deve ser documentada mais
mjbates7
0

Isso funcionou para mim. adicionando dois pontos e barra.

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

Tente usar:

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

Images sendo pasta segurando a imagem que você deseja publicar.

Keshh Chiei
fonte