Usando la URL relativa en el archivo CSS, ¿con qué ubicación es relativa?

484

Cuando se define algo como una URL de imagen de fondo en un archivo CSS, cuando se usa una URL relativa, ¿a dónde se relaciona? Por ejemplo:

Supongamos que el archivo /stylesheets/base-styles.csscontiene:

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

Si incluyo esta hoja de estilo en diferentes documentos vía <link ... />será la dirección URL relativa en el archivo CSS estar en relación con el documento de hoja de estilo en /stylesheets/o en relación con el documento actual que está incluido a? Posibles caminos como:

/item/details.html
/about/index.html
/about/extra/other.html
/index.html
cobarde anónimo
fuente

Respuestas:

551

De acuerdo con W3 :

Las URL parciales se interpretan en relación con el origen de la hoja de estilo, no en relación con el documento

Por lo tanto, en respuesta a su pregunta, será relativa a /stylesheets/.

Si piensa en esto, tiene sentido, ya que el archivo CSS podría agregarse a páginas en diferentes directorios, por lo que estandarizarlo al archivo CSS significa que las URL funcionarán dondequiera que estén vinculadas las hojas de estilo.

Alex Rozanski
fuente
parece que hay una excepción a la regla: -ms-behavioren IE :(
pkyeck
2
hay otra excepción: cuando la url es el valor predeterminado de una propiedad personalizada. Digamos que define .banner { background-image: var(--bgimg, url('images/default.jpg')); }, pero todavía no define un valor --bgimg. A continuación, en la página /index.html, un .bannerbuscarán /images/default.jpg, pero en otra página /about/index.htmlde un .bannermirarán /about/images/default.jpg. Muy roto IMO.
chharvey
corrección: el error de valor predeterminado anterior se corrige en Chrome v60.
chharvey
Si su CSS está en un paquete, la ruta realmente no importa. No es donde crees que va a ser, ya nada es relativo.
Tod
1
Tuve problemas al usar las propiedades: background: var(--primary-color-background) no-repeat center center url("maps.jpg");esto no funcionó en IOS y Safari. Solo la ruta absoluta /resources/maps.jpgfunciona en Safari junto con una propiedad css.
Andy
69

Es relativo al archivo CSS.

M4N
fuente
50

Es relativo a la hoja de estilo, pero recomendaría hacer las URL relativas a su URL:

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

De esa manera, puede mover sus archivos sin necesidad de refactorizarlos en el futuro.

Codebeef
fuente
¿Qué diferencia hace el "/" extra en el frente?
Casebash
15
Al igual que los nombres de ruta en la línea de comando, el inicio / en el frente de la ruta significa que apunta a un recurso absoluto en el servidor web actual.
David W. Keith
44
En realidad, hay un caso en el que es mejor usar URI en relación con el archivo CSS. En mi caso, tengo un directorio "/ css /" donde pongo todos los datos CSS. Ahora, quiero probar nuevas funciones en el sitio web en una carpeta separada. Es difícil probar, por ejemplo, nuevas imágenes de fondo en la carpeta de prueba. Todo depende de tus necesidades ...
Diego
12
Las rutas absolutas dificultan la solución en una subcarpeta del dominio. Existen varias razones por las que desea admitir subcarpetas. Hace que sea más fácil hacer pruebas (como mencionó Diego) donde puede tener versiones / pre-lanzamientos anteriores ubicadas en el mismo dominio que prod. Cambios futuros en los que los servidores proxy corporativos se configuran para admitir SSO, moviendo todas las soluciones a un dominio, etc. Especialmente con SSL, es posible que desee evitar la sobrecarga de múltiples nombres de dominio para mantener. Para mí, estas consideraciones son mucho más importantes que "más fácil mover mi archivo .css".
Tedd Hansen
imágenes y cosas así van a cdn de todos modos, así que esto es perfecto
Muhammad Umer
30

Para crear hojas de estilo modulares que no dependen de la ubicación absoluta de un recurso, los autores pueden usar URI relativos. Los URI relativos (como se define en [RFC3986] ) se resuelven en URI completos utilizando un URI base. RFC 3986, sección 5, define el algoritmo normativo para este proceso. Para las hojas de estilo CSS, el URI base es el de la hoja de estilo, no el del documento fuente.

Por ejemplo, suponga la siguiente regla:

body { background: url("yellow") }

se encuentra en una hoja de estilo designada por el URI:

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

El fondo del CUERPO del documento fuente se colocará en mosaico con cualquier imagen descrita por el recurso designado por el URI

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

Los agentes de usuario pueden variar en la forma en que manejan URI no válidos o URI que designan recursos no disponibles o no aplicables.

Tomado de la especificación CSS 2.1 .

jrista
fuente
5

Un problema que puede ocurrir, y aparentemente romper esto, es cuando se usa la minimización automática de css. La ruta de solicitud para el paquete minificado puede tener una ruta diferente a la del CSS original. Esto puede suceder automáticamente, por lo que puede causar confusión.

La ruta de solicitud asignada para el paquete minificado debe ser "/ originalcssfolder / minifiedbundlename" y no solo "minifiedbundlename".

En otras palabras, asigne un nombre a sus paquetes para que tengan la misma ruta (con el /) que la estructura de carpetas original, de esta forma cualquier recurso externo como fuentes, imágenes se asignarán a los URI correctos por el navegador. La alternativa es utilizar la URL absoluta (referencias en su CSS, pero eso no suele ser deseable.

mms
fuente
¡Esto me ahorró un montón de tiempo! Gracias. Debería documentarse más
mjbates7
0

Esto funcionó para mí. agregando dos puntos y barra.

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

Intenta usar:

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

Images siendo la carpeta que contiene la imagen que desea publicar.

Keshh Chiei
fuente