CSS 图像模块 3 级

W3C 候选推荐草案,

关于本文件的更多信息
此版本:
https://www.w3.org/TR/2023/CRD-css-images-3-20231218/
最新发布版本:
https://www.w3.org/TR/css-images-3/
编辑草案:
https://drafts.csswg.org/css-images-3/
以往版本:
历史记录:
https://www.w3.org/standards/history/css-images-3/
实现报告:
https://wpt.fyi/results/css/css-images?label=experimental&label=master&aligned
反馈:
CSSWG 问题库
规范内反馈
编辑者:
Tab Atkins Jr. (Google)
Elika J. Etemad / fantasai (Apple)
Lea Verou (特邀专家)
建议为本规范编辑:
GitHub 编辑器

摘要

本模块包含 CSS 3 级中与 <image> 类型及部分替换元素相关的特性。 它包含并扩展了 CSS 2 级 [CSS2] 的功能。 相较于 CSS2.1,主要扩展包括将 <url> 类型泛化为 <image> 类型, 对 <image> 类型的若干补充,为图片及其他替换内容定义了通用尺寸算法, 给若干 <image> 类型的插值定义, 以及多个控制替换元素与 CSS 布局模型交互的属性。

CSS 是一种用于描述结构化文档(如 HTML 和 XML)在屏幕、纸张等上的呈现方式的语言。

本文件状态

本节描述了本文件在发布时的状态。 当前 W3C 发布文档列表 及本技术报告的最新修订版 可在 W3C 技术报告索引 https://www.w3.org/TR/ 查阅。

本文档由 CSS 工作组 作为候选推荐草案,按照 推荐进程 发布。 作为候选推荐发布 并不代表 W3C 及其成员对此的认可。 候选推荐草案 融合了工作组意图纳入后续候选推荐快照的上一版候选推荐中的更改。

本文档为草稿 可能随时被更新、替换 或被其他文档取代。 除非作为开发中工作,否则不应引用本文件。

欢迎通过在 GitHub 提交问题(推荐)反馈, 标题中请包含规范代码“css-images”,如: “[css-images] …评论摘要…”。 所有问题及评论均会被 存档。 或者,也可发送至(归档)公共邮件列表 www-style@w3.org

本文件受 2023年11月3日 W3C 流程文档 管辖。

本文件由遵循 W3C 专利政策 的工作组制定。 W3C 维护着一份与本工作组成果相关的专利披露公开列表; 该页面也包含披露专利的指引。 若个人知悉某专利并认为该专利包含必要声明,则必须依据 W3C 专利政策第6节 披露信息。

以下特性存在风险,可能在 CR 阶段被移除:

“存在风险”是 W3C 流程中的术语,并不必然意味着该特性有被移除或延迟的危险。它表示工作组认为该特性在可互操作实现方面可能有一定难度,此标记允许工作组在转向提议推荐阶段时如有必要可以去除该特性,而无需先发布一版去除该特性的候选推荐。

1. 介绍

在 CSS 1 和 2 级中, 图像值(如 background-image 属性中使用的图像值), 只能通过单一的 URL 值指定。 本模块引入了更多表示二维图像的方法, 例如作为渐变的形式。

本模块还定义了若干用于操作光栅图像的属性, 以及用于尺寸调整定位 替换元素(如图片)在由 CSS 布局算法决定的盒子内的属性。 还以通用方式定义了 CSS 的图片及其他类似替换元素的尺寸算法

本小节(上文)不具规范性。

1.1. 模块交互

本模块定义并扩展了 <image> 值类型, 该类型定义于 [CSS-VALUES-3]。 同时还在 CSS1 和 CSS2 中的 background-imagecursorlist-style-image 定义中, 用 <image> 替换了 <url> 类型, 并在 content 属性值中,将 <image> 作为 <url> 的可选替代项添加进来。 预计 CSS2.1 以后的 CSS 规范将使用 <image> 记法替代 <url>,以用于二维图像的场景。 (参见如 [CSS3BG]。)

本模块定义的属性中,只有 image-rendering 可应用于 ::first-line::first-letter

1.2. 值定义

本规范遵循 CSS 属性定义约定 (见[CSS2]), 并采用 值定义语法(见 [CSS-VALUES-3])。 未在本规范中定义的值类型,在 CSS Level 2 Revision 1 [CSS2] 中定义。 其它 CSS 模块也可能扩展这些值类型的定义: 例如当与本模块结合使用时,[CSS-VALUES-3] 增加了 initial 关键字作为可用属性值。

除定义中特有的属性值外, 本规范定义的所有属性 也都接受 CSS 全局关键字 作为属性值。 为了可读性,这些关键字未被重复列出。

2. 图像值:<image> 类型

<image> 值类型表示二维图像。 它可以是url 引用颜色渐变。 其语法为:

<image> = <url> | <gradient>

<image> 可用于许多 CSS 属性, 包括 background-imagelist-style-imagecursor 属性 [CSS2](在这些属性值中替换了 <url> 组件)。

在某些情况下,图像是无效的, 例如 <url> 指向的资源不是有效的图像格式 或加载失败时。 无效图像 渲染为 无 自然尺寸 的纯色透明图片。 但无效图像 在某些上下文下可触发错误处理条款。 例如,在 list-style-image 属性中,无效图像 被视为 none, 从而允许 list-style-type 渲染其内容。[CSS2]

图片加载过程中, 被称为 加载中图像加载中图像 不是 无效图像, 但表现类似: 它们会被渲染为无 自然尺寸 的纯色透明图片, 并可在支持降级渲染的场景下触发降级渲染, 但不得触发降级资源的加载。 另外,如果某个 加载中图像 恰好替换了已加载的图片 (如文档或样式表发生更改导致), 且 UA 跟踪了该信息, 则可继续显示原已加载的图片, 而不是新的 加载中图像

部分加载的图片(其 自然尺寸 已知,但图像数据未完全加载) 可被视为 加载中图像 或作为已加载但数据不全的图片渲染。 例如 UA 可在首批像素数据加载完成后,即时渲染交错 GIF, 或在解析完图像头(包含尺寸数据)后立即渲染, 并随更多数据加载刷新渲染; 也可等图片完全加载后再使用。

计算后 <image> 值 是将 指定值 中的所有 <url><color><length> 计算后的结果。

2.1. 图片引用:url() 语法

最简单的图片指定方式是通过 URL 引用图片文件。 这可通过 url() 语法实现, 其定义见 [CSS-VALUES-3]

下例中,背景图片通过 url() 语法指定:
background-image: url(wavy.png);

如果 UA 无法下载、解析或以其他方式成功显示 URL 所指内容为图片 (即图片未能完全解码), 则必须将其视为 无效图像

2.1.1. 二义性引用或图片 URL

URL 在许多场景下用于多种类型资源, 因此可有多种解释方式。 通常 URL 所在上下文 可以明确资源的解释方式, 但在某些情况下 可能存在歧义。 例如, mask-image 属性的 <url> 值如果指向 SVG 文件, 既可解释为文件中某元素的引用, 也可解释为 <image>

