← 記事

アニメーションするSVGファビコンのダイナミックな世界

ブラウザーのタブに訪れた新しい時代

ブラウザーのタブにある小さなアイコンを覚えていますか。それがファビコンです。当初は静的でドットの粗い画像で、ほとんど注目されていませんでした。しかしWebは進化し、その構成要素も進化します。そこで登場したのが、ブラウザータブのアイコンの世界を一変させるSVG(Scalable Vector Graphics)ファビコンの時代です。ピクセルベースの従来のファビコンとは異なり、SVGはベクターベースなので、品質を損なわずに拡大縮小できる鮮明な画像になります。しかも、踊ったり、点滅したり、変化したり、つまりアニメーションさせることもできるのです。

SVGファビコン:単なるアイコンではなく、小さなキャンバス

SVGをファビコンとして使うと、小さなアイコンの一つひとつが創造性を発揮するための小さなキャンバスになります。SVGはXMLベースなので、HTMLに直接埋め込めます。つまり、単なる静止画像ではなく、ブラウザーのタブの中でインタラクティブでダイナミックなアート作品を表示できるのです。

絵文字とテキストでファビコンに個性を

お気に入りの絵文字やメッセージを、ファビコンにそのまま表示できるようになりました。絵文字を埋め込んだり文字を加えたりすれば、単なるアイコンではなく、メッセージを伝えるファビコンになります。やり方の一例を紹介します。

<link rel="icon" id="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>👨‍💻</text></svg>">

これをHTMLの<head>に入れると、アイコンが表示されます。

JavaScriptでファビコンに命を吹き込む

でも、静止画で終わらせる必要はありません。アニメーションさせましょう。JavaScriptの魔法を少し使えば、ファビコンを変化させたり、表情を変えたり、時間の経過とともにメッセージを伝えたりできます。

window.addEventListener("load", (event) => {
    let intervalId = null;

    // Start the interval when the page is first loaded
    startInterval();

    // Listen for visibilitychange and pagehide events
    document.addEventListener('visibilitychange', handleVisibilityChange);
    window.addEventListener('pagehide', handlePageHide);

    const emojis = ['👋', '💼', '💻','🔧','📊','📱', '👨‍💻','🚀','💡', '📈','📝','💡','📢'];
    const icon = document.getElementById('icon');
    let currentIndex = 0;
    const text = "I"
    let message;
    let faviconText;

    function setFavicon(item) {
        // Update the icon element with the new message
        icon.href = `data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200"><text id="t1" x="50%" y=".9em" fill="hsl(36, 100%, 50%)" font-size="180" font-family="system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'" text-anchor="middle">${item}</text>
</svg>`;

    }

    function startInterval() {
        clearInterval(intervalId);
        intervalId = setInterval(() => {
            // Get the current message and shift it two characters to the left
            if(currentIndex == 0) {
                message = text;
            }

            // If we've reached the end of the message, show a random emoji
            if (message.length < 1) {
                const emoji = emojis[Math.floor(Math.random() * emojis.length)];
                message = emoji;
                currentIndex = 0;
                faviconText = emoji
            } else {
                currentIndex += 2;
                faviconText = message.substr(0, 2);
            }

            setFavicon(faviconText);
            message = message.substr(2);
        }, 1500);
    }

    function stopInterval() {
        setFavicon(emojis[Math.floor(Math.random() * emojis.length)]);
        clearInterval(intervalId);
        intervalId = null;
    }

    function handleVisibilityChange() {
    if (document.hidden) {
        // Page is hidden, stop the interval after x seconds
        setTimeout(() => {
            stopInterval();
        }, 60000);

    } else {
        // Page is visible, start the interval
        startInterval();
    }
    }

    function handlePageHide() {
        // Page is being unloaded, stop the interval
        setTimeout(() => {
            stopInterval();
        }, 60000);
    }
});

このスクリプトが秘密のレシピです。絵文字とテキストの配列をもとにファビコンを切り替え、ブラウザーのさまざまなイベントに応じてアニメーションを開始・停止します。

ブラウザーの対応状況

現在、Chrome、Firefox、Edgeがこの機能に対応しています。主要なブラウザーの中で対応していないのはSafariだけです。

SVG favicons – Can I use…

おわりに:小さな革命

絵文字やテキストを使ったアニメーションするSVGファビコンは、単なるおしゃれなアイコンではありません。アートとテクノロジーの融合であり、Webデザインにおける創造性とインタラクションの新しい可能性を開くものです。これらのアイコンは小さいかもしれませんが、ユーザー体験やブランド表現に与える影響は計り知れません。Webデザインの世界では、ほんの小さなディテールが最も大きな違いを生むことがよくあります。ダイナミックで表現力豊かなファビコンの未来へようこそ。