65.9K
CodeProject 正在变化。 阅读更多。
Home

快速轻松的 HTML5 & CSS3 - 背景图片的新功能

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.88/5 (4投票s)

2011年6月14日

CPOL

8分钟阅读

viewsIcon

126156

来自“快速轻松的 HTML5 & CSS3”的章节摘录。

image002.jpg HTML5 & CSS3 快速入门

作者:Rob Crowther

在本篇文章《HTML5 & CSS3 快速入门》中,作者讨论了关于背景图像的四个新特性:尺寸调整;单个元素上的多重背景;相对于边框、内边距或内容的定位;以及根据边框、内边距或内容裁剪。Manning.com 为 Code Project 社区提供 40% 的折扣。在 manning.com 上使用促销代码 code40project,即可享受 MEAP、eBook 和 pBook 优惠 40%。所有 pBook 购买均包含免费的电子格式(PDF、ePub 和 Kindle),如果可用。

您可能还对以下内容感兴趣…

CSS3 为背景图像提供了四项新特性:尺寸调整;单个元素上的多重背景;相对于边框、内边距或内容的定位;以及根据边框、内边距或内容裁剪。  在本文中,您将了解这些新特性中的每一项。

浏览器快速检查
类型 标准版 已添加前缀
IE 9 -
Firefox 4.0 3.6
Chrome 7 5
Safari 5 3
Opera 10.5 10.1

背景尺寸

背景图像仅用于装饰,而 HTML 中的图像则有实际意义。然而,在标记中放置的图像具有某些实际优势,这可能会阻止 Web 作者做出正确的选择。

image003.gif 在标记中使用图像的一个优点是,可以轻松地使内联图像根据其容器的大小进行缩放;只需将图像的宽度设置为 100% 即可。但是,在 CSS2 中,无法使图像显示为除其固有尺寸以外的任何尺寸。以下示例显示了这个问题。

在此示例中,已将图像设置为标题的装饰性背景

h1 {
    background-image: 
      url('head-banner.png');
    background-repeat: no-repeat;
    padding-top: 1.85em;
}

顶部内边距已设置为允许背景图像的空间,图像本身的大小已设置为与标题的宽度匹配。

 

然而,如果标题发生任何变化,背景图像可能会显得有些不协调。如果我们将在“Columbia Internet”翻译成法语,突然间图像下面会有些文字凸出来,视觉关系也就丢失了。

新的 background-size 属性允许图像按比例拉伸以适应元素的尺寸

h1 {
    background-image: 
      url('head-banner.png');
    background-repeat: no-repeat;
    background-size: 100% 1.85em;
    padding-top: 1.85em;
    display: inline-block;
}

h1 被设置为内联块元素,因此其宽度会收缩以适应内容,然后背景图像被设置为固定高度和全宽度。您可以看到,随着元素宽度的增加,图像会变形。这种方法仅适用于允许预期元素宽度发生小幅变化的情况。

如果文本保持不变但显示不同的字体大小,则可以避免纵横比问题。如果您知道文本的宽度,只需按纵横比指定宽度和高度即可。

h1 {
    background-image: 
      url('head-banner.png');
    background-repeat: no-repeat;
    padding-top: 2.18em;
    display: inline-block;
    background-size: 11.1em 2.18em;
}
section:nth-of-type(1) h1 {
    font-size: 200%;
}
section:nth-of-type(2) h1 {
    font-size: 250%;
}
section:nth-of-type(3) h1 {
    font-size: 300%;
}

背景尺寸调整功能与矢量图形非常匹配。因为它们是矢量图,所以 SVG 图形无论您如何拉伸它们,都会保持平滑清晰,而位图图形会变得像素化和模糊。  下面是两个示例——一个使用位图 PNG 格式,另一个使用 SVG。

div {
    background-image: url('aj.png');
    background-repeat: no-repeat;
    background-size: 50% 100%;
    padding-left: 50%;
    display: inline-block;
}
div {
    background-image: url('aj.svg');
    background-repeat: no-repeat;
    background-size: 50% 100%;
    padding-left: 50%;
    display: inline-block;
}