二义性图片 URL 指 可被解释为 <url> 类型的值, 既可作为 <image>,也可作为元素引用。 若二义性图片 URL仅片段的 URL, 则必须视为元素引用。 否则,若 二义性图片 URL 的片段引用到资源中适用于当前上下文的元素 (如 mask 元素对应 mask-image 属性), 则解释为元素引用。 否则,解释为 <image>

使用 二义性图片 URL 概念的规范 必须明确 URL 有效引用的元素类型, 及其它适用条件。

例如, mask-image: url(icon.svg#foo) 这样的引用可能指向 SVG 文档中的 <mask id="foo"> 元素,也可能指向 <g id="foo"> 元素, 并根据 :target 伪类改变其作为图片的渲染方式。

此情况下, “icon.svg” 文件将被加载和检查; 若 #foo 元素确为 maskurl() 被视为对该元素的引用; 否则, 按图片解释。

2.1.2. 图片元数据

图片可包含元数据, 如分辨率和方向, 用于指定图片的渲染方式。 某些图片格式允许灵活设置元数据在文件中的位置; 但若元数据出现在实际图像数据之后, 则会影响 UA “渐进解码”图片并在数据流入时显示的能力。

为减少上述影响:

3. 渐变

渐变是一种颜色平滑过渡的图像。 常用于背景图片、按钮等的柔和阴影。 本节描述的 渐变函数 允许作者用简洁语法指定这类图像, 由 UA 渲染页面时自动生成图片。 <gradient> 的语法如下:

<gradient> =
  <linear-gradient()> | <repeating-linear-gradient()> |
  <radial-gradient()> | <repeating-radial-gradient()>

与本规范定义的其它 <image> 类型一样, 渐变可用于任何接受图片的属性。 例如:

渐变绘制在 具体对象尺寸 的盒子内, 称为 渐变盒。 但渐变本身没有 自然尺寸

例如, 当渐变作为背景图片使用时, 默认情况下,渐变会在元素的 padding box 尺寸的 渐变盒 内绘制。 若 background-size 被显式设为 100px 200px, 则 渐变盒 尺寸为 100px × 200px。 同样,若渐变用于 list-style-image, 盒子为 1em 的正方形, 即该属性的 默认对象尺寸

渐变通过定义 起点终点 以及 渐变线(根据渐变类型,可为直线、射线或螺线), 并在该线上指定颜色来实现。 颜色在该线上平滑混合填充, 各类型渐变还定义了如何根据 渐变线 的颜色生成实际渐变图像。

3.1. 线性渐变:linear-gradient() 语法

线性渐变通过指定一条直 渐变线, 并在该线上放置若干颜色来创建。 生成图像时,会构造一张无限画布, 在画布上绘制与渐变线垂直的线条, 每条线的颜色取自它与渐变线的交点的颜色。 这样就能实现从一种颜色平滑过渡到下一种颜色, 并按指定方向渐变。

3.1.1. linear-gradient() 语法

linear-gradient() 语法 用于在 CSS 中指定线性渐变。 其语法如下:

<linear-gradient()> = linear-gradient( [ <linear-gradient-syntax> ] )

<linear-gradient-syntax> = [ <angle> | to <side-or-corner> ]? , <color-stop-list>

<side-or-corner> = [left | right] || [top | bottom]

该函数的第一个参数指定 渐变线, 用于确定渐变方向及色标的位置。 该参数可省略; 若省略,则默认值为 to bottom

渐变线 的方向可通过两种方式指定:

使用 <angle>

对于该参数,0deg 表示向上, 正角度为顺时针旋转, 90deg 则指向右侧。

<angle> 为零,则可省略单位标识符。

使用关键字

若参数为 to topto rightto bottomto left, 则 渐变线 的角度分别为 0deg90deg180deg270deg

若参数指定盒子的角落(如 to top left), 渐变线 需朝该角落所在象限倾斜, 并垂直于穿过 渐变盒 相邻两个角的直线。这样,50% 的色标正好与这两个相邻角相交(见 示例)。

渐变盒 的中心出发, 沿指定角度向两侧延展一条直线。 终点为 渐变线 上与垂直于 渐变线 的直线在指定方向与 渐变盒 角落的交点。 起点则以相反方向同理确定。

注: 预计本模块的下一版本将允许根据当前文本方向及 writing-mode 定义渐变方向。

[一个图片,显示一个盒子的背景从左下角白色渐变到右上角黑色。图中有一条线,表示渐变线,以45度穿过盒子中心,起点和终点为渐变线与通过盒子左下和右上角的两条直线的交点。]

该示例形象展示了如何根据上述规则计算 渐变线。 图中标识了 渐变线 的起点和终点, 以及实际的渐变, 由 background: linear-gradient(45deg, white, black); 的元素生成。

注意,虽然起点和终点都在盒子外部, 但它们正好使渐变在对应角落完全为纯白和纯黑。 这正是有意为之,并且对线性渐变始终成立。

设:

渐变线(起点终点)的长度为:

abs(W * sin(A)) + abs(H * cos(A))

渐变的色标通常放于 起点终点之间的 渐变线上, 但并不强制: 渐变线 是无限延展的。 起点和终点仅作为定位参考, 起点对应色标 0%、0px 等位置, 终点对应 100% 的位置。 色标允许出现在 0% 之前或 100% 之后。

线性渐变在任意点的颜色, 由穿过该点且垂直于 渐变线 的唯一直线确定。 该点的颜色即为该直线与 渐变线 的交点处的颜色。

3.1.2. 线性渐变示例

以下所有 linear-gradient() 示例都假定应用于一个宽 200px、高 100px 的盒子的背景。

下面是多种指定基本垂直渐变的方法:
linear-gradient(yellow, blue);
linear-gradient(to bottom, yellow, blue);
linear-gradient(180deg, yellow, blue);
linear-gradient(to top, blue, yellow);
linear-gradient(to bottom, yellow 0%, blue 100%);

此示例展示了渐变中角度的用法。 注意,虽然角度不完全等同于角落之间的连线角度, 但 渐变线 仍然被调整,使渐变在左上角正好为黄色, 在右下角正好为蓝色。
linear-gradient(135deg, yellow, blue);
linear-gradient(-45deg, blue, yellow);

此示例展示了三色渐变,以及如何显式指定色标的位置:

linear-gradient(yellow, blue 20%, #0f0);

此示例展示了使用关键字指定的角到角的渐变。 注意渐变在左下角和右上角分别正好为红色和蓝色,与第二个示例完全一致。 另外,渐变的角度会自动计算,使 50% 位置的颜色(此处为白色)横跨左上角和右下角。
linear-gradient(to top right, red, white, blue)
(图片需要 SVG 支持)

3.2. 径向渐变:radial-gradient() 语法

在径向渐变中, 颜色不是像线性渐变那样从盒子的某一侧平滑过渡到另一侧, 而是从一个点开始, 以圆形或椭圆形状向外平滑扩散。

radial-gradient() 语法用于指定径向渐变, 通过指明渐变的中心 (即 0% 椭圆的位置), 以及 终止形状(即 100% 椭圆)的大小和形状。 色标以列表方式给出, 与 linear-gradient() 一样。 从 渐变中心出发,向 终止形状(以及可能超出终止形状)方向, 绘制并着色一组按比例缩放的同心椭圆, 按照指定色标渲染。

3.2.1. radial-gradient() 语法

径向渐变的语法为:

<radial-gradient()> = radial-gradient( [ <radial-gradient-syntax> ] )

<radial-gradient-syntax> =
  [ <radial-shape> || <radial-size> ]? [ at <position> ]? ,
  <color-stop-list>

<radial-size> = <radial-extent> | <length [0,∞]> | <length-percentage [0,∞]>{2}

<radial-extent> = closest-corner | closest-side | farthest-corner | farthest-side

<radial-shape> = circle | ellipse
下面是一个宽 5em、中心位于左上角的圆形径向渐变示例:
radial-gradient(5em circle at top left, yellow, blue)

注: 未来的版本可能会增加移动渐变焦点的能力, 如原始 -webkit-gradient() 函数。 参见 提案,跟踪于 Issue 1575,涉及 "from position" 和 "from offset <offset>" 的语法。

各参数定义如下:

<position>
决定渐变的 中心<position> 值类型 (也用于 background-position), 定义于 [CSS-VALUES-3], 并以中心点为对象区域, 渐变盒为定位区域进行解析。 若省略此参数, 默认为 center
<radial-shape>
可为 circleellipse; 分别决定渐变的 终止形状为圆形或椭圆。 若省略 <radial-shape>, 当 <radial-size> 为单一 <length> 时终止形状默认为圆,否则为椭圆。
<radial-size>
决定渐变的 终止形状的尺寸。 若省略,默认为 farthest-corner。 可通过关键字或显式数值指定。 在关键字定义中, 视 渐变盒边界为无限延伸的直线, 而不是有限线段。

若终止形状为椭圆, 其主轴与水平和垂直方向对齐。

circleellipse 渐变均接受以下 <radial-extent> 值:

closest-side
终止形状尺寸使其正好与距离渐变中心最近的 渐变盒边相切。 若为椭圆,则在各维度上分别与最近的边相切。
farthest-side
closest-side 类似, 但 终止形状尺寸基于最远的边。
closest-corner
终止形状尺寸使其通过距离渐变中心最近的 渐变盒角。 若为椭圆, 终止形状采用与指定 closest-side 时相同的宽高比。
farthest-corner
closest-corner 类似, 但 终止形状尺寸基于最远的角。 若为椭圆, 终止形状采用与指定 farthest-side 时相同的宽高比。

radial-shape 指定为 circle 或省略时, radial-size 可显式指定为:

<length [0,∞]>
显式给出圆的半径。 负值无效。

注: 此处不允许百分比; 仅可用于指定椭圆渐变的尺寸,不能用于圆形渐变。 这是因为百分比参照哪一维有多种合理解释。 未来可能允许用百分比指定圆的尺寸,并能更明确控制参考维度。

radial-shape 指定为 ellipse 或省略时,radial-size 可显式指定为:

<length-percentage [0,∞]>{2}
显式给出椭圆的尺寸。 第一个值为水平半径, 第二个值为垂直半径。 百分比值相对于 渐变盒的对应维度。 负值无效。
按上面定义展开后,语法为:
radial-gradient() = radial-gradient(
  [ [ circle               || <length [0,∞]> ]                          [ at <position> ]? , |
    [ ellipse              || <length-percentage [0,∞]>{2} ]            [ at <position> ]? , |
    [ [ circle | ellipse ] || <radial-extent> ]                     [ at <position> ]? , |
    at <position> ,
  ]?
  <color-stop-list>
)

3.2.2. 色标定位

色标放置在类似射线(从一点出发、向一个方向无限延伸)的 渐变线上, 类似于线性渐变的 渐变线渐变线起点在渐变中心, 并向右延伸, 终点渐变线终止形状的交点。 色标可放在 0% 之前的位置; 虽然 渐变线的负区间不会直接用于渲染, 但放在那里的色标可通过插值或重复影响非负区间的颜色 (参见重复渐变)。 例如 radial-gradient(red -50px, yellow 100px) 会生成一个椭圆渐变, 中心起始为红橙色(实际为 #f50),渐变到黄色。 超过 100% 的位置表示距离中心更远的位置。

任意点的渐变颜色, 先找到通过该点的唯一椭圆, 且该椭圆中心、方向及主/次轴比与终止形状一致。 然后该点颜色取为该椭圆与 渐变线正向部分交点处的颜色。

3.2.3. 退化径向渐变

某些位置、尺寸和形状组合 会导致圆或椭圆半径为 0。 例如, 如果中心位于 渐变盒边缘并指定 closest-sideclosest-corner, 或显式指定尺寸且某半径为零。 在这些退化情况下, 渐变必须按如下方式渲染:

终止形状 是半径为 0 的圆:

终止形状为极小但大于 0 的圆渲染。这样渐变视觉上仍像圆形。

终止形状 宽度为 0(不论高度如何):

终止形状为极大高度、极小但大于 0 的宽度的椭圆渲染。这样渐变视觉上类似于以中心为轴对称的水平线性渐变。 此时所有百分比色标都解析为 0px

否则,如 终止形状高度为 0:

终止形状为极大宽度、极小但大于 0 的高度的椭圆渲染。这样渐变视觉上为纯色图片, 其颜色为最后一个色标的颜色, 或为重复情况下的平均色。

3.2.4. 径向渐变示例

以下所有示例都应用于宽 200px、高 100px 的盒子。

这些示例展示了径向渐变基础语法的不同写法:
radial-gradient(yellow, green);
radial-gradient(ellipse at center, yellow 0%, green 100%);
radial-gradient(farthest-corner at 50% 50%, yellow, green);

radial-gradient(circle, yellow, green);

radial-gradient(red, yellow, green);

此图展示了渐变起点不在盒子中心的效果:
radial-gradient(farthest-side at left bottom, red, yellow 50px, green);

此处展示了 closest-side 渐变。
radial-gradient(closest-side at 20px 30px, red, yellow, green);
radial-gradient(20px 30px at 20px 30px, red, yellow, green);

radial-gradient(closest-side circle at 20px 30px, red, yellow, green);
radial-gradient(20px 20px at 20px 30px, red, yellow, green);

3.3. 重复渐变:repeating-linear-gradient()repeating-radial-gradient() 语法

除了 linear-gradient()radial-gradient(), 本规范还定义了 repeating-linear-gradient()repeating-radial-gradient()。 这些语法的参数和解释与前述非重复渐变完全相同。

<repeating-linear-gradient()> = repeating-linear-gradient( [ <linear-gradient-syntax> ] )
<repeating-radial-gradient()> = repeating-radial-gradient( [ <radial-gradient-syntax> ] )

但在渲染时,色标会以首尾色标距离为周期,在两个方向无限重复。 例如:repeating-linear-gradient(red 10px, blue 50px) 等价于 linear-gradient(..., red -30px, blue 10px, red 10px, blue 50px, red 50px, blue 90px, ...)。 注意,每组首尾色标总是在边界重合, 如果渐变首尾颜色不同会产生明显的跳变。

重复渐变的语法与普通渐变完全一致:
repeating-linear-gradient(red, blue 20px, red 40px)

repeating-radial-gradient(red, blue 20px, red 40px)

repeating-radial-gradient(circle closest-side at 20px 30px, red, yellow, green 100%, yellow 150%, red 200%)

如果首尾色标距离非零, 但足够小以致实现知道输出设备物理分辨率不足以忠实渲染渐变, 则实现必须 取渐变的平均色,并以该平均色渲染为纯色图像。

如果首尾色标距离为零 (或因实现限制四舍五入为零), 实现必须以色标数量和颜色一致、但首尾色标间距为任意非零值且其余色标均匀分布的渐变 取平均色,并以该平均色渲染为纯色图像。

如果重复径向渐变的终止形状宽度非零、高度为零, 或者高度足够小以致实现知道输出设备物理分辨率不足以忠实渲染渐变, 实现必须 取渐变的平均色,并以该平均色渲染为纯色图像。

注: 退化径向渐变一节 描述了终止形状宽度为零时的调整方式。

取渐变的平均色, 按以下步骤:

  1. 定义 list 为一个初始为空的预乘 RGBA 颜色列表, total-length 为首尾色标距离。

  2. 对每对相邻色标, weight 定义为两色标间距一半再除以 total-length。 向 list 加入两项, 第一项为将第一个色标颜色转为预乘 sRGBA 并乘以 weight, 第二项同理为第二个色标。

  3. list 所有项按分量相加,即为平均色并返回。

注: 一如既往,实现可任选算法, 只要结果与上述一致即可。

例如,下述渐变渲染为纯淡紫色图像(即 rgb(75%,50%,75%)):
repeating-linear-gradient(red 0px, white 0px, blue 0px);

下述渐变在通常情况下渲染效果与上例相同 (因为桌面显示器无法忠实渲染 1/10 像素的色标), 但若作者对元素应用 "zoom:100;" 等,则会渲染为正常的重复渐变:

repeating-linear-gradient(red 0px, white .1px, blue .2px);

3.4. 定义渐变颜色

渐变中的颜色通过色标(一个 <color> 及其在渐变线上的对应位置) 和颜色过渡提示(在两个色标之间,表示颜色过渡中点的位置) 指定,二者都放在 渐变线 上, 共同定义该线上每一点的颜色。 (每个渐变函数定义了 渐变线 的形状和长度, 以及其起点终点;见上文。)

渐变区域中的颜色通过与 渐变线上的特定点关联确定, 这些点由渐变函数指定。 UA 可以对渐变颜色进行轻微“抖动” (将单个像素随机替换为渐变线附近的其它颜色) 以实现更平滑的渐变。

3.4.1. 色标列表

色标过渡提示色标列表中指定, 即由两个或更多色标与可选的 过渡提示交错排列而成的列表:

<color-stop-list> =
  <linear-color-stop> , [ <linear-color-hint>? , <linear-color-stop> ]#
<linear-color-stop> = <color> <length-percentage>?
<linear-color-hint> = <length-percentage>

百分比值以 渐变线的长度为基准, 从起点终点, 0% 位于起点, 100% 位于终点。 长度值从渐变线起点出发,沿终点方向测量。

色标过渡提示的位置 通常放在 起点终点之间, 但不是强制的: 渐变线向两侧无限延展, 可以在渐变线上的任意位置指定。

色标的位置被省略时, 会自动分配一个位置。 色标列表中的第一个和最后一个色标, 分别分配到渐变线起点终点。 其他未指定位置的色标, 会被分配到两侧已定位色标的中点。 若有多个连续未指定位置的色标, 它们会在两侧已定位色标之间平均分布。 详情见 § 3.4.3 色标“修正”

3.4.2. 渐变线着色

在每个色标位置, 渐变线采用该色标的颜色。 在第一个色标之前, 渐变线采用第一个色标的颜色; 在最后一个色标之后, 渐变线采用最后一个色标的颜色。 在两个色标之间, 渐变线的颜色在两色标之间做插值, 插值空间为预乘 RGBA 空间

默认情况下, 该插值为线性——即在两个色标间 25%、50%、75% 距离处, 颜色分别为两色标颜色的 25%、50%、75% 混合。

但如果在两个色标间指定了过渡提示, 则插值为非线性,由提示控制:

  1. 计算过渡提示在两色标间的百分比位置, 记为 0 到 1 之间的数, 0 表示提示正好在第一个色标处, 1 表示提示正好在第二个色标处。 设该百分比为 H
  2. 对于两色标间任意一点, 计算该点在两色标间的百分比位置, 方法同上。 设该百分比为 P
  3. 设该点颜色权重 C,为 PlogH(.5)
  4. 该点颜色为两色标颜色的线性混合, 混合比例为 (1 - C)(第一个色标)与 C(第二个色标)。

注: 过渡提示指定“中间色”(两色标间 50% 混合色)的位置。 当提示正好在两色标中点时, 上述插值算法结果与线性插值一致。 若提示在其他位置, 则会产生平滑的指数曲线, 且“中间色”恰好出现在提示指定处。

需要补充一个使用颜色提示的视觉示例。

如果多个色标位置相同, 则会产生从列表中靠前到靠后色标的瞬时跳变。 实际效果是在该位置颜色瞬间变化,而非平滑过渡。

“预乘”是什么意思?

“预乘”颜色 的写法是将 alpha 通道与颜色通道相乘, 而不是分别处理。 例如,半透明蓝色可写作 rgba(0, 0, 255, .5), 其预乘表示为 [0, 0, 127.5, .5]

用预乘表示插值 比直接用 rgba 插值 更美观, 尤其是在全不透明到全透明之间过渡时。

注意,如果颜色或透明度保持不变 (如在 rgba(255, 0, 0, 100%) (不透明红) 到 rgba(0,0,255,100%) (不透明蓝), 或 rgba(255,0,0,100%) (不透明红) 到 rgba(255,0,0,0%) (透明红)之间过渡), 用预乘和非预乘插值结果完全一致。 只有当两端点的颜色和透明度不同才会有区别。

下例展示了 在预乘 sRGBA 和非预乘空间下渐变过渡的区别。 两个例子都绘制在白色背景上。 渐变都可写作如下值:
linear-gradient(90deg, red, transparent, blue)

用预乘颜色时, 与“transparent”过渡始终很自然:

(图片需要 SVG 支持)

相反, 如果渐变错误地在非预乘空间过渡, 则渐变中心会有明显的灰色, 因为“transparent”实际上是 rgba(0,0,0,0)(透明黑), 意味着红色透明后会向黑色过渡, 蓝色同理:

(图片需要 SVG 支持)

3.4.3. 色标“修正”

在解析每个使用值色标位置时, 必须按顺序执行以下步骤:

  1. 如果第一个色标没有位置, 设为 0%。 如果最后一个色标没有位置, 设为 100%。
  2. 如果某个色标过渡提示的位置 小于列表中前面任何色标过渡提示的已指定位置, 则将其位置设为前面所有色标过渡提示的最大位置。
  3. 如果仍有色标没有位置, 则对于每组连续未指定位置的色标, 将它们均匀分布在前后已定位色标之间。

应用完这些规则后, 所有色标过渡提示都将有明确的位置与颜色, 且它们按位置递增排列。

注: 建议作者在混用不同单位(如 px、em、%)时谨慎, 否则可能导致色标意外移到前一个色标之前。 例如, 规则 background-image: linear-gradient(yellow 100px, blue 50%) 当背景区域至少 200px 高时不会触发修正。 如果高度为 150px, 蓝色色标位置等价于 75px, 会比黄色色标更靠前, 此时位置会被修正为 100px。 此外,由于这类色标的相对顺序需要布局后才能确定, 它们不会在动画过渡中平滑插值。

下面是几组渐变示例。 每组后一行为手动“修正”后的版本, 按上述规则处理所得。 每组的两个渐变视觉效果完全一致。箭头上的数字表示修正步骤。
1. linear-gradient(red, white 20%, blue)
   =1=>
   linear-gradient(red 0%, white 20%, blue 100%)

2. linear-gradient(red 40%, white, black, blue)
   =1,3=>
   linear-gradient(red 40%, white 60%, black 80%, blue 100%)

3. linear-gradient(red -50%, white, blue)
   =1,3=>
   linear-gradient(red -50%, white 25%, blue 100%)

4. linear-gradient(red -50px, white, blue)
   =1,3=>
   linear-gradient(red -50px, white calc(-25px + 50%), blue 100%)

5. linear-gradient(red 20px, white 0px, blue 40px)
   =2=>
   linear-gradient(red 20px, white 20px, blue 40px)

6. linear-gradient(red, white -50%, black 150%, blue)
   =1,2=>
   linear-gradient(red 0%, white 0%, black 150%, blue 150%)

7. linear-gradient(red 80px, white 0px, black, blue 100px)
   =2,3=>
   linear-gradient(red 80px, white 80px, black 90px, blue 100px)

4. CSS 中图片与对象的尺寸

CSS 中使用的图片可以来自多种来源: 二进制图片格式(如 gif、jpeg 等), 专用标记格式(如 SVG), 以及 CSS 特有格式(如本规范定义的 linear-gradient() 值类型)。 此外,文档还可以包含许多其他类型的对象, 比如视频、插件或嵌套文档。 这些图片和对象 (下文统称为 对象) 可能为 CSS 提供多种尺寸信息,也可能完全没有。 本节泛化定义对象与 CSS 布局算法之间的尺寸协商模型。

4.1. 对象尺寸术语

为定义此处理方式, 我们先定义一些术语, 以便更方便地引用相关概念:

自然尺寸
自然尺寸 指的是 自然高度自然宽度自然宽高比(宽度与高度的比值)的集合, 这三者每一个对于某个对象来说可能存在也可能不存在。 这些自然尺寸表示对象本身固有的首选大小; 即,它们不取决于对象所处环境。 CSS 不规定一般如何获取自然尺寸。

光栅图片是拥有全部三种自然尺寸的对象的例子。 设计为可缩放的 SVG 图片可能只有自然宽高比; SVG 图片也可以只定义自然宽度高度。 本规范定义的 CSS 渐变,是没有自然尺寸的对象的例子。 另一个例子是嵌入文档, 如 HTML 的 iframe 元素。 许多 对象,如大多数图片, 不可能只拥有两项 自然尺寸, 因为任意两项自动决定第三项。 但某些替换元素类型, 如表单控件, 可以有 自然宽度自然高度, 但没有 自然宽高比

如果 对象宽高比退化(即至少一项为零或无穷大), 则视为没有 自然宽高比

如果 对象(如图标)有多个尺寸, 则最大面积的尺寸作为其 自然尺寸。 若该尺寸有多个宽高比, 或没有尺寸但有多个宽高比, 则选择与默认对象尺寸最接近的宽高比。 判断方法为:看哪个宽高比在用 默认对象尺寸contain 约束适配时面积最大; 若有多个面积最大,则选择最宽的作为 自然尺寸

自然宽度自然高度合称为 自然大小

指定尺寸
对象的指定尺寸由 CSS 给出, 比如通过 widthheightbackground-size 属性。 指定尺寸可以是确定的宽度和高度、 一组约束、 或两者组合。
具体对象尺寸
具体对象尺寸是 将 对象自然尺寸指定尺寸 及其所处环境的 默认对象尺寸 结合计算, 得到一个具有绝对宽高的矩形。
默认对象尺寸
默认对象尺寸是一个具有绝对宽高的矩形, 用于在 自然尺寸指定尺寸 都缺某个尺寸时,确定 具体对象尺寸

4.2. CSS⇋对象协商

CSS 中的对象通过 对象尺寸协商 算法进行尺寸和渲染,流程如下:

  1. 当文档中指定一个对象时, 比如在 background-image 属性中使用 url(), 或在 src 属性指定于 img 元素, CSS 会向对象查询其 自然尺寸

  2. 使用 自然尺寸指定尺寸 和对象所处环境的 默认对象尺寸, CSS 计算出 具体对象尺寸。 (见下一节。) 这决定了 对象渲染区域的尺寸与位置。

  3. CSS 要求 对象具体对象尺寸 渲染自身。 CSS 不规定当 具体对象尺寸对象自然尺寸 不同时的渲染方式。 对象可以以某种方式自适应 具体对象尺寸, 甚至可以为满足自身的尺寸约束渲染得比 具体对象尺寸大或小。

  4. 除非 CSS 另有规定, 对象会被裁剪到 具体对象尺寸 区域。

4.3. 具体对象尺寸求解

目前各个上下文中对象的尺寸规则 都在对应上下文分别描述。 本节定义了一些常见尺寸约束 及其求解方式, 以便后续规范可引用这些规则,无需每次重复定义尺寸求解。

4.3.1. 默认尺寸算法

默认尺寸算法 是一组常用于求解对象 具体对象尺寸的规则。 它同时处理 对象自然尺寸 和无约束指定尺寸或仅包含确定宽度/高度的指定尺寸。

有些对象的尺寸规则 (如 list-style-image) 正好等同于 默认尺寸算法。 其他情况 (如 border-image) 会在最终得到 具体对象尺寸前, 先应用其它尺寸规则后再调用默认尺寸算法。

默认尺寸算法定义如下:

4.3.2. cover 与 contain 约束尺寸

另有两种常见的指定尺寸:contain 约束cover 约束, 它们都针对指定的 约束矩形,结合对象首选宽高比 求解:

两种情况下, 若对象没有自然宽高比具体对象尺寸就是指定的约束矩形。

4.4. CSS 对象尺寸示例

下列示例展示了 CSS 2.1CSS3 背景与边框 的尺寸算法 如何与本规范定义的概念对应。
background-image
背景的 具体对象尺寸 计算规则 见 CSS2.1§14.2.1CSS3BG§3.9。 CSS2.1 使用 默认尺寸算法,不指定 指定尺寸背景定位区域 作为 默认对象尺寸[CSS2] 在 CSS3 中,background-size 属性可指定尺寸约束, 触发 默认尺寸算法containcover 约束。 如果 background-repeatround 时,具体对象尺寸还会后续调整。[CSS3BG]
list-style-image
列表样式图片的 具体对象尺寸 计算规则见 CSS2.1§12.5.1。 采用 默认尺寸算法,不指定 指定尺寸默认对象尺寸为 1em 正方形。
border-image
边框图片会进行两次尺寸计算: 首先整体图片定尺寸以确定切分点, 然后每个切片再定尺寸用于装饰边框。 第一次尺寸计算见 CSS3BG§6.2,采用 默认尺寸算法,不指定 指定尺寸border image area 作为 默认对象尺寸。 第二次见 CSS3BG§6.2: 用 默认尺寸算法 以对应的 border image area 部分为默认对象尺寸, 求每个切片的初始尺寸。 默认情况下 指定尺寸等于 默认对象尺寸; 但 border-image-repeat 属性可以丢弃一到多个方向的指定尺寸,并可再做一次取整。[CSS3BG]
cursor
光标的 具体对象尺寸 计算规则见 CSS2.1 §18.1: Cursors默认对象尺寸为 UA 自定义尺寸, 应基于 UA 操作系统上的典型光标大小。[CSS2]
content
通过 CSS2.1 content 属性插入的对象 是匿名替换元素, 与上述对象尺寸处理方式一样。[CSS2] 注意, 匿名元素的所有非继承属性(包括 widthheight 等) 都设为初始值。
替换元素
CSS 2.1 定义了替换元素(包括通过 content content 插入的生成内容)的尺寸, 见 10.3.210.410.6.210.7[CSS2] 下文定义的 object-fit 属性定义了 具体对象尺寸 如何与元素的实际宽高对应; 默认情况下二者相同。

4.5. 对象尺寸:object-fit 属性

名称: object-fit
值: fill | contain | cover | none | scale-down
初始值: fill
适用元素: 替换元素
继承性:
百分比: 不适用
计算值: 指定关键字
规范顺序: 按语法顺序
动画类型: 离散

object-fit 属性指定替换元素的内容如何适应由其实际高度和宽度确定的盒子。

fill
替换内容被拉伸至填满元素内容盒: 对象的具体对象尺寸即为元素的实际宽高。
contain
替换内容在保持其自然宽高比的同时适应元素内容盒: 其具体对象尺寸按元素的实际宽高作为contain 约束求解。
cover
替换内容在保持自然宽高比的同时填满整个元素内容盒: 其具体对象尺寸按元素的实际宽高作为cover 约束求解。
none
替换内容不会缩放以适应元素内容盒: 使用默认尺寸算法且无指定尺寸, 默认对象尺寸等于替换元素的实际宽高,来确定对象的具体对象尺寸
scale-down
内容尺寸按 nonecontain 的效果取较小的 具体对象尺寸

注: nonecontain 都会遵循内容的自然宽高比, 因此“更小”是有明确定义的。

如果内容未完全填充替换元素的内容盒, 空白部分会显示替换元素的背景。 替换元素总会将内容裁剪到内容盒内, 内容不会溢出。 如需定位对象见 object-position 属性。

示例展示了 object-fit 的四种值如何让替换元素(蓝色图形) 按高度/宽度盒(绿色背景)缩放, 并用object-position 的初始值定位。 第五个值 scale-down 在本例下与 contain 效果完全一致。

注: object-fit 属性的语义类似于 [SMIL10] 中的 fit 属性,以及 <meetOrSlice> 参数 (用于 preserveAspectRatio 属性,见 [SVG11])。

注:对象尺寸协商 算法, 具体对象尺寸(或此处的内容尺寸) 并不直接缩放对象本身—— 它只是作为可见画布的尺寸传递给对象。 如何绘制由图片格式决定。 特别地,光栅图片总是缩放到给定尺寸, 而 SVG 则以给定尺寸作为“SVG 视口”大小(SVG 术语), 并通过根 <svg> 元素的多个属性决定绘制方式。

4.6. 对象定位:object-position 属性

名称: object-position
值: <position>
初始值: 50% 50%
适用元素: 替换元素
继承性:
百分比: 参考元素自身宽高
计算值: background-position
规范顺序: <position> 的水平分量,后跟垂直分量
动画类型: background-position

object-position 属性决定替换元素在其盒子内部的对齐方式。 <position> 值类型 (同样用于 background-position) 定义见 [CSS-VALUES-3], 解析时以具体对象尺寸为对象区域, 以内容盒为定位区域。

注: 盒子未被替换元素覆盖的区域会显示其背景。

5. 图片处理

5.1. 页面图片方向:image-orientation 属性

如果用侧放的相机拍照, 或文档在扫描仪中位置不正, 得到的图片可能会“横着”甚至倒着显示。 image-orientation 属性提供了一种对图片源数据进行“带外”旋转以正确显示图像的方式。

名称: image-orientation
值: from-image | none | [ <angle> || flip ]
初始值: from-image
适用元素: 所有元素
继承性:
百分比: 不适用
计算值: 指定关键字,或四舍五入归一化(见正文)的 <angle>,以及可选的 flip 关键字
规范顺序: 按语法顺序
动画类型: 离散

此属性对实现来说是可选的。

该属性指定对元素图片应用正交旋转, 在图片用于文档前进行。 适用于内容图片 (如替换元素和生成内容) 以及 SVG 元素引用的图片源 (如 feImage), 还包括通过 CSS 规则应用的装饰图片 (如 background-image 及其他 <image> 属性)。 不适用于文档外图片的渲染, 如 UA 导航栏或菜单中的 favicon 等。

注: 该属性不用于指定布局变换 (如任意旋转或水平/垂直翻转图片)。 (相关功能见 [CSS-TRANSFORMS-1]。) 也不用于在横向/纵向打印时自动旋转图片, 这种旋转属于布局处理。(参见 [CSS3PAGE]。) 该属性仅用于修正图片方向不正确的情况。

各值含义如下:

none
不应用额外旋转: 图片按其编码方式显示。
from-image
若图片元数据(如 EXIF)中指定了方向, 此值计算为元数据指定的正确朝向所需的角度。 若需要,该角度按 <angle> 的规则四舍五入归一化。 若元数据未指定方向, 此值计算为 none

注: § 2.1.2 图片元数据 对可用元数据有一些限制。

<angle> || flip
<angle> 表示图片顺时针旋转, 负值表示逆时针旋转。 如果 <angle> 省略,默认 0deg

若指定 flip, 则旋转后图片还会水平翻转。

该值仅对内容图片生效; 装饰图片行为仍为 from-image。 此值已废弃, 实现可选, 仅 [CSS-PRINT] 合规实现需支持。

注: 该值允许手动复现 from-image 可实现的全部 8 种 EXIF 方向。

该属性的计算值为 先将 <angle> 四舍五入到最接近的四分之一圈, 歧义时向正无穷舍入, 然后模 1turn(即归一到 [0turn, 1turn) 区间)。

nonefrom-image 外,其他值在 CSS 中为可选实现且已废弃

所有 CSS 布局和渲染过程都以图片旋转后的结果为准, 效果等同于图片本身就是以该方向编码的。 例如:

下例将图片顺时针旋转 90 度:
img.ninety     { image-orientation: 90deg }
...
<img class="ninety" src=...>

同样效果还可用 -270deg 或 450deg 等角度实现。

注: 此属性之前的初始值为 none。 现认为初始值为 from-image 用户体验更佳且兼容性影响较小, 但后续 UA 实践会进一步验证。 若得到验证,则该属性未来可能会从 CSS 移除, 除非有除“修正图片方向”以外的用例提出。

5.2. 确定图片缩放方式:image-rendering 属性

名称: image-rendering
值: auto | smooth | high-quality | pixelated | crisp-edges
初始值: auto
适用元素: 所有元素
继承性:
百分比: 不适用
计算值: 指定关键字
规范顺序: 按语法顺序
动画类型: 离散

image-rendering 属性为用户代理提供一个提示,说明在图片缩放时应优先保留哪些特性,以帮助用户代理选择合适的缩放算法。 当在元素上指定时,会应用于该元素所有图片相关属性中的图片,例如背景图片、列表样式图片,或作为图片需要缩放时的替换元素内容。 image-rendering 属性的各个值解释如下:

auto
缩放算法由用户代理决定。
smooth
图片应使用最大化视觉效果的算法缩放。尤其可以使用“平滑”颜色的缩放算法,例如双线性插值。适用于照片等图片。
high-quality

smooth 相同,但优先考虑更高质量的缩放。 如果系统资源受限,带有 high-quality 的图片应优先于其他值的图片,在考虑降级哪些图片及降级程度时。

此值不会阻止图片在系统资源紧张时被降级,只是表达这些图片应比 auto 图片获得更多的缩放资源。 如果页面上所有图片都用 high-quality,效果等同于都用 auto,都会被一视同仁。

要最大化利用 high-quality,只对页面最重要的图片使用此值。

pixelated

图片缩放时尽量保留原始的像素化风格,但当目标尺寸不是原始尺寸的整数倍时,可以做少量平滑以避免图像变形。

每个方向分别,先确定其最接近目标尺寸且大于零的原始尺寸的整数倍,先用最近邻算法缩放到该尺寸,再按 smooth 的方式继续缩放到目标尺寸。

注: 当目标尺寸为原始尺寸的整数倍时,该值效果等同于 crisp-edges。非整数倍时,通常视觉效果更好(即使是像素风格图),但由于“二步渲染”会有性能损耗。

crisp-edges

图片缩放时尽量保留对比度和边缘,避免平滑颜色或产生模糊,适用于线条画等图片。

可以用最近邻或其他不模糊边缘不混色的用户代理自选算法进行缩放。也可以检测斜线或曲线并平滑显示(而不是“锯齿状大像素”)。

注: 如果新尺寸不是原始尺寸的整数倍,最近邻算法可能会导致显著的“走样”问题:原图中等粗细的线在缩放后可能粗细不一等。因此多数情况下,pixelated最近邻 更适合。

除了 pixelated 的第一步外,该属性不限定必须使用特定的缩放算法。 例如 image-rendering: auto 时,用户代理可以默认用双线性插值,也可以在高负载时切换为最近邻插值,或对静态不变图片用更高质量的算法如 Lanczos 插值。

例如,给定如下小图片:
一张小型像素风格图片。

将其放大 3 倍后,效果可能如下,取决于 image-rendering 的值:

使用 smooth 放大 3 倍的图片
使用 pixelated 放大 3 倍的图片
使用 crisp-edges 并采用保边缘算法放大 3 倍的图片。
(如用 最近邻 算法,则和 pixelated 效果一致。)
最近邻 (或 NN)图片缩放算法 把源图片的像素视为画布上的颜色矩形, 目标像素按其区域中某点(通常取中心或左上)查找对应源画布上的点的颜色赋值。
当目标尺寸为源图整数倍时,效果是“放大像素”就像放大原图。 非整数倍时,依然完全用原图颜色生成清晰像素(无混色或模糊),但会有走样现象,“像素网格”可能不太规则。

例如,使用 最近邻 把图片放大 2.5 倍,会让源图的每个像素在目标图上交替变为 2 或 3 个像素;缩小到 0.5 倍则会跳过源图的每隔一个像素。

如上例放大 3 倍时, pixelated 和纯 最近邻 效果完全一致。 在非整数倍缩放时, 效果则不同:
同样的小型像素风格图片
pixelated 放大 2.5 倍的图片
crisp-edges最近邻 缩放 2.5 倍

pixelated 版本维持了单纯放大像素的整体“风格”,但有轻微平滑,远小于 smooth 的模糊。而 最近邻 完全不引入模糊,但会有走样现象使“像素”大小不均匀。

该属性曾接受 optimizeSpeedoptimizeQuality 两个值。现已废弃;用户代理必须将它们视为有效值,但等同于 crisp-edgessmooth,作者不应使用。

6. 插值

本级未定义 <image> 值的插值方式。 实现必须直接跳变 (在过渡进度 50% 时切换,与其他不支持的插值类似), 除非未来规范另有定义。

注: CSS Images Level 4 预计将为渐变定义专门插值,并规定所有其他图片通过淡入淡出插值。

7. 序列化

本节描述本规范中引入的所有新属性和值类型的序列化方式, 以便与 CSS 对象模型 [CSSOM] 交互。

要序列化本模块定义的任何函数, 按其各自语法序列化, 遵循语法顺序, 在不改变含义时可省略部分组件, 空格分隔的标记用单空格连接, 逗号后跟单空格。

例如,以下渐变定义:
Linear-Gradient( to bottom, red 0%,yellow,black 100px)

序列化后应为:

linear-gradient(red, yellow, black 100px)

隐私注意事项

本规范未引入新的隐私风险。

安全注意事项

本规范默认允许跨域图片渲染, 这会使这些图片的一些信息可通过编程方式获取——具体来说,是这些图片的 自然尺寸 和分辨率。

鸣谢

感谢 Webkit 团队、Brad Kemper、Brian Manthos 和 Alan Gresley 对渐变定义的贡献;感谢 Melinda Grant 对 object-fitobject-positionimage-orientation 的工作; 以及 L. David Baron、 Kang-Hao Lu、Leif Arne Storset、Erik Dahlstrom 和 Øyvind Stenhaug 对本规范的细致评审、意见和修订。

变更

2019 年 10 月 10 日候选推荐 起的变更

2020 年 12 月 17 日 CRD 以来的重要变更:

2019 年 10 月 10 日 CR 以来的重要变更:

2012 年 4 月 17 日候选推荐 起的变更

主要变更包括:

评论处理结果 可供查阅。

合规性

文档约定

合规性要求通过描述性断言和 RFC 2119 术语结合表达。规范性部分中的关键词 “MUST”(必须)、“MUST NOT”(禁止)、“REQUIRED”(要求)、“SHALL”(应)、“SHALL NOT”(不得)、“SHOULD”(应该)、“SHOULD NOT”(不应该)、“RECOMMENDED”(推荐)、“MAY”(可以)和 “OPTIONAL”(可选)等,按照 RFC 2119 的说明解释。不过为便于阅读,本规范未将这些词全部大写。

本规范的所有内容均为规范性内容,除非明确标注为非规范性、示例或注释部分。[RFC2119]

本规范中的示例用“例如”引出,或通过 class="example" 属性与规范性文本区分,如下所示:

这是一个说明性示例。

说明性注释以“注”开头,并通过 class="note" 属性与规范性文本区分,如下所示:

注:这是一个说明性注释。

建议性内容是规范性部分,并以特殊样式突出显示,通过 <strong class="advisement"> 区分,例如: UA 必须提供可访问的替代方案。

合规类别

本规范的合规性定义了三类合规类别:

样式表
CSS 样式表
渲染器
解释样式表语义并渲染使用它们文档的 UA
创作工具
用于编写样式表的 UA

如果样式表中使用本模块定义语法的所有语句均根据通用 CSS 语法和本模块每项特性的语法有效,则该样式表符合本规范。

渲染器符合本规范,必须在解释样式表时,支持本规范定义的所有特性,正确解析并相应渲染文档。不过由于设备限制导致 UA 无法正确渲染文档不算为不合规。(例如,UA 不要求在单色显示器上渲染颜色。)

创作工具符合本规范,需编写的样式表在语法上符合通用 CSS 语法和本模块每项特性的语法,并满足本模块描述的样式表的所有其它合规性要求。

部分实现

为便于作者利用前向兼容解析规则设置回退值,CSS 渲染器必须将所有不支持的 at-规则、属性、属性值、关键字及其它语法结构视为无效(并按需忽略)。特别地,用户代理不得在单个多值属性声明中选择性忽略不支持的组件值而保留支持的值:如果有任何值被视为无效(即不支持的值必须如此),CSS 要求整个声明被忽略。

不稳定和专有特性的实现

为避免与未来稳定 CSS 特性冲突,CSSWG 推荐遵循最佳实践来实现不稳定特性和专有扩展

非实验性实现

当规范达到候选推荐阶段后,可以实现非实验性实现,建议实现者发布可证明按规范正确实现的任何 CR 级别特性的无前缀实现。

为保证 CSS 在不同实现间的互操作性,CSS 工作组要求非实验性 CSS 渲染器在发布任何 CSS 特性无前缀实现前,向 W3C 提交实现报告(如有必要,还需提交用于该实现报告的测试用例)。提交给 W3C 的测试用例将由 CSS 工作组审查和修正。

关于提交测试用例和实现报告的更多信息,参见 CSS 工作组网站:https://www.w3.org/Style/CSS/Test/。如有问题,请联系 public-css-testsuite@w3.org 邮件列表。

CR 退出标准

要将本规范推进为提议推荐,必须对每个特性有至少两个独立且可互操作的实现。每个特性可以由不同产品实现,不要求所有特性由同一个产品实现。为此,定义如下术语:

独立
每个实现必须由不同方开发,不能共享、复用或派生自其他合格实现的代码。与本规范实现无关的代码片段不在此限。
可互操作
通过官方 CSS 测试套件中的相关测试用例,或非 Web 浏览器实现则用等价测试。若某类 UA 用于宣称互操作性,则该测试集应有等价的测试,并且还需有一个或多个其它 UA 以相同方式通过这些等价测试,供互操作性考核。等价测试必须公开以便同行评审。
实现
用户代理需:
  1. 实现本规范。
  2. 面向公众。可为正式产品或其它公开版本(如 beta、预览版或“nightly build”)。非正式产品须至少实现该特性一个月以证明稳定性。
  3. 非实验性(即不是专为通过测试套件而设计、后续不打算正常使用的版本)。

本规范将至少保持候选推荐状态六个月。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS Color Module Level 4. 2022年11月1日. CR. URL: https://www.w3.org/TR/css-color-4/
[CSS-CONTENT-3]
Elika Etemad; Dave Cramer. CSS Generated Content Module Level 3. 2019年8月2日. WD. URL: https://www.w3.org/TR/css-content-3/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020年11月17日. WD. URL: https://www.w3.org/TR/css-lists-3/
[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS Masking Module Level 1. 2021年8月5日. CR. URL: https://www.w3.org/TR/css-masking-1/
[CSS-PRINT]
Elika Etemad; Melinda Grant. CSS Print Profile. 2013年3月14日. NOTE. URL: https://www.w3.org/TR/css-print/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS Box Sizing Module Level 4. 2021年5月20日. WD. URL: https://www.w3.org/TR/css-sizing-4/
[CSS-UI-4]
Florian Rivoal. CSS Basic User Interface Module Level 4. 2021年3月16日. WD. URL: https://www.w3.org/TR/css-ui-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2022年12月1日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2023年10月27日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS2]
Bert Bos; 等. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2023年2月14日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[FILTER-EFFECTS-1]
Dirk Schulze; Dean Jackson. Filter Effects Module Level 1. 2018年12月18日. WD. URL: https://www.w3.org/TR/filter-effects-1/
[HTML]
Anne van Kesteren; 等. HTML Standard. 现行标准. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

参考性引用

[CSS-TRANSFORMS-1]
Simon Fraser; 等. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSS3PAGE]
Elika Etemad. CSS Paged Media Module Level 3. 2023年9月14日. WD. URL: https://www.w3.org/TR/css-page-3/
[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022年11月11日. WD. URL: https://www.w3.org/TR/selectors-4/
[SMIL10]
Philipp Hoschka. Synchronized Multimedia Integration Language (SMIL) 1.0 Specification. 1998年6月15日. REC. URL: https://www.w3.org/TR/1998/REC-smil-19980615/
[SVG11]
Erik Dahlström; 等. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/

属性索引

名称 初始值 适用元素 继承性 百分比 动画类型 规范顺序 计算值
image-orientation from-image | none | [ <angle> || flip ] from-image 所有元素 不适用 离散 按语法顺序 指定关键字,或四舍五入归一化的 <angle>,可选加 flip 关键字
image-rendering auto | smooth | high-quality | pixelated | crisp-edges auto 所有元素 不适用 离散 按语法顺序 指定关键字
object-fit fill | contain | cover | none | scale-down fill 替换元素 不适用 离散 按语法顺序 指定关键字
object-position <position> 50% 50% 替换元素 参考元素自身宽高 同 background-position <position> 的水平分量,后跟垂直分量 同 background-position

问题索引

需要补充一个使用颜色提示的视觉示例。
CanIUse

Support:Android Browser4.4+Baidu Browser13.18+Blackberry Browser10+Chrome26+Chrome for Android119+Edge12+Firefox16+Firefox for Android119+IE10+IE Mobile10+KaiOS Browser2.5+Opera12.1+Opera MiniNoneOpera Mobile12.1+QQ Browser13.1+Safari6.1+Safari on iOS7.0+Samsung Internet4+UC Browser for Android15.5+

Source: caniuse.com as of 2023-12-13

CanIUse

Support:Android Browser119+Baidu Browser13.18+Blackberry BrowserNoneChrome81+Chrome for Android119+Edge81+Firefox26+Firefox for Android119+IENoneIE MobileNoneKaiOS Browser2.5+Opera68+Opera MiniNoneOpera Mobile73+QQ BrowserNoneSafari13.1+Safari on iOS14.0+Samsung Internet13.0+UC Browser for Android15.5+

Source: caniuse.com as of 2023-12-13

CanIUse

Support:Android Browser119+Baidu Browser13.18+Blackberry BrowserNoneChrome41+Chrome for Android119+Edge79+Firefox65+Firefox for Android119+IENoneIE MobileNoneKaiOS Browser2.5+Opera28+Opera MiniNoneOpera Mobile73+QQ Browser13.1+Safari10+Safari on iOS10.0+Samsung Internet4+UC Browser for Android15.5+

Source: caniuse.com as of 2023-12-13