Todo mundo sabe como configurar um link favicon.ico em HTML:
<link rel="shortcut icon" href="http://hi.org/icon.ico" type="image/x-icon">
Mas acho que é bobagem que, para um pequeno ícone de vários bytes, você precise de mais uma solicitação HTTP . Então, eu me perguntava, como eu poderia fazer essa imagem parte de um sprite (por exemplo background-position=0px -200px;
) para acelerar e salvar essa solicitação HTTP valiosa. Como posso inserir isso em uma imagem sprite existente com meu logotipo e outras obras de arte?
O robô apontando para o favicon.ico
item número 31 no gráfico em cascata é o meu ZAM de estimação. Ele geralmente é mais feliz e faz questão de me informar que é hora de algumas atualizações criativas na Web, embora ele e eu não concordemos com a roupa dele, o que acho um pouco tolo hoje ...
data:
valores para imagens e scripts em linha.Respostas:
Uma pequena melhoria na resposta do @ yc é injetar o favicon codificado em base64 de um arquivo JavaScript que normalmente seria usado e armazenado em cache de qualquer maneira, além de suprimir o comportamento padrão do navegador de solicitar
favicon.ico
, alimentando um URI de dados nameta
tag relevante .Essa técnica evita a solicitação http extra e está confirmada para funcionar nas versões recentes do Chrome, Firefox e Opera no Windows 7. No entanto, ela parece não funcionar no Internet Explorer 9, pelo menos.
index.html
script.js
Demonstração: turi.co/up/favicon.html
fonte
HTTP Headers Response
meu arquivo .ico são quase do mesmo tamanho do meu ícone !! Como você gosta disso?Eu acho que, na maior parte do tempo, não resulta em outra solicitação HTTP, pois geralmente são despejadas no cache do navegador após o primeiro acesso.
Isso é realmente mais eficiente do que qualquer uma das "soluções" propostas.
fonte
Você pode tentar um URI de dados. Nenhuma solicitação HTTP!
A menos que suas páginas tenham cache estático, seu favicon não poderá ser armazenado em cache e, dependendo do tamanho da sua imagem favicon, seu código-fonte poderá ficar inchado como resultado.
Os ícones de URI de dados parecem funcionar na maioria dos navegadores modernos; Eu o tenho trabalhando em versões recentes do Chrome, Firefox e Safari em um Mac. Parece não funcionar no Internet Explorer e, possivelmente, em algumas versões do Opera.
Se você está preocupado com o Old IE (e provavelmente não deveria estar hoje em dia), inclua um comentário condicional do IE que carregaria o favicon.ico real da maneira tradicional, pois parece que o Internet Explorer antigo não Favicons de URI de dados de suporte
Você também pode usar o favicon de outro site popular que provavelmente terá o favicon em cache, como
http://google.com/favicon.ico
, para que seja exibido no cache.Como os comentaristas apontaram, apenas porque você pode fazer isso não significa que deveria, pois alguns navegadores solicitarão o favicon.ico, independentemente dos truques que elaboramos. A quantidade de sobrecarga que você economizaria com isso seria minúscula em comparação com a economia que você obteria ao fazer gzip, usar cabeçalhos expirados no futuro para conteúdo estático, reduzir arquivos JavaScript, colocar imagens de fundo em sprites ou URIs de dados , exibindo arquivos estáticos de uma CDN etc.
fonte
<link rel>
elemento no navegador através do JavaScript, isso deve ser possível. Eu tenho visto até mesmo um jogo programado dessa forma ... no entanto, parece não funcionar no IE, quer, e ele provavelmente não vai impedir que o padrão/favicon.ico
solicitação de pesquisa/favicon.ico
em uma tentativa cega de localizá-lo. Portanto, se você deixar de fora o favicon<link>
(para depois adicioná-lo via Javascript), provavelmente estará piorando as coisas.Você pode usar o favicon codificado em base64, como:
fonte
Encontrei uma solução interessante nesta página . É alemão, mas você poderá entender o código.
Você coloca os dados base64 do ícone em uma folha de estilo externa, para que sejam armazenados em cache. Na cabeça do seu site, você precisa definir o favicon com um ID e o favicon é definido como
background-image
na folha de estilo para esse ID.e o html
fonte
Bom argumento e boa ideia, mas impossível. Um favicon precisa ser um recurso único e separado. Não há como combiná-lo com outro arquivo de imagem.
fonte
/favicon.ico
é onde os navegadores procurarão automaticamente. Agora vem a notícia realmente ruim: se o favicon NÃO existir, significa uma penalidade de erro 404 que também causará um pequeno atraso !! Parece que não há como escapar dessa masmorra favicon. Eles são tão pequena, mas oh tão poderoso ... caramba :)Isso realmente importa?
Muitos navegadores carregam o favicon como uma prioridade baixa, para que ele não bloqueie o carregamento da página, então sim, é uma solicitação extra, mas não está em nenhum caminho crítico.
A solução aceita é horrível, pois até que o JS seja recuperado e executado, todos os elementos DOM abaixo serão impedidos de renderizar e não reduz o número de solicitações!
fonte
A solução adequada é usar o pipelining HTTP .
É necessário que os servidores o suportem, mas não necessariamente participem.
Muitos clientes de navegador não fazem isso, quando deveriam.
Eu recomendo que você tente ativar o pipelining no Firefox e tente lá, ou apenas use o Opera (tremor).
fonte
Não é realmente uma resposta para a pergunta, mas simplesmente para complementar as respostas dadas por Marcel e yahelc . Ofereço uma solução elegante para a questão do favicon 404.
Como alguns aplicativos e navegadores e outros enfeites procuram um favicon.com e se o ícone não for encontrado na raiz do site, você pode simplesmente responder à solicitação com o cabeçalho da resposta 204 .
Exemplos do Apache:
Apache opção um (e o meu favorito), um liner simples no seu .htacces ou .conf:
Apache opção dois:
Para uma leitura mais aprofundada, há uma boa postagem de blog de Stoyan Stefanov em http://www.phpied.com/204-no-content/
fonte
É uma ótima idéia, mas se o Google não tiver feito isso em sua página inicial, aposto que não pode (atualmente) ser feito
fonte
Sinto muito, mas você não pode combinar o favicon com outro recurso.
Isso significa que você tem basicamente duas opções:
Se você se sentir confortável com o fato de seu site não possuir um favicon - basta
href
apontar para um recurso que não é ícone que já está sendo carregado (por exemplo, uma folha de estilo, arquivo de script ou mesmo algum recurso que se beneficia de ser pré-buscado .)(Meus breves testes indicam que isso funciona na maioria dos navegadores principais, se não em todos.)
Aceite a solicitação HTTP extra e verifique se o arquivo favicon possui cabeçalhos agressivos de controle de cache HTTP definidos.
(Se você tem outros sites sob seu controle, pode até solicitá-los a pré-carregar furtivamente o favicon desse site - junto com outros recursos estáticos.)
PS Soluções criativas que não funcionarão :
<link>
elemento favicon (como sugerido pelo usuário @yc) provavelmente piorará as coisas - resultando em duas solicitações HTTP.fonte
Você pode usar PNG de 8 bits em vez do formato ICO para obter uma pegada de dados ainda menor. A única coisa que você precisa alterar é usar o cabeçalho do tipo MIME "data: image / png" em vez de "data: image / x-icon":
O atributo "type" pode ser "image / png" ou "image / x-icon", ambos funcionam para mim.
Você pode converter ICO para png de 8 bits usando o gimp ou converter:
e codifique o binário PNG na cadeia base64 usando o comando base64:
fonte
Aqui está a maneira mais fácil:
Que ícone representa? Responda e vote abaixo!
fonte
Solução Killer em 2020
Essa solução vem necessariamente nove anos depois que a pergunta foi feita originalmente, porque até bem recentemente, a maioria dos navegadores não era capaz de lidar com favicons no
.svg
formato.Esse não é mais o caso.
Consulte: https://caniuse.com/#feat=link-icon-svg
1) Escolha SVG como o formato Favicon
No momento, em junho de 2020, esses navegadores podem lidar com SVG Favicons :
Observe que esses navegadores ainda não podem:
Com o exposto acima, podemos usar com confiança um SVG Favicon .
2) Apresentar o SVG como um URI de dados
O principal objetivo aqui é evitar solicitações HTTP.
Como outras soluções mencionaram, uma maneira bastante inteligente de fazer isso é usar um URI de dados em vez de um URL HTTP .
Os SVGs (especialmente pequenos SVGs) se prestam perfeitamente aos URIs de dados, porque o último é simplesmente texto sem formatação (com qualquer caractere potencialmente ambíguo codificado em porcentagem) e o primeiro, sendo XML, pode ser gravado como uma longa linha de texto sem formatação (com uma smattering de códigos de porcentagem) incrivelmente simples.
3) Todo o SVG é um Emoji
Em dezembro de 2019, Leandro Linares foi um dos primeiros a perceber que, desde que o Chrome havia ingressado no Firefox no suporte ao SVG Favicons, valeu a pena experimentar para ver se um favicon poderia ser criado a partir de um emoji:
https://lean8086.com/articles/using-an-emoji-as-favicon-with-svg/
O palpite de Linares estava certo.
Vários meses depois (março de 2020), o código pirata Lea Verou percebeu a mesma coisa:
https://twitter.com/leaverou/status/1241619866475474946
E os favicons nunca mais foram os mesmos.
4) Implementando a solução você mesmo:
Aqui está um simples SVG:
E aqui está o mesmo SVG que um URI de dados :
E, finalmente, aqui está o URI de dados como um Favicon:
5) Mais truques
Como o Favicon é um SVG, qualquer número de efeitos de filtro (SVG e CSS) pode ser aplicado a ele.
Por exemplo, ao lado do Favicon White Unicorn acima, podemos criar facilmente um Favicon Black Unicorn aplicando o filtro:
Favicon unicórnio preto:
fonte