虽然 SVG 非常适合背景尺寸调整,但对于照片类图像则不太适合。您可能希望在内容后面设置一张图片,类似于在计算机上设置桌面背景的效果。在这种情况下,图像的细节不太重要,因此失真问题也不是大问题。

此示例显示了主内容,其半透明背景叠加在设置为填充整个框的背景图像之上。这是标记

<section>
  <div>
    <p>In almost every...</p>
  </div>
</section>

下面列表显示了对此的 CSS。  与前面的示例不同,此示例使用了简写语法。大小与位置用斜杠分隔:top / 100%。

section {
    margin: 1em;
    padding: 5%;
    outline: 4px dashed black;
    background: url('10years.jpg') top / 100% no-repeat;
    display: inline-block;
    min-height: 342px;
    min-width: 300px;
}
div {
    background-color: rgba(255,255,255,0.66);
}

请注意,尽管有几款浏览器实现了 background-size,但只有 Opera 实现了简写语法。对于其他浏览器,您将不得不坚持使用单独的 background-size 声明。

尺寸调整并不是 CSS3 中添加的唯一新的背景特性;您还可以为单个元素附加多个背景。在上一个示例中,我们在标记中添加了一个元素,该元素的唯一作用是为文本添加背景。在下一节中,您将看到 CSS3 如何允许您在不使用额外标记的情况下进行样式设置。

多重背景

在 CSS2 中,每个元素只允许有一个背景图像,但有很多情况您可能需要多个图像

  • 标题可能有一个横跨页面宽度的背景图像以及一个公司徽标。
  • 装饰性的引语框可以在两侧带有开头和结尾的引号。
  • 斜边按钮或标签在两侧带有图像。
  • 创建粗糙边缘的纸卷效果需要一个在两侧重复的图像。

Web 作者经常使用 CSS 技巧来调整子元素以匹配其容器,以便其背景图像可以重叠(这被称为“滑动门”技术),但他们经常被迫引入额外的元素来支持样式设置,甚至在标记中添加纯装饰性的内联图像。

所有这些方法最终都会在页面中添加纯粹的演示标记,或者依赖于以特定方式组合的元素。虽然在这些孤立的情况下通常不是大问题,但它们表明演示语言 CSS 缺乏强大功能。您将在下面的示例中看到,CSS3 解决了这种功能不足的问题。
浏览器快速检查
  标准版 已添加前缀
IE 9 -
Firefox 3.6 -
Chrome 7 -
Safari 3 -
Opera 10.5 -

让我们重新审视上一节的最后一个示例,但这次没有额外的 div 元素来包装内容。

<section>
  <div>
    <p>In almost every...</p>
  </div>
</section>

尽管去掉了额外的元素,页面看起来仍然一样。这是因为该 section 元素应用了两个背景。

image013.gif
section {
    margin: 1em;
    padding: 5%;
    outline: 4px dashed black;
    background: url('trans-66.png') 50% 50% no-repeat,
                url('10years.jpg') no-repeat;
    background-size: 90% 90%, 
                     100%;
    display: inline-block;
}

添加多重背景图像只需将它们以及任何相关属性,用逗号分隔写在 background 属性中即可。

background: top right
  url('pitr-head.png') no-repeat,
 bottom right
  url('aj-head.png') no-repeat,
 top left
  url('mike-head.png') no-repeat,
 bottom left
  url('sid-head.png') no-repeat;
image014.gif

所有其他背景属性也允许使用逗号分隔的列表,因此您也可以这样写:

background-image:
 url('pitr-head.png'), url('pitr-head.png'),
 url('mike-head.png'), url('sid-head.png');
background-position:
 top right, bottom right,
 top left, bottom left;
background-repeat: 
 no-repeat, no-repeat,
 no-repeat, no-repeat;
 

