浏览器图片优化

 预期效果:

        项目优化,对不同浏览器进行判断是否支持png, avif, 和 webp格式图片,以达到更快的渲染效果


    <img id="avifImg" style="display: none" src="imgs/loaded.avif" alt="avif" />
    <img id="webpImg" style="display: none" src="imgs/loaded.webp" alt="webp" />
<script>
      window.onload = function () {
        var isSupportAvif = document.querySelector("#avifImg"),
          isSupportWebp = document.querySelector("#webpImg");
        (function () {
          window.imgSupport = { png: !0, avif: !1, webp: !1 };
          ["avif", "webp"].forEach(function (f) {
            (function (b, h) {
              function d(a) {
                0 == isSupportAvif.width && "avif" == b
                  ? (a = !1)
                  : 0 == isSupportWebp.width && "webp" == b && (a = !1);
                window.localStorage.setItem(g, JSON.stringify(a));
                h(a);
              }
              var g = "lobby@support@" + b,
                k = ["Chrome", "Opera", "Edge", "Firefox"],
                l = navigator.userAgent;
              try {
                var e = JSON.parse(window.localStorage.getItem(g));
              } catch (a) {
                console.error("Failed to parse localStorage item:", a),
                  (e = null);
              }
              if (null !== e) d(e);
              else if (
                k.some(function (a) {
                  return -1 !== l.indexOf(a);
                })
              )
                d(!0);
              else {
                var c = new Image();
                c.onload = function () {
                  d(0 < c.width && 0 < c.height);
                };
                c.onerror = function () {
                  d(!1);
                };
                c.src =
                  "data:image/" +
                  b +
                  ";base64,UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==";
              }
            })(f, function (b) {
              window.imgSupport[f] = b;
            });
          });
        })();
      };
    </script>

代码解析:

1.变量声明:

var isSupportAvif = document.querySelector("#avifImg"),
    isSupportWebp = document.querySelector("#webpImg");

这里通过 document.querySelector 获取页面上两个元素(假设是图片),分别用于测试 AVIF 和 WebP 的支持情况。

2.外部循环:

["avif", "webp"].forEach(function (f) { ... });

使用 forEach 方法遍历数组 ["avif", "webp"],并对每个元素执行回调函数。

3.立即调用的函数表达式 (IIFE):

(function (b, h) { ... })(f, function (b) { ... });

对每个图像格式(avifwebp),创建一个立即调用的函数表达式 (IIFE),并传递两个参数:

  • b: 当前图像格式(avif 或 webp)。
  • h: 一个回调函数,用于处理检测结果。

4.内部函数 d:

function d(a) { ... }

定义了一个内部函数 d,用于处理图像格式的支持情况,并将其结果存储到 localStorage

5.检查本地存储:

var g = "lobby@support@" + b;
try {
  var e = JSON.parse(window.localStorage.getItem(g));
} catch (a) {
  console.error("Failed to parse localStorage item:", a), (e = null);
}
if (null !== e) d(e);

尝试从 localStorage 中获取之前保存的结果。如果成功解析,则直接调用 d 函数处理该结果。

6.用户代理检测:

var k = ["Chrome", "Opera", "Edge", "Firefox"], l = navigator.userAgent;
if (k.some(function (a) { return -1 !== l.indexOf(a); })) d(!0);

 检查用户的浏览器是否为 Chrome、Opera、Edge 或 Firefox。如果是这些浏览器之一,则认为支持 avifwebp 格式,并调用 d 函数处理结果。

7.图像加载测试:

else {
  var c = new Image();
  c.onload = function () { d(0 &lt; c.width &amp;&amp; 0 &lt; c.height); };
  c.onerror = function () { d(!1); };
  c.src = "data:image/" + b + ";base64,UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==";
}

 如果不是上述浏览器,则通过加载一个 base64 编码的图像来测试浏览器是否支持 avifwebp 格式。如果图像加载成功且尺寸大于零,则认为支持该格式;否则认为不支持。

8.回调函数 h:

})(f, function (b) { window.imgSupport[f] = b; });

将检测结果传递给回调函数 h,并将结果存储在 window.imgSupport 对象的相应属性中

使用方法:

window.localStorage.getItem('lobby@support@avif')获取对应支持情况,写获取对应图片路径

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨丿听风丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值