如果背景图片相对小,或者你执意要这嘛做,图片转为bas464,存到css或者html里面。
演示: 背景图片闪现空白方案-base背景图片

不足: base64增加带宽成本,内容会比原本大至少1/3。 至于为什么可参见 前端Base64编码知识,一文打尽,探索起源,追求真相。

方案2 prefetch

<link rel="prefetch" ></link>
  <link rel="prefetch" href="./img/bg-huoluo.jpg"/>   
    .bg {
        background-image:url("./img/bg-huoluo.jpg");
        background-size: contain;

prefetch是对浏览器的暗示,暗示将来可能需要某些资源,但由浏览器决定是否加载以及什么时候加载这些资源。 优先级低。
pre家族:preload, prefetch, dns-prefetch, preconnect, prerender。
有人可能会问,干嘛不用preload。 呵呵, 你说呢?
演示: 背景图片闪现空白方案-preferch

方案3 创建隐藏Img节点

   <img src="./img/bg-huoluo.jpg" alt="" title="" style="display: none"/>
    .bg {
        background-color: #2D2C27;
        background-image: url(./img/bg-huoluo.jpg);
        background-size: contain;

这方案好理解,图片已经请求下载啦。 其实不能解决首屏背景图片的问题。
演示:背景图片闪现空白方案-创建隐藏Img节点

方案4 等待图片加载完毕再显示弹框

        let dg = null;
        function createDialog() {
            onImageLoad('./img/bg-huoluo.jpg').then(src => {
                if (!dg) {
                    dg = document.createElement('div');
                    dg.className = "bg";
                    dg.style.backgroundImage = `url(${src})`;
                    dg.id = "dialog";
                    dg.innerHTML = `
                <div class="content">我爱赫萝!!!!</div>
                    document.body.appendChild(dg);
        function onImageLoad(src) {
            return new Promise((resolve, reject) => {
                let img = new Image();
                img.src = src;
                img.onload = function () {
                    resolve(src)
                img.onerror = reject

当然这是有明显问题的,你不能因为一个背景图片而让内容无法正常展现。
当然你可以有修正方案。
演示: 背景图片闪现空白方案-等待图片加载完毕再显示弹框

方案5 同时设置背景颜色和图片

        .bg {
            background-color:#433F34;
            background-size: contain;
        .bg-new{
            background-image: url(./img/bg-huoluo.jpg)

这样,背景图片加载上的时候,不会有明显的闪白效果。 当然要是背景图片,五颜六色,估计有点为难客官啦。

演示: 背景图片闪现空白方案-同时设置背景颜色和图片

方案6 jpg使用渐进模式,png使用交错模式

这两种模式共同的作用就是,你不必完整的下载完毕图片,就可以看到图片的内容了。

打个比方, 1M的图片,你可能只需下载不到100Kb,就已经能相对清晰的看到图片了。

演示: png正常,png交错,jpg渐进

方案7 小图过度方案

显示loading图片或者小图,完毕后再换大图。 这种方案常用语封面,商品图标等等场景,背景图也可以借鉴其思路。

其他可参考方案

  • webp格式,减少图片大小
  • css spirte, 减少http开销,同时让其早被加载
    css spirte + prefech 可以秀一波
  • jpg格式图片压缩
  • 图片cdn
  • 背景图片切割,能repeat就repeat
  • 是不是很简单,一切都看起来没那么难,这样,你才容易入坑啊。

    写作不易,你的一赞一评就是我前行的最大动力。
    技术交流群请到这里来

    分类:
    前端