背景大小

总体概述

background-size 属性使一个控制 background-image 的缩放。它最多需要两个值,它们决定了垂直和水平方向上所得图像的比例/大小。如果属性遗失,则认为 widthheight 都属于 auto

如果可以确定,auto 将保持图像的纵横比。高度是可选的,可以认为是 auto。因此,在 256 像素×256 像素图像上,以下所有 background-size 设置将生成高度和宽度为 50 像素的图像:

background-size: 50px;
background-size: 50px auto; /* same as above */
background-size: auto 50px;
background-size: 50px 50px;

因此,如果我们从下面的图片(具有 256 px×256 px 的尺寸)开始,

StackOverflow 文档

我们最终会在用户的屏幕上显示 50 像素×50 像素,包含在元素的背景中:

StackOverflow 文档

还可以使用百分比值来相对于元素缩放图像。以下示例将生成 200 px×133 px 绘制的图像:

#withbackground {
    background-image: url(to/some/background.png);

    background-size: 100% 66%;
    
    width: 200px;
    height: 200px;

    padding: 0;
    margin: 0;
}

StackOverflow 文档

行为取决于 background-origin

保持纵横比

previos 部分中的最后一个示例丢失了其原始宽高比。圆形成椭圆形,正方形变成矩形,三角形变成另一个三角形。

长度或百分比方法不够灵活,无法始终保持纵横比。auto 无济于事,因为你可能不知道元素的哪个维度会更大。但是,为了完全覆盖具有图像(和正确的宽高比)的某些区域或者在背景区域中完全包含具有正确宽高比的图像,值 containcover 提供附加功能。

用于 containcover 的 eggplanation

对不起的双关语感到抱歉,但我们将使用 Biswarup Ganguly 当天的照片进行演示。让我们说这是你的屏幕,灰色区域在你的可见屏幕之外。为了演示,我们将假设一个 16×9 的比例。

屏幕

我们想用上面提到的图片作为背景。但是,出于某种原因,我们将图像裁剪为 4x3。我们可以将 background-size 属性设置为固定长度,但我们将重点关注 containcover。请注意,我还假设我们没有破坏 body 的宽度和/或高度。

contain

contain

缩放图像,同时保持其固有的纵横比(如果有的话)到最大尺寸,使得其宽度和高度都可以适合背景定位区域。

这样可以确保背景图像始终完全包含在背景定位区域中,但是,在这种情况下,你的 background-color 可能会填充一些空白区域:

包含

cover

cover

缩放图像,同时保持其固有的纵横比(如果有的话)到最小尺寸,使得其宽度和高度都可以完全覆盖背景定位区域。

这可以确保背景图像覆盖所有内容。没有可见的 background-color,但是根据屏幕的比例,很大一部分图像可能会被切断:

覆盖

用实际代码演示

div > div {
  background-image: url(http://i.stack.imgur.com/r5CAq.jpg);
  background-repeat: no-repeat;
  background-position: center center;
  background-color: #ccc;
  border: 1px solid;
  width: 20em;
  height: 10em;
}
div.contain {
  background-size: contain;
}
div.cover {
  background-size: cover;
}
/********************************************
 Additional styles for the explanation boxes 
*********************************************/

div > div {
  margin: 0 1ex 1ex 0;
  float: left;
}
div + div {
  clear: both;
  border-top: 1px dashed silver;
  padding-top:1ex;
}
div > div::after {
  background-color: #000;
  color: #fefefe;
  margin: 1ex;
  padding: 1ex;
  opacity: 0.8;
  display: block;
  width: 10ex;
  font-size: 0.7em;
  content: attr(class);
}
<div>
  <div class="contain"></div>
  <p>Note the grey background. The image does not cover the whole region, but it's fully <em>contained</em>.
  </p>
</div>
<div>
  <div class="cover"></div>
  <p>Note the ducks/geese at the bottom of the image. Most of the water is cut, as well as a part of the sky. You don't see the complete image anymore, but neither do you see any background color; the image <em>covers</em> all of the <code>&lt;div&gt;</code>.</p>
</div>

StackOverflow 文档