Sam*_*Sam 294 html javascript css favicon performance
大家都知道如何在HTML中设置favicon.ico链接:
<link rel="shortcut icon" href="http://hi.org/icon.ico" type="image/x-icon">
Run Code Online (Sandbox Code Playgroud)
但我认为,对于一个小的几字节图标,您需要另一个HTTP请求,这简直太傻了.所以我想知道,我怎么能让这个图像成为精灵的一部分(例如background-position = 0px -200px;),以便加速并保存那个有价值的HTTP请求:我怎么能解决这个问题并把它带到我的其余部分我的徽标和其他艺术品的现有图像精灵?
指向background-position=0px -200px;瀑布图上项目nr.31 的机器人是我的宠物ZAM,他经常更开心,他有一个好点让我知道它在网上进行一些创意升级的时间,尽管他和我不同意他的装备,我觉得今天有点傻......

Jam*_*son 144
我认为在大多数情况下它不会导致另一个HTTP请求,因为这些请求通常在第一次访问后被转储到浏览器的缓存中.
这实际上比任何提出的"解决方案"更有效.
Mar*_*cel 132
对@ yc的回答的一个小改进是从一个通常会被使用和缓存的JavaScript文件中注入base64编码的favicon,并且还favicon.ico通过在相关meta标记中提供数据URI来抑制请求的标准浏览器行为.
该技术避免了额外的http请求,并确认在Windows 7最新版本的Chrome,Firefox和Opera的工作然而,它并没有出现在Internet Explorer 9中至少工作.
的index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<!-- Suppress browser request for favicon.ico -->
<link rel="shortcut icon"type="image/x-icon" href="data:image/x-icon;,">
<script src="script.js"></script>
...
Run Code Online (Sandbox Code Playgroud)
的script.js
var favIcon = "\
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABrUlEQVR42mNkwAOepOgxMTD9mwhk\
[...truncated for brevity...]
IALgNIBUQBUDAFi2whGNUZ3eAAAAAElFTkSuQmCC";
var docHead = document.getElementsByTagName('head')[0];
var newLink = document.createElement('link');
newLink.rel = 'shortcut icon';
newLink.href = 'data:image/png;base64,'+favIcon;
docHead.appendChild(newLink);
/* Other JS would normally be in here too. */
Run Code Online (Sandbox Code Playgroud)
Yah*_*hel 97
您可以尝试数据URI.没有HTTP请求!
<link id="favicon" rel="shortcut icon" type="image/png" href="data:image/png;base64,....==">
Run Code Online (Sandbox Code Playgroud)
除非您的页面具有静态缓存,否则您的favicon将无法缓存,并且根据您的favicon图像的大小,您的源代码可能会因此而变得臃肿.
数据URI favicons似乎适用于大多数现代浏览器; 我在Mac上使用最新版本的Chrome,Firefox和Safari.似乎不适用于Internet Explorer,可能还有某些版本的Opera.
如果您担心旧IE(并且您可能不应该这些日子),您可以包含IE条件注释,以传统方式加载实际的favicon.ico,因为看起来旧的Internet Explorer不会支持数据URI Favicons
`<!--[if IE ]><link rel="shortcut icon" href="http://example.com/favicon.ico" type="image/x-icon" /><![endif]--> `
Run Code Online (Sandbox Code Playgroud)
您也可以使用另一个受欢迎的网站的favicon,它可能会缓存它们的favicon http://google.com/favicon.ico,以便从缓存中提供.
正如评论者指出的那样,仅仅因为你能做到这一点并不意味着你应该这样做,因为有些浏览器会请求favicon.ico而不管我们设计的技巧.通过执行此操作可节省的开销与使用gzipping,使用远期未来的静态内容过期标头,缩小JavaScript文件,将背景图像放入精灵或数据URI等所节省的成本相比将是微不足道的. ,从CDN等服务静态文件
Rou*_*ica 51
2020年杀手级解决方案
这个解决方案必然是在最初提出这个问题九年后提出的,因为直到最近,大多数浏览器还不能处理.svg格式的图标。
现在已经不是这样了。
请参阅:https : //caniuse.com/#feat=link-icon-svg
现在,在 2020 年 6 月,这些浏览器可以处理SVG Favicon:
请注意,这些浏览器仍然不能:
尽管如此,考虑到上述情况,我们现在可以以合理的信心使用SVG Favicon。
这里的主要目标是避免 HTTP 请求。
正如本页上的其他解决方案所提到的,一个非常聪明的方法是使用Data URL而不是HTTP URL。
SVG(尤其是小型 SVG)非常适合 Data URL,因为后者只是纯文本(带有任何潜在的歧义字符百分比编码),而前者是 XML,可以写成一长行纯文本(带有少量百分比代码)非常简单。
注意这一步是可选的。您的 SVG可以是单个表情符号,但也可以很容易地成为更复杂的 SVG。
2019 年 12 月,Leandro Linares是第一个意识到自从 Chrome 加入 Firefox 支持 SVG Favicon 以来,值得尝试看看是否可以从表情符号中创建一个 favicon:
https://lean8086.com/articles/using-an-emoji-as-favicon-with-svg/
利纳雷斯的预感是对的。
几个月后(2020 年 3 月),Code Pirate Lea Verou意识到了同样的事情:
https://twitter.com/leaverou/status/1241619866475474946
收藏夹图标再也不会一样了。
这是一个简单的 SVG:
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16">
<text x="0" y="14"></text>
</svg>
Run Code Online (Sandbox Code Playgroud)
这是与数据 URL相同的 SVG :
data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%3E%3Ctext%20x='0'%20y='14'%3E%3C/text%3E%3C/svg%3E
Run Code Online (Sandbox Code Playgroud)
最后,这是作为 Favicon 的数据 URL:
<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%3E%3Ctext%20x='0'%20y='14'%3E%3C/text%3E%3C/svg%3E" type="image/svg+xml" />
Run Code Online (Sandbox Code Playgroud)
由于 Favicon 是 SVG,因此可以对其应用任意数量的滤镜效果(SVG 和 CSS)。
例如,除了上面的白色独角兽图标,我们可以通过应用过滤器轻松制作黑色独角兽图标:
style="filter: invert(100%);"
Run Code Online (Sandbox Code Playgroud)
黑色独角兽图标:
<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%3E%3Ctext%20x='0'%20y='14'%20style='filter:%20invert(100%);'%3E%3C/text%3E%3C/svg%3E" type="image/svg+xml" />
Run Code Online (Sandbox Code Playgroud)
Don*_*Cai 20
你可以使用base64编码的favicon,如:
<link href="data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAACbUlEQVRIx7WUsU/qUBTGv96WSlWeEBZijJggxrREdwYixMnByYEyOvgfsBAMG0xuDsZ/QGc3NDFhgTioiYsmkhBYGLSBkLYR0va8gSjvQXiIT7/l5ibfOd/v3pN7gSmVSMTj8ThRfzdYk8lkMpl83/+AVFVVVXU0eHiVJEmSpB8DIcpkMplsdhCYz+fzhQJROBwOh8PDQN+oQCAQCASIRFEURZHI45GkP0/e7Xa73e70AMJnjel0Op1OA6oaDB4eAkAw6PcDvZ5t6zrw/Hx2trAw/cHYZ426ruu6DtzcGEYuBzQa19etFvD4WKtls4AoRqMPDwBjjLGPrt84ilgsFovF6EOapmmaRiP6O/jbAIguL4vFYpHGqlKpVCoVomq1Wq1Wibxer9fn+w+Q9+cUiUQikQhNrfdgWZZlWf4yyGhj27Zt254MUK/X6/X6F0aiKIqiKIOCYRmGYRjGZADLsizLIgqFQqHV1SkAnp5OTn79ItK0qyuPZ7SxaZqmaU4GKJfPzxmbfAPc/f3pqaIQLS8vLtZqgOP0bYyJoiAARC5Xrwf4/Vtbb2+Th1YqlUqlErC01GgkEkCz2WxyHLC+LsuiCAiCJLlcgM+3vd3pcBzXaJTLR0dEs7Ptdv+D4TiOG/A6DsBxQKvV621sAGtru7vl8ngAjuvXv7xcXIgiwNjMjCj2h+k4fQfPA4LA8xwHCO323V2hABiG223bwPy8xwMAbvfcHGMAY32j47y+3t4OAsZpZ2dzEwAsy7IcBxAExhwHMIxOx3GAlZVUyjT/1WFIudzenstFlEpFo9M8o+Pj/X2eJzo4SCR4fnzdb2N4Pyv9cduVAAAAAElFTkSuQmCC" rel="icon" type="image/x-icon" />
Run Code Online (Sandbox Code Playgroud)
Pek*_*ica 14
好点和好主意,但不可能.favicon需要是一个单独的资源.无法将其与另一个图像文件组合.
Fel*_*nen 13
我发现一个有趣的解决方案这个页面.它是德语,但您将能够理解代码.
您将图标的base64数据放入外部样式表,因此它将被缓存.在您的网站的头部,您必须使用id定义favicon,并将favicon设置background-image为该ID的样式表中的a .
link#icon {
background-image:url("data:image/x-icon;base64,<base64_image_data>");
}
Run Code Online (Sandbox Code Playgroud)
和HTML
<html>
<head>
<link id="icon" rel="shortcut icon" type="image/x-icon" />
<link rel="stylesheet" type="text/css" href="/styles.css" />
...
</head>
<body>
...
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
真的有关系吗?
许多浏览器将favicon作为低优先级加载,因此它无论如何都不会阻止页面加载,所以是的,它是一个额外的请求,但它不在任何关键路径上.
接受的解决方案是可怕的,因为直到JS被检索并执行以下所有DOM元素都将被阻止渲染,并且它不会减少请求的数量!
正确的解决方案是使用HTTP流水线.
HTTP流水线技术是一种将多个HTTP请求写入单个套接字而不等待相应响应的技术.仅在HTTP/1.1中支持流水线操作,而不是在1.0中.
它需要服务器支持它,但不一定是partipate.
HTTP流水线操作需要客户端和服务器都支持它.需要符合HTTP/1.1标准的服务器来支持流水线操作.这并不意味着服务器需要管道响应,但如果客户端选择管道请求,则要求它们不会失败.
许多浏览器客户端都不应该这样做.
大多数浏览器都禁用HTTP流水线操作.
- Opera默认启用流水线操作.它使用启发式方法来控制所使用的流水线级别,具体取决于连接的服务器.
- 由于担心有关错误的代理和行头阻塞,Internet Explorer 8不会对请求进行管道传输.
- Mozilla浏览器(如Mozilla Firefox,SeaMonkey和Camino)支持流水线操作,但默认情况下禁用.它使用了一些启发式方法,尤其是为IIS服务器关闭流水线操作.
- Konqueror 2.0支持流水线操作,但默认情况下禁用.[需要引证]
- Google Chrome不支持管道传输.
我建议您尝试在Firefox中启用流水线操作并在那里尝试,或者只使用Opera(不寒而栗).
这不是问题的答案,而只是为了赞美Marcel和yahelc给出的答案,我为404 favicon问题提供了一个优雅的解决方案.
因为某些应用程序和浏览器以及诸如此类检查favicon.com以及如果在站点根目录中找不到图标,您只需使用204响应标头响应请求即可.
Apache示例:
Apache选项一(和我最喜欢的),你的.htacces或.conf中的简单一行:
Redirect 204 /favicon.ico
Run Code Online (Sandbox Code Playgroud)
Apache选项二:
<Files "favicon.ico">
ErrorDocument 204 ""
</Files>
Run Code Online (Sandbox Code Playgroud)
如需进一步阅读,Stoyan Stefanov撰写了一篇精彩的博客文章,网址为http://www.phpied.com/204-no-content/
这是一个好主意,但如果谷歌没有在他们的主页上做到这一点,我打赌它不能(目前)完成
对不起,您无法将favicon与其他资源合并.
这意味着您基本上有两个选择:
如果您对没有图标的网站感到满意 - 您可以href指向已经加载的非图标资源(例如样式表,脚本文件,甚至是预取的一些资源) .)
(我的简短测试表明,这适用于大多数(如果不是全部)主流浏览器.)
接受额外的HTTP请求,并确保您的favicon文件设置了积极的HTTP缓存控制标头.
(如果您有其他网站在您的控制之下,您甚至可以让他们偷偷地预加载本网站的图标 - 以及其他静态资源.)
PS Creative解决方案不起作用:
<link>元素的延迟注入(由用户@yc建议)可能会使事情变得更糟 - 通过导致两个 HTTP请求.