背景图片是大敌
了解为什么应该避免在网站上使用背景图片,如何快速找到背景图片以及如何修复这个问题
背景图片是大敌
认识我或听过我演讲的人可能听我谈论过背景图片。对于还不了解的人:我真的非常非常不喜欢背景图片。在这篇文章中,我将快速解释为什么不喜欢背景图片、如何快速找到使用背景图片的页面以及如何修复它们!
Table of Contents!
为什么背景图片对 Core Web Vitals 有害
加载网页时,每个元素都有其加载时机和位置。通过延迟加载、预加载、异步加载、调度、定义 fetchpriority 等现代技术,我们基本上可以控制所有关键资源。唯独背景 图片除外!
看看这个真实案例:
我每天都能看到这种模式,尤其是在 WordPress 网站中。所有普通图片都是懒加载的,而一些图片(在本例中是页脚的社交图标)是背景图片。你能猜到会发生什么吗?
<html>
<head>
<style>
footer {
/* a margin of 100 vh wil make the footer off-screen !*/
margin-top: 100vh;
>.social {
>.facebook {background-image: url('img/facebook.jpg');}
>.instagram {background-image: url('img/instagram.jpg');}
>.linkedin {background-image: url('img/linkedin.jpg');}
>.email {background-image: url('img/email.jpg');}
}
}
</style>
</head>
<body>
<!-- yes this image is lazy loaded, because tiny mistakes happen! -->
<img loading="lazy" src="img/hero.jpg"></img>
<footer>
<div class="social">
<span class="facebook"></span>
<span class="instagram"></span>
<span class="linkedin"></span>
<span class="email"></divspan
</div>
</footer>
</body>
</html>
你可能已经猜到了:屏幕外的背景图片会在更重要的 'hero.jpg' 图片 之前排队下载,而后者通常会成为页面上的 Largest Contentful Paint 元素。

但这还不是全部!
正如我所说,背景图片是大敌!这是因为,除了它们有时获得的奇怪优先级之外,背景图片缺少普通图片所拥有的实用功能!
- 无法懒加载:背景图片没有 loading 属性
- 无法异步解码:背景图片没有 decoding 属性
- 没有 fetchpriority:背景图片没有 fetchpriority 属性
- 响应式图片资源:背景图片的 image-set() 属性不具备良好响应式设计所提供的强大功能。
- 没有 width 和 height 属性。无法设置简单的 width 和 height 属性会迫使你使用需要额外代码的替代方案(在相同复杂度下,更多代码总是比更少代码更慢!)
- 没有 alt 文本:虽然这并不
快速找到页面上的所有背景图片
let bgimg = performance.getEntriesByType('resource')
.filter(rs => rs.initiatorType == 'css')
.map(rs => {
return {
name: rs.name,
initiator: rs.initiatorType
}
}) || [];
(bgimg.length > 0)?
console.table(bgimg):
console.log('No background images on this page!');
这将显示一个格式整齐的表格,包含所有背景图片的名称和 initiator
如何避免使用背景图片
背景图片很容易避免。具体方法取决于图片本身。大致有两种方法。
普通图片的情况
你可能不相信,但在我发现的大多数背景图片案例中,图片的背景部分甚至没有任何用途。这些图片只是“需要出现在页面的某个位置”,而 background-image:url() 被滥用于此目的。
如果是这种情况,只需添加一个普通的 image 标签并从样式表中删除背景图片即可。
覆盖图片的情况:
覆盖图片是完全覆盖父容器的图片。使用背景图片作为覆盖图片在某种程度上是合理的,因为很久以前这曾是实现覆盖图片的唯一方法,我想人们就是习惯了自己熟悉的方式。幸运的是,我们现在有更好的选择。让我们来修复它!
对于覆盖图片,只需删除样式 background-image: url(hero.jpg);background-size: cover;并在同一个容器中放置一个普通图片,然后将 CSS 编辑为如下所示:
<style>
.img-container {
position: relative;
> img {
width: 100%;
height: 100%;
object-fit: cover;
position: absolute;
z-index: 1;
}
}
<style>
<div class="img-container">
<img
height="500"
width="300"
decoding="async"
loading="lazy"
src="hero.jpg"
srcset="hero-320w.jpg, hero-480w.jpg 1.5x"
alt="alt text"
fetchpriority="low"
>
</div>Lab data is not enough.
I analyze your field data to find the edge cases failing your user experience.
- Real User Data
- Edge Case Detection
- UX Focused