Todo el mundo sabe cómo configurar un enlace favicon.ico en HTML:
<link rel="shortcut icon" href="http://hi.org/icon.ico" type="image/x-icon">
Pero creo que es una tontería que para un pequeño icono de varios bytes necesites otra solicitud HTTP . Entonces me pregunté, ¿cómo podría hacer que esa imagen sea parte de un sprite (por ejemplo background-position=0px -200px;
) para acelerar y guardar esa valiosa solicitud HTTP. ¿Cómo puedo obtener esto en una imagen de sprite existente con mi logotipo y otras obras de arte?
El robot que señala favicon.ico
, elemento número 31 en el gráfico de cascada, es mi mascota ZAM. Por lo general, es más feliz y tiene un buen punto haciéndome saber que es hora de algunas actualizaciones creativas en la web, aunque él y yo no estamos de acuerdo con su atuendo, que creo que es un poco tonto hoy ...
data:
valores para imágenes y scripts en línea.Respuestas:
Una mejora menor a la respuesta de @ yc es inyectar el favicon codificado en base64 desde un archivo JavaScript que normalmente se usaría y se almacenaría en caché de todos modos, y también se suprime el comportamiento estándar del navegador al solicitar
favicon.ico
al alimentarlo con un URI de datos en elmeta
etiqueta .Esta técnica evita la solicitud http adicional y se confirma que funciona en versiones recientes de Chrome, Firefox y Opera en Windows 7. Sin embargo , no parece funcionar en Internet Explorer 9 al menos.
index.html
script.js
Demostración: turi.co/up/favicon.html
fuente
HTTP Headers Response
mi archivo .ico son casi del mismo tamaño que mi icono! ¿Qué le parece eso?Creo que, en su mayor parte, no da como resultado otra solicitud HTTP, ya que generalmente se descargan en la memoria caché del navegador después del primer acceso.
Esto es en realidad más eficiente que cualquiera de las "soluciones" propuestas.
fuente
Puedes probar un URI de datos. No hay solicitud HTTP!
A menos que sus páginas tengan almacenamiento en caché estático, su favicon no podrá almacenarse en caché, y dependiendo del tamaño de su imagen de favicon, su código fuente podría hincharse como resultado.
Los favicons de URI de datos parecen funcionar en la mayoría de los navegadores modernos; Lo tengo funcionando en versiones recientes de Chrome, Firefox y Safari en una Mac. No parece funcionar en Internet Explorer, y posiblemente en algunas versiones de Opera.
Si está preocupado por el IE antiguo (y probablemente no debería estarlo en estos días), podría incluir un comentario condicional de IE que cargaría el favicon.ico real de la manera tradicional, ya que parece que Internet Explorer anterior no Soporte de datos URI Favicons
También podría usar el favicon de otro sitio popular que probablemente tenga su favicon en caché, por ejemplo
http://google.com/favicon.ico
, para que se sirva desde el caché.Como han señalado los comentaristas, el hecho de que pueda hacer esto no significa que deba hacerlo, ya que algunos navegadores solicitarán favicon.ico independientemente de los trucos que ideemos. La cantidad de sobrecarga que ahorraría al hacer esto sería minúscula en comparación con los ahorros que obtendría al hacer cosas como gzip, usar encabezados de vencimiento en el futuro lejano para contenido estático, minimizar archivos JavaScript, poner imágenes de fondo en sprites o URI de datos , sirviendo archivos estáticos de un CDN, etc.
fuente
<link rel>
elemento en el navegador a través de JavaScript, eso debería ser posible. Incluso he visto un juego programado de esa manera ... sin embargo, tampoco parece funcionar en IE, y probablemente no evitará la/favicon.ico
solicitud de búsqueda predeterminada/favicon.ico
en un intento ciego de localizarla. Entonces, si deja de lado el favicon<link>
(para luego agregarlo a través de Javascript), es probable que empeore las cosas.Puede usar favicon codificado en base64, como:
fuente
Encontré una solución interesante en esta página . Es alemán pero podrás entender el código.
Pones los datos de base64 del icono en una hoja de estilo externa, por lo que se almacenará en caché. En la cabecera de su sitio web, debe definir el favicon con una identificación y el favicon se configura como
background-image
en la hoja de estilo para esa identificación.y el html
fuente
Buen punto y buena idea, pero imposible. Un favicon debe ser un recurso único e independiente. No hay forma de combinarlo con otro archivo de imagen.
fuente
/favicon.ico
es donde los navegadores buscarán automáticamente. Ahora vienen las malas noticias: ¡si el favicon NO existe, significa una penalización de error 404 que también causará un ligero retraso! Parece que no hay escapatoria de esta mazmorra favicon. Son tan pequeños pero tan poderosos ... maldita sea :)¿Realmente importa?
Muchos navegadores cargan el favicon como una prioridad baja para que no bloquee la carga de la página de todos modos, así que sí, es una solicitud adicional pero no está en ninguna ruta crítica.
La solución aceptada es horrible, ya que hasta que el JS se haya recuperado y ejecutado, todos los elementos DOM a continuación se bloquearán de la representación y no reducirá el número de solicitudes.
fuente
La solución adecuada es utilizar la canalización HTTP .
Se requiere que los servidores lo admitan, pero no necesariamente participen.
Muchos clientes de navegador no lo hacen, cuando deberían.
Le recomendaría que intente habilitar la canalización en Firefox y que lo intente allí, o simplemente use Opera (shudder).
fuente
No es realmente una respuesta a la pregunta, sino simplemente para complementar las respuestas dadas por Marcel y Yahelc . Ofrezco una solución elegante al problema del favicon 404.
Debido a que algunas aplicaciones y navegadores y demás no verifican un favicon.com y si el icono no se encuentra en la raíz del sitio, simplemente puede responder a la solicitud con el encabezado de respuesta 204 .
Ejemplos de Apache:
Opción de Apache uno (y mi favorito), un forro simple en sus .htacces o .conf:
Opción de Apache dos:
Para leer más, hay una buena publicación de blog de Stoyan Stefanov en http://www.phpied.com/204-no-content/
fuente
Lo siento, pero no puedes combinar el favicon con otro recurso.
Esto significa que tiene básicamente dos opciones:
Si se siente cómodo con que su sitio no tenga un favicon, puede tener el
href
punto de un recurso que no sea un ícono que ya se está cargando (por ejemplo, una hoja de estilo, un archivo de secuencia de comandos o incluso algún recurso que se beneficie de la obtención previa) .)(Mi breve prueba indica que esto funciona en la mayoría de los principales navegadores, si no en todos).
Acepte la solicitud HTTP adicional y solo asegúrese de que su archivo favicon tenga configurados encabezados agresivos de control de caché HTTP.
(Si tiene otros sitios web bajo su control, incluso puede hacer que precarguen furtivamente el favicon para este sitio web, junto con otros recursos estáticos).
PS Soluciones creativas que no funcionarán :
<link>
elemento favicon (como lo sugirió el usuario @yc) probablemente empeorará las cosas, al generar dos solicitudes HTTP.fuente
Es una gran idea, pero si Google no lo ha hecho en su página de inicio, apuesto a que no se puede hacer (actualmente).
fuente
Puede usar PNG de 8 bits en lugar del formato ICO para una huella de datos aún más pequeña. Lo único que debe cambiar es usar el encabezado de tipo MIME "data: image / png" en lugar de "data: image / x-icon":
El atributo "type" puede ser "image / png" o "image / x-icon", ambos funcionan para mí.
Puede convertir ICO a png de 8 bits usando gimp o convertir:
y codificar PNG binario a cadena base64 usando el comando base64:
fuente
Aquí está la forma más fácil:
¿Qué icono representa? ¡Responde y vota a continuación!
fuente
Solución asesina en 2020
Esta solución necesariamente llega nueve años después de la pregunta original, porque hasta hace relativamente poco tiempo, la mayoría de los navegadores no podían manejar los favicons en
.svg
formato.Ese ya no es el caso.
Ver: https://caniuse.com/#feat=link-icon-svg
1) Elija SVG como formato Favicon
En este momento, en junio de 2020, estos navegadores pueden manejar Favicons SVG :
Tenga en cuenta que estos navegadores aún no pueden:
Con lo anterior en mente, podemos usar con confianza un Favicon SVG .
2) Presente el SVG como un URI de datos
El objetivo principal aquí es evitar las solicitudes HTTP.
Como han mencionado otras soluciones, una forma bastante inteligente de hacer esto es usar un URI de datos en lugar de una URL HTTP .
Los SVG (especialmente los SVG pequeños) se prestan perfectamente a los URI de datos, porque este último es simplemente texto sin formato (con cualquier carácter potencialmente ambiguo codificado en porcentaje) y el primero, que es XML, se puede escribir como una larga línea de texto sin formato (con un poco de códigos porcentuales) increíblemente sencillo.
3) Todo SVG es un Emoji
En diciembre de 2019, Leandro Linares fue uno de los primeros en darse cuenta de que, dado que Chrome se había unido a Firefox para apoyar los SVG Favicons, valió la pena experimentar para ver si un favicon podría crearse a partir de un emoji:
https://lean8086.com/articles/using-an-emoji-as-favicon-with-svg/
La corazonada de Linares era correcta.
Varios meses después (marzo de 2020), Code Pirate Lea Verou se dio cuenta de lo mismo:
https://twitter.com/leaverou/status/1241619866475474946
Y los favicons nunca volvieron a ser lo mismo.
4) Implementando la solución usted mismo:
Aquí hay un SVG simple:
Y aquí está el mismo SVG que un URI de datos :
Y, finalmente, aquí está ese URI de datos como un Favicon:
5) Más trucos
Como el Favicon es un SVG, se le puede aplicar cualquier cantidad de efectos de filtro (tanto SVG como CSS).
Por ejemplo, junto con el Favicon de unicornio blanco anterior, podemos hacer fácilmente un Favicon de unicornio negro aplicando el filtro:
Favicon de unicornio negro:
fuente