您首先列出的背景图像将最靠近查看者。如果您将它们都放在同一个位置,您会看到第一张图像覆盖了其余图像。

background: center
  url('pitr-head.png') no-repeat,
 center
  url('aj-head.png') no-repeat,
 center
  url('mike-head.png') no-repeat,
 center
  url('sid-head.png') no-repeat;

您可以利用这一点来创造一些有趣的效果。在这里,我们在每张其他背景图像之间使用一张半透明的 PNG 图像来创建渐进式渐变。

background: top right
  url('pitr-head.png') no-repeat,
 url('half-white.png'),
 bottom right
  url('aj-head.png') no-repeat,
 url('half-white.png'),
 top left
  url('mike-head.png') no-repeat,
 url('half-white.png'),
 bottom left
  url('sid-head.png') no-repeat;

背景起源和裁剪

CSS2 无法控制背景应用于元素的哪个部分。由于 CSS2 不允许背景尺寸调整,大多数作者可能没有遇到这种限制,但 CSS3 引入了两个新属性,为 Web 作者提供了精细控制:background-origin 和 background-clip。

下一节需要理解 CSS 盒子模型才能充分利用。

background-origin 的默认值为  padding-box。这意味着背景应用于包含内边距的区域,但不应用于包含边框的区域。

section {
    margin: 1em;
    padding: 1em;
    border: 1em dashed black;
    background-origin: padding-box;
}

此示例图像已缩放到填充其容器,并且设置为不重复。

将 origin 设置为 border-box 意味着背景将延伸到边框下方。

section {
    margin: 1em;
    padding: 1em;
    border: 1em dashed black;
    background-origin: border-box;
}

最后,content-box 将背景限制在内容区域内部,即内边距之内。

section {
    margin: 1em;
    padding: 1em;
    border: 1em dashed black;
    background-origin: content-box;
}

background-clip 的默认值为 border-box。

section {
    margin: 1em;
    padding: 1em;
    border: 1em dashed black;
    background-clip: border-box;
}

请记住,我们的示例已缩放并设置为不重复。

当应用于不重复的背景时,由于 background-origin 的默认值,这与 padding-box 无法区分。

section {
    margin: 1em;
    padding: 1em;
    border: 1em dashed black;
    background-clip: padding-box;
}

然而,如果允许背景重复,则区别会显现出来。padding-box 的设置仍然会在边框内裁剪图像,但对于 border-box,我们可以看到边框下方的重复图像。

section {
    background-clip: border-box;
    background-repeat: repeat;
}

最后,content-box 会将背景裁剪到内容区域。

section {
    margin: 1em;
    padding: 1em;
    border: 1em dashed black;
    background-clip: content-box;
}

请注意,即使背景被裁剪,图像仍然按照 padding-box 的尺寸进行缩放。

统一缩放背景可能并不总能产生您想要的效果。虽然“滑动门”技术为此提供了一种解决方法,但 CSS3 提供了一种更直接的方法来实现相同的效果:border-image。

摘要

CSS3 中用于边框和背景的这些特性使您能够

  • 通过文本和框的阴影添加视觉深度。
  • 通过边框图像创建引人注目的效果。
  • 通过圆角使事物更加圆润。
  • 通过多重背景使您的生活更轻松。
  • 通过渐变来美化您的设计。

这些特性中的大多数都为 Web 作者提供了一种实现常用效果的方法,而使用 CSS2,这些效果必须在图形包中创建为图像,或者需要 JavaScript 技巧和额外的 HTML 标记。我们向您展示了使用 CSS3 管理背景的一些新可能性,包括尺寸调整、多重背景、定位和裁剪。

您可能还会对以下 Manning 图书感兴趣:

image024.jpg

Python 快速入门(第二版)
Vernon L. Ceder

 

image025.jpg

Liferay 实战
Richard Sezov, Jr.

image026.jpg

Sass 和 Compass 实战
作者:Wynn Netherland、Nathan Weizenbaum 和 Chris Eppstein

 

© . All rights reserved.