两者都能显示图片,但在其余几乎所有要紧的方面都不同。

判断规则

  • 内容 → img 元素。 如果图片传达了用户需要的信息——商品照片、图表、文章插图、标识站点身份的 logo——它就属于标记。
  • 装饰 → CSS 背景。 如果去掉它除了视觉精致度之外什么都不损失——纹理、渐变遮罩、重复图案、文字背后的首屏底图——CSS 才是它的归宿。

下面几乎所有论据都由此推出。

内容为什么该用 img

  • 无障碍:img 支持 alt 文本。CSS 背景对读屏软件是隐形的,除非你加 ARIA 变通方案,而那很容易做错。
  • SEO:写在标记里的图片有资格被图片搜索收录,CSS 背景通常不行。
  • 性能:浏览器的预加载扫描器能在原始 HTML 里立刻发现 img 的 src。CSS 背景要等样式表下载解析、且元素匹配之后才会被发现——这正是把首屏图放进 CSS 会损害 LCP 的原因。
  • 响应式:img 原生支持 srcset 和 sizes,让浏览器挑选合适的文件。CSS 需要 image-set 或媒体查询来近似实现。
  • 原生懒加载和优先级提示对 img 有效,对 CSS 背景无效。
  • 右键、保存、分享的行为符合用户预期。

CSS 背景仍然有用的地方

  • 轻松裁切与定位:background-size 和 background-position 不需额外标记就能实现 cover 效果。(不过 object-fit 现在也给了 img 同样的能力。)
  • 重复图案和平铺,这是 img 做不到的。
  • 在同一元素上叠加多层背景和渐变
  • 仅靠 CSS 按断点或主题切换图片,包括深色模式变体。
  • 文字压在图上,无需复杂的定位技巧。

中间地带

现代 CSS 从两个方向缩小了差距:

  • 给 img 加 object-fit: cover 就能复现经典的背景铺满效果,同时保留 img 的全部优势。对于叠加文字的首屏图,这已是推荐做法。
  • image-set()分辨率切换带给了 CSS 背景。
  • 首屏最强的写法,是一个带 object-fit 和 fetchpriority="high" 的 img,配合绝对定位的文字压在其上。

快速检查

  1. 图片没了,视障用户会不会错过信息?→ 用 img 并写 alt。
  2. 把图片完全移除,页面是否依然说得通?→ 用 CSS。
  3. 它是屏幕上最大的元素吗?→ 写进 HTML 的 img,立即加载并提升优先级。
  4. 需要重复或叠层吗?→ 用 CSS。

放在 img 标签里的装饰性图片要写空的 alt 属性,让读屏软件跳过它——这条小小的附加规则,让"内容与装饰"的区分保持诚实。