HTMLでfavicon.icoリンクを設定する方法は誰でも知っています。
<link rel="shortcut icon" href="http://hi.org/icon.ico" type="image/x-icon">
しかし、小さな数バイトのアイコンに必要なのは、ばかげていると思いますまだ別のHTTP要求。そのため、その貴重なHTTPリクエストを高速化して保存するために、その画像をスプライト(たとえばbackground-position=0px -200px;
)の一部にするにはどうすればよいのだろうと思いました。これをロゴや他のアートワークで既存のスプライト画像に取得するにはどうすればよいですか?
_favicon.ico
(ウォーターフォールグラフのアイテム番号31)を指しているロボットは、私のペットZAMです。彼は通常は幸せで、ウェブ上で創造的なアップグレードをする時が来たことを知らせてくれますが、彼と私は彼の服装に同意しませんが、今日は少しばかげていると思います...
@ yc's answer のマイナーな改良点は、通常使用されてキャッシュされるJavaScriptファイルからbase64エンコードされたファビコンを注入することです。また、データURIを供給することでfavicon.ico
を要求するブラウザの標準動作を抑制します関連するmeta
タグ内。
この手法により、余分なhttp要求が回避され、Windows 7上のChrome、Firefox、およびOperaの最新バージョンで動作することが確認されました。ただし、does n'tは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>
...
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. */
これらは通常、最初のアクセス後にブラウザのキャッシュにダンプされるため、ほとんどの場合、別のHTTPリクエストは発生しません。
これは、実際に提案された「ソリューション」のいずれよりも効率的です。
データURIを試すことができます。 HTTPリクエストなし!
<link id="favicon" rel="shortcut icon" type="image/png" href="data:image/png;base64,....==">
ページに静的キャッシュがない限り、ファビコンはキャッシュできず、ファビコン画像のサイズによっては、結果としてソースコードが肥大化する可能性があります。
データURIファビコンは、ほとんどの最新のブラウザーで機能するようです。 Mac上の最近のバージョンのChrome、Firefox、Safariで動作しています。 Internet Explorer、およびおそらくOperaの一部のバージョンでは動作しないようです。
古いIEについて心配している場合(そして、最近ではないはずです)、従来のfavicon.icoをロードするIE条件付きコメントを含めることができます方法、古いInternet ExplorerはデータURIファビコンをサポートしていないようです
`<!--[if IE ]><link rel="shortcut icon" href="http://example.com/favicon.ico" type="image/x-icon" /><![endif]--> `
また、http://google.com/favicon.ico
のように、ファビコンがキャッシュされている可能性が高い別の人気サイトのファビコンを使用して、キャッシュから提供することもできます。
コメンターが指摘したように、canするからといって、そうする必要はありません。一部のブラウザーは、私たちが考案したトリックに関係なくfavicon.icoを要求するからです。これにより節約できるオーバーヘッドの量は、gzip、静的コンテンツ用の遠いexpiresヘッダーの使用、JavaScriptファイルの縮小、背景画像のスプライトまたはデータURIへの挿入などと比較してわずかです。 、CDNなどから静的ファイルを提供します。
次のようなbase64エンコードされたファビコンを使用できます。
<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" />
良い点といい考えですが、不可能です。ファビコンは、単一の別個のリソースである必要があります。別の画像ファイルと組み合わせる方法はありません。
このページ で興味深い解決策を見つけました。ドイツ語ですが、コードを理解することができます。
アイコンのbase64データを外部スタイルシートに入れて、キャッシュされます。 Webサイトのヘッドで、ファビコンをIDで定義する必要があり、ファビコンはそのIDのスタイルシートでbackground-image
として設定されます。
link#icon {
background-image:url("data:image/x-icon;base64,<base64_image_data>");
}
そして、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>
それは本当に重要ですか?
多くのブラウザは、ファビコンを低い優先度でロードするため、ページのロードがブロックされることはありません。そのため、追加のリクエストですが、クリティカルパスではありません。
JSが取得および実行されるまで、以下のすべてのDOM要素のレンダリングがブロックされ、リクエストの数が減らないため、受け入れられたソリューションは恐ろしいものです。
適切な解決策は、 HTTPパイプライン化 を使用することです。
HTTPパイプライン化は、対応する応答を待たずに複数のHTTP要求を単一のソケットに書き出す手法です。パイプライン処理はHTTP/1.1でのみサポートされ、1.0ではサポートされません。
サーバーがサポートする必要がありますが、必ずしも参加する必要はありません。
HTTPパイプライン処理をサポートするには、クライアントとサーバーの両方が必要です。パイプラインをサポートするには、HTTP/1.1準拠のサーバーが必要です。これは、サーバーが応答をパイプライン処理する必要があることを意味するのではなく、クライアントが要求をパイプライン処理することを選択した場合にサーバーが失敗しないことを要求することを意味します。
多くのブラウザクライアントは、必要なときにそれを行いません。
HTTPパイプラインは、ほとんどのブラウザーで無効になっています。
- Operaでは、デフォルトでパイプラインが有効になっています。接続されたサーバーに応じて、ヒューリスティックを使用して、使用されるパイプラインのレベルを制御します。
- Internet Explorer 8は、バグのあるプロキシおよび行頭ブロッキングに関する懸念のため、リクエストをパイプライン処理しません。
- Mozillaブラウザ(Mozilla Firefox、SeaMonkey、Caminoなど)はパイプラインをサポートしますが、デフォルトでは無効になっています。特にIISサーバーのパイプラインをオフにするために、いくつかのヒューリスティックを使用します。
- Konqueror 2.0はパイプラインをサポートしていますが、デフォルトでは無効になっています。[要出典]
- Google Chromeはパイプラインをサポートしていません。
Firefoxでパイプラインを有効にして試してみるか、Opera(shudder)を使用することをお勧めします。
その素晴らしいアイデアですが、もしGoogleが彼らのホームページでそれをやっていなかったら、私はそれが(現在)できないと確信しています
実際には質問に対する答えではなく、単に Marcel および yahelc で与えられる答えを補完するために、404ファビコンの問題に対するエレガントなソリューションを提供します。
一部のアプリやブラウザ、その他ではfavicon.comをチェックし、サイトのルートにアイコンが見つからない場合は、 204 response ヘッダーでリクエストに単純に応答できます。
Apacheの例:
Apacheオプション1(および私のお気に入り)、. htaccesまたは.confのシンプルな1つのライナー:
Redirect 204 /favicon.ico
Apacheオプション2:
<Files "favicon.ico">
ErrorDocument 204 ""
</Files>
さらに読むには、Stoyan Stefanovによるニースのブログ投稿があります http://www.phpied.com/204-no-content/
申し訳ありませんが、ファビコンを他のリソースと組み合わせることはできません。
これは、基本的に2つのオプションがあることを意味します。
サイトにファビコンがないことに満足している場合は、href
に、既に読み込まれているアイコン以外のリソース(スタイルシート、スクリプトファイル、または有益なリソースなど)を指定するだけで済みます。プリフェッチされません。)
(私の短いテストでは、これはすべてではないにしても、ほとんどの主要なブラウザで機能することを示しています。)
追加のHTTP要求を受け入れ、ファビコンファイルに積極的なHTTPキャッシュ制御ヘッダーが設定されていることを確認してください。
(他のWebサイトを管理している場合は、他の静的リソースとともに、このWebサイトのファビコンをこっそりプリロードしておくこともできます。)
P.S。創造的なソリューション動作しません:
<link>
要素の遅延注入を実行すると(ユーザー@ycが示唆するように)、事態を悪化させる可能性があります-twoHTTPリクエスト。データフットプリントをさらに小さくするために、ICO形式の代わりに8ビットPNGを使用できます。変更する必要があるのは、MIMEタイプヘッダー「data:image/x-icon」ではなく「data:image/png」を使用することだけです。
<link
href="data:image/png;base64,your-base64-encoded-string-goes-here"
rel="icon" type="image/png"
/>
「type」属性には「image/png」または「image/x-icon」を指定できますが、どちらも機能します。
Gimpまたはconvertを使用して、ICOを8ビットpngに変換できます。
convert favicon.ico -depth 8 -strip favicon.png
base64コマンドを使用してPNGバイナリをbase64文字列にエンコードします。
base64 favicon.png
最も簡単な方法は次のとおりです。
<!DOCTYPE html><html><head>
<link rel="shortcut icon" href="data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAA
lwSFlzAAALEwAACxMBAJqcGAAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4
OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3
JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9y
Zy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdG
lvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25z
LmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj
4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAg
PC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAABLJJREFUWAnFV+trW2UY/yVN0j
S32q6bnWunQ1e11k3YXMUy8AbDoSBDv4mfFPTj/Gd9ug/7B/woqCCISnGItcyppbgN
Rhn2st5G2yxt1svSJe1yPYnP703fcs7JSZo4YS9Ncs57eX6/5/Y+T12fX7hYdAHy92
iG+1GCU2X3/6V3k9sNl8uFUqnUkMiHJkDfuQV4M7WFbC4Hr8fTEAlPQ3RtmwleFI0z
mQxO95/EQP8pLEaj+PaHQbS3RmAUi7YTla8PRYDGLhgGPnz/HI719Srp0VgMhszRHf
WM/+wC+jy1tY2zb72uwOl7WmPi1gwCfr887609CdZtAfpZa0XNc/k8nug8gBPHjylF
uTY7N4/JmVmEQkFlBbWwx9eeBNyiKbVLZ7IKlEAtomEmm0Vvz1G0tLQoiKXoHXzz/Y
9qX75QgM/jhb/ZB5KtlRk1CdDM2+k0SKLn6SM4KBoXRHhsOY6J2XmsbWxgdv42Jqdn
cH3sJo4c7sKhg50oFku4s7yMuYUleJqahEizzDm7pCoBgt8XH7/Q8wzOvPmamLtz1w
UMvPjdu1hYjIrPp9He9hjOf/oJ9rW37e5hBiwuRXFpaBjR5RWEgkFHEq4vLlysuDkI
nhTwV068hPfeOau0oJ21KXUsKNvbvux7suKq734axNT0nLhOLCHuNI8KC1B4Wg7RnO
++fUaB03x0gxlYA1EYZcoxta73cJ3PD8SFuWxOnbdCl2k4EuCN9sbpATT7fMpsBLcP
DcR5gpuHBk8mU/jyq6+xcW8TYckMpziwSKagvKTX4x0deOpwt5JpBjKD1PM8eu064q
vraI2EHcEpw0pAqnK+YODA/n3wS6pxNEpAa58TK05IdoQl+AyjoGQ5fVkI0JbFoqEi
tlFgu/C01IeM3B2UY4s7y1YrAbXUeEm1SNx58Un8sDJKiNbsdiwEaD6m4JakoFPAOA
HZ57TleFs+2d2lMsotl1G1YSHATR5PEzYSCXXt8p2kGh36zED/y+o8qyNridOwEOBB
j5htI7GJ1bU1p/11zZX9XkJ31yF89MG5nTpScAxoCwFKZ86z8NxeWKwLrNom7YrjL/
bh/GcfY39Hu2RYJYkKAvR9KBjAjZv/CJHMThQ37gYS066IhMNgWmpSZtIVBHio2euV
AhLH+OSU2qsFmQ828jx69Rpi8VX4vJX9YgUBCmbBCIsVhv8cQTKVKt/jDsFIYvpjJ0
RLUuPYygqujF5FG3tEo7IkOxKgUObwvcR9DF2+omRTmE5NDco5/dFzSoGd4sWaMvjL
kCJZJQmsV7FZC9bziBSQv2+M4Y+RUbWki5IGZXPC1oy/eo4buY9W/PnX3zC/uFTuEa
VJcRoV1dC8iSRawyFcGv4dqe1tvHrqpFS1EFbX1zE+dQvT0hVlpNSyzvc+exR9zz8n
zUmbVL8ELv81grHxSbTK/lrtuWNDYibBZ14iSSEQlP6PGbIpZTadzkg/6Fdr1PaBvI
cCLYgIYa7TKsFAYNdtdpn6vaYF9CYCREQTxkBS/gPySZb42SvIvDhYNQRsQBlkal3i
R/cSWka137oI8LAOQF7VDDiDwHrw3Si/l9eFl5CtZzhmQa2DZlynfXut28/8C/JOMz
7+5SRKAAAAAElFTkSuQmCC">
</head></html>
それが表すアイコンは何ですか?以下に答えて投票してください!
ページ上のすべての画像は個別のhttpリクエストです。ファビコンを必要とする悲劇はありません。