Menu

CSS 背景图片:尺寸、位置、重复与 cover

background-image 在元素内容的后面放置一张图片或渐变。学习 url() 和渐变、background-size(cover 与 contain)、background-position、background-repeat、多层背景叠加,以及 background 简写。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

如何添加背景图片

background-image 会在元素的内容、内边距和边框后面绘制一张图片。默认情况下,它从内边距盒子的左上角开始,保持原始尺寸,并重复平铺以填满盒子:

在真实项目中,url() 指向一个文件:url("images/hero.jpg")。路径相对于包含它的样式表(如果写在 <style> 元素里,则相对于页面)。本页的示例使用以 data: URL 形式内联写入的小型 SVG 图片,所以在任何地方都能运行。

有两点一开始就要知道:

  • 背景不会给元素提供尺寸。 一个设置了背景图片的空 div 高度为 0px。要给它内容、内边距、height 或 aspect-ratio。
  • 背景图片只是装饰。 屏幕阅读器会跳过它,它也没有替代文本。承载意义的图片应该放在 <img> 元素中。

background-size:cover、contain 和长度值

background-size 用来缩放图片。两个关键字都会保持图片的比例:

这张图片的宽度是高度的两倍,而每个盒子都是正方形。

值效果
auto(默认值)图片自身的尺寸
cover缩放到完全填满盒子,多出的部分被裁掉
contain缩放到整张图片都能放下,两侧留下灰色区域
200px宽 200px,高度按比例
50% auto宽度为盒子的一半,高度按比例
100% 100%正好等于盒子的尺寸;比例不同时图片会变形

cover 是首屏横幅和卡片的常用选择。contain 适合那些绝对不能被裁掉的 logo 和插图。

background-position 和 background-repeat

background-position 决定图片在盒子中的位置,可以使用关键字(top、center、bottom、left、right)、百分比或长度值。background-repeat 控制平铺方式。试试不同的值:

试试位置值 top right、bottom 10px right 20px 和 25% 75%,以及重复值 repeat-x、repeat-y、space(平铺时留出间隙,不裁切任何一块)和 round(调整每块的大小,让盒子里正好放下整数块)。

多层叠加:多个背景和文字遮罩

background-image 接受一个用逗号分隔的列表。第一层绘制在最上面。常见的用法是在照片上叠一层半透明渐变,让白色文字保持清晰可读:

aspect-ratio 给空盒子提供了高度,background-size: cover 同时作用于两层。更多渐变用法,请看 CSS 渐变。

background 简写

background 在一行中设置所有背景属性。尺寸必须紧跟在位置之后,用斜杠隔开,而颜色要写在最后一层:

.hero {
  background: url("hero.jpg") center / cover no-repeat, #1f2937;
}
/* the same as */
.hero {
  background-image: url("hero.jpg");
  background-position: center;
  background-size: cover;
  background-repeat: no-repeat;
  background-color: #1f2937;
}

图片加载期间以及加载失败时,会显示备用颜色。简写中没有写出的属性都会被重置为默认值,所以要先写简写,再写单独的属性。

其他背景属性

属性作用
background-attachment: fixed页面滚动时图片固定不动(iOS Safari 会忽略)
background-origin位置从边框、内边距还是内容的边缘开始计算
background-clip背景绘制到哪里,包括用 text 填充文字
background-blend-mode把各层混合在一起,比如 multiply

常见错误

  • 路径写错。 样式表中的 url() 是相对于 CSS 文件的,而不是相对于 HTML 页面。
  • 空元素。 它没有高度,所以图片无处显示。
  • 忘了写 no-repeat,在使用 contain 或小图片时,图片会平铺。
  • 用 100% 100% 拉伸图片,而你其实想要的是 cover。
  • 把重要图片做成背景。 内容图片请使用带替代文本的 <img>;屏幕阅读器看不到背景。
  • 包含空格或引号的 data: URL 没有加引号。 始终写成 url("...")。

常见问题

CSS 中如何添加背景图片?

在元素上使用 background-image: url("photo.jpg");。路径相对于 CSS 文件(如果写在 style 属性或 <style> 元素里,则相对于页面)。记得给元素设置尺寸,因为背景永远不会把一个空元素撑大。

如何让背景图片铺满整个元素?

使用 background-size: cover; 配合 background-position: center;。图片会保持比例缩放,直到完全填满盒子,超出的部分会被裁掉。

cover 和 contain 有什么区别?

cover 会填满整个盒子,并裁掉放不下的部分。contain 会完整显示整张图片,当比例不一致时,会在两侧留出空白。

如何让背景图片不重复?

加上 background-repeat: no-repeat;。默认情况下,背景图片会在两个方向上平铺来填满元素。

为什么我的背景图片不显示?

常见原因有:url() 中的路径写错了(它相对于 CSS 文件),元素因为没有内容而高度为零,或者后面的 background 简写把图片重置了。

Coddy 编程语言插图

和 Coddy 一起学编程

开始