那每天气不错,心情并很差,由于感冒了。
实现前端一个弹出框功能时,发现有背景图片的弹出框,会出现闪白现象。由于心情不太好,我一直忍着。
直到今天, 研究一下解决方案,因而有了今天的文章。css
这是一个很基础的问题,也很常见的问题。 正常状况下咱们都会忽视他。html
我===内容 & 你 === 背景图片前端
我显示的时候,你已经在git
若不能,我显示的时候,你尽快在github
你尽量的小web
能够到背景图片闪现空白解决方案 看到各类方案演示。浏览器
若是背景图片相对小,或者你执意要这嘛作,图片转为bas464,存到css或者html里面。
演示: 背景图片闪现空白方案-base背景图片app
不足: base64占带宽啊!ide
<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。 呵呵, 你说呢?
演示: 背景图片闪现空白方案-preferchfetch
<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节点
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 }) }
固然这是有明显问题的,你不能由于一个背景图片而让内容没法正常展示。
固然你能够有修正方案。
演示: 背景图片闪现空白方案-等待图片加载完毕再显示弹框
.bg { background-color:#433F34; background-size: contain; } .bg-new{ background-image: url(./img/bg-huoluo.jpg) }
这样,背景图片加载上的时候,不会有明显的闪白效果。 固然要是背景图片,五光十色,估计有点为难客官啦。
再回头看看总结:
我===内容 & 你 === 背景图片
我显示的时候,你已经在
若不能,我显示的时候,你尽快在
你尽量的小
那么:有下面的一些额外的话:
jpg有渐进式, png有交错模式。
咱们一块儿来看看效果。
演示: png正常,png交错,jpg渐进