【问题标题】:how to animate chrome and ie favicon (a loading indicator)如何为 chrome 和 ie favicon 设置动画(加载指示器)
【发布时间】:2018-09-24 22:19:47
【问题描述】:

我的 PM 要求将网站图标更改为动画加载图像。如果我只是将 link.href 指向一个 gif 文件,它只能在 Firefox 中使用。

我做了一些研究,发现 chrome 不支持动画网站图标。 但wiki 表示 chrome 4.0 支持动画 GIF。

function changeFavicon() {
  var link = document.createElement('link');
  link.type = 'image/x-icon';
  link.rel = 'shortcut icon';
  link.href = 'http://uploads.neatorama.com/vosa/theme/neatobambino/media/loading.gif';
  document.getElementsByTagName('head')[0].appendChild(link);
}

以上是我的代码,但图标仅在 Firefox 中动画。

【问题讨论】:

标签: javascript google-chrome favicon


【解决方案1】:

我使用了另一个favicon.js。我使用了 8 个静态图标来模拟加载动画图标。

    favicon.animate([
                 "img/loading1.ico", "img/loading2.ico",
                 "img/loading3.ico", "img/loading4.ico",
                 "img/loading5.ico", "img/loading6.ico",
                 "img/loading7.ico", "img/loading8.ico"
               ], 50);

【讨论】:

    【解决方案2】:

    这适用于谷歌浏览器:

    解释:Google Chrome 不支持动画网站图标。我已提供此代码作为使用第三方库的替代方法。为了避免持续的服务器轮询,我建议使用 Base64 编码的帧。

    仅供参考:您可以使用包含 Base64 编码图标的数组并循环遍历元素,而不是使用 switch 语句,但我更喜欢以这种方式分解。

    重要提示:同样重要的是要知道,使用 Base64 编码图像的原因是为了每个帧都不会向服务器发出连续的请求。

    document.head = document.head || document.getElementsByTagName('head')[0];
    function changeFavicon(src) {
        var link = document.createElement('link'), oldLink = document.getElementById('dynamic-favicon');
        link.id = 'dynamic-favicon';
        link.rel = 'shortcut icon';
        link.href = src;
        if (oldLink) {
            document.head.removeChild(oldLink);
        }
        document.head.appendChild(link);
        }
    function animate(){
        if ( typeof animate.i == 'undefined' ) {
            animate.i = 0;
        }
        switch(animate.i) {
            case 0:
                changeFavicon("[PUT BASE64 for ICO FRAME 1 HERE]");
                break;
            case 1:
                changeFavicon("[PUT BASE64 for ICO FRAME 2 HERE]");
                break;
            case 2:
                changeFavicon("[PUT BASE64 for ICO FRAME 3 HERE]");
                break;
            case 3:
                changeFavicon("[PUT BASE64 for ICO FRAME 4 HERE]");
                break;
            case 4:
                changeFavicon("[PUT BASE64 for ICO FRAME 5 HERE]");
                break;
            case 5:
                changeFavicon("[PUT BASE64 for ICO FRAME 6 HERE]");
                break;
            case 6:
                changeFavicon("[PUT BASE64 for ICO FRAME 7 HERE]");
                break;
            case 7:
                changeFavicon("[PUT BASE64 for ICO FRAME 8 HERE]");
                break;
            case 8:
                changeFavicon("[PUT BASE64 for ICO FRAME 9 HERE]");
                break;
            case 9:
                changeFavicon("[PUT BASE64 for ICO FRAME 10 HERE]");
                break;
            case 10:
                changeFavicon("[PUT BASE64 for ICO FRAME 11 HERE]");
                break;
            case 11:
                changeFavicon("[PUT BASE64 for ICO FRAME 12 HERE]");
                break;
            case 12:
                changeFavicon("[PUT BASE64 for ICO FRAME 13 HERE]");
                break;
            case 13:
                changeFavicon("[PUT BASE64 for ICO FRAME 14 HERE]");
                break;
            case 14:
                changeFavicon("[PUT BASE64 for ICO FRAME 15 HERE]");
                break;
            case 15:
                changeFavicon("[PUT BASE64 for ICO FRAME 16 HERE]");
                break;
        }
        animate.i = animate.i + 1;
        if(animate.i == 16){
            animate.i = 0;
        }
    }
    setInterval(animate,250);
    

    【讨论】:

    • 完美运行,谢谢!如果有人正在寻找在线 ico-to-base64-converter:我使用 askapache.com/online-tools/base64-image-converter
    • 为什么不使用数组而不是大case语句?
    • @maximillian-laumeister 就像我在回答中所说:您可以使用包含 Base64 编码图标的数组并循环遍历元素而不是使用 switch 语句,但我只是更喜欢以这种方式分解.
    • @RobertTalada 很抱歉在您的回答中遗漏了这一点。我刚刚提到它是因为使用 switch 语句而不是数组会将一个动画循环转换为 O(n^2) 操作,而不仅仅是 O(n)。除非您拥有大量框架,否则这并不重要。
    • @maximillian-laumeister 感谢您的详细回复和解释。虽然不一定理解符号,但我一直理解 Switch 的复杂性为 O(n)。我相信我认为 if 语句也是 O(n),但事实并非如此,因此我以某种方式到达了 O(2n)。无论如何,我一直都知道它的效率较低,我可能当时选择这样写它只是因为它在视觉上让我很满意。我直接从我当时的一个网站上复制了这段代码,只是删除 Base64。
    【解决方案3】:

    您可能想试试favico.js。它使您可以将视频用作网站图标。好的,这对于一个简单的 GIF 来说有点沉重,但你明白了。另外,您可能可以通过查看代码获得有趣的(和多平台的)部分。

    【讨论】:

      【解决方案4】:

      问题是,您需要先删除现有的favicon

      function removeFavicon() {
        var myHead = document.getElementsByTagName("head")[0];
        var lnks = myHead.getElementsByTagName('link');
        var len = lnks.length;
        for (var i = 0; i < len; ++i) {
      
          var l = lnks[i];
          if (l.type == "image/x-icon" || l.rel == "shortcut icon") {
            myHead.removeChild(l);
            return; // Returned assuming only one favicon link tag
          }
      
        }
      }
      
      
      function changeFavicon() {
        var link = document.createElement('link');
        link.type = 'image/x-icon';
        link.rel = 'shortcut icon';
        link.href = 'http://uploads.neatorama.com/vosa/theme/neatobambino/media/loading.gif';
        removeFavicon(); // remove existing favicon
        document.getElementsByTagName('head')[0].appendChild(link);
      
      }
      
      changeFavicon();
      

      【讨论】:

      • 感谢您的帮助,但我尝试了您的代码,chrome 选项卡上的 favicon 仍然是静态的 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2013-11-07
      • 1970-01-01
      相关资源
      最近更新 更多