CSS 图像模块第4级

W3C 工作草案,

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2023/WD-css-images-4-20230217/
最新发布版本:
https://www.w3.org/TR/css-images-4/
编辑草案:
https://drafts.csswg.org/css-images-4/
以前的版本:
历史:
https://www.w3.org/standards/history/css-images-4
反馈:
CSSWG 问题库
跟踪器
规范内联
编辑:
Tab Atkins Jr. (Google)
Elika J. Etemad / fantasai (特邀专家)
Lea Verou (特邀 专家)
为此规范建议编辑:
GitHub 编辑器

摘要

本模块包含CSS第4级中与 <image> 类型和替换元素相关的功能。 它包括并扩展了CSS第2级的功能 [CSS2] 和本规范的前一个级别 [css-images-3]。 与“CSS图像模块第3级” [css-images-3] 相比,主要扩展是在 <image> 类型中增加了几项功能,例如 image() 表示法,element() 表示法和锥形渐变。

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

本文档的状态

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

本文档由 CSS工作组 作为工作草案发布, 使用 推荐轨道。 作为工作草案发布不意味着 W3C 及其成员的认可。

这是一个草案文件,可能会随时更新、替换或被其他文件取代。 除了作为工作进展,引用此文档是不合适的。

请通过 在GitHub中提交问题(首选)来提供反馈, 在标题中包含规范代码“css-images”,如:“[css-images] …评论摘要…”。 所有问题和评论都被 存档。 另外,反馈也可以发送到 (存档) 公共邮件列表 www-style@w3.org

本文档受 2021年11月2日W3C流程文件 管辖。

本文档由一个遵循 W3C专利政策 的小组制作。 W3C维护一个 任何与该小组交付成果相关的专利披露公开列表; 该页面还包括披露专利的说明。 任何知悉某项专利且相信该专利包含 必要声明 的个人, 必须根据 W3C专利政策第6节 披露该信息。

1. 简介

本节不具有规范性。

本模块引入了表示二维图像的其他方式, 例如作为 具有颜色回退的URL, 作为 锥形渐变, 或作为 文档中另一个元素的渲染

1.1. 值定义

本规范遵循 CSS属性定义惯例,来自 [CSS2],并使用 值定义语法,来自 [CSS-VALUES-3]。 本规范未定义的值类型将在CSS值和单位模块中定义 [CSS-VALUES-3]。 与其他CSS模块的组合可能会扩展这些值类型的定义。

除了定义中特定于属性的值之外, 本规范中定义的所有属性 还接受 CSS-wide关键词 作为其属性值。 为了可读性,它们没有被明确重复。

2. 二维图像值: <image> 类型

<image> 值类型表示一个二维图像。它可以是一个 url引用图像表示法, 或 渐变表示法。 它的语法是:

<image> = <url> | <image()> | <image-set()> | <cross-fade()> | <element()> | <gradient>

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

在某些情况下,图像是无效的, 例如 <url> 指向的资源不是有效的图像格式 或者加载失败的资源。 无效图像 将呈现为 一个没有 自然尺寸 的纯色 透明 图像。 然而,无效图像 在某些情况下会触发错误处理条款。 例如,在 list-style-image 中的 无效图像 被视为 , 允许 list-style-type 在其位置呈现。 [CSS2]

当图像正在加载时, 它是一个 加载中的图像加载中的图像 不是 无效图像, 但具有类似的行为: 它们被渲染为一个没有 透明 图像的自然尺寸, 并且在提供回退呈现的上下文中可能触发回退呈现, 但不得触发回退资源的加载。 或者,如果 加载中的图像 恰好替换了 已加载的图像 (例如由于文档或样式表的更改) 并且UA正在跟踪此信息, 它可以继续渲染已加载的图像来代替 加载中的图像

部分加载的图像(其 自然尺寸 已知,但图像数据尚未完全加载) 可以被视为 加载中的图像 或作为带有部分数据的已加载图像处理。 例如,UA可以在加载第一个像素数据传递后立即呈现交错的GIF, 甚至在图像头(其中包含尺寸数据)解析后, 并在加载更多数据时刷新渲染; 或者它可能会等待整个图像加载完成后再使用它。

计算 <image> 值 是 指定值,其中包含任何 <url>s, <color>s, 以及 <length>s 的计算值。

2.1. 图像文件格式

至少,当从 <image> 值引用时,UA必须支持以下图像文件格式, 对于所有使用 <image> 有效的属性:

UA还可以支持其他文件格式。

2.2. 图像引用: url() 表示法

注意:[css-images-3] 无异。

2.3. 获取外部图像

为了 为样式表获取外部图像, 给定一个 url urlCSSStyleSheet 样式表,获取样式资源给定 url, 使用样式表 CSSStyleSheet, 目标为“image”, CORS模式为“no-cors”, 并按以下步骤处理响应 response res 和 null,失败或字节流 byteStream: 如果 byteStream 是字节流,则从字节流加载图像。

2.4. 分辨率/类型协商: image-set() 表示法

为用户设备提供最合适的图像分辨率可能是一项艰巨的任务。 理想情况下,图像应该与它们被查看的设备的分辨率相同, 这可能因用户而异。 但是,其他因素也会影响选择发送哪种图像; 例如,如果用户使用的是慢速移动连接, 他们可能更愿意接收低分辨率图像, 而不是等待加载大型高分辨率图像。 image-set() 函数允许作者忽略大多数这些问题, 只需提供多种分辨率的图像, 让UA决定在给定情况下哪种最合适。

该解决方案假设分辨率是文件大小的代理, 因此不能很好地处理矢量图像的多分辨率集, 或混合矢量图像和光栅图像(例如用于图标)。 例如,在高分辨率下使用矢量图, 在低分辨率下使用像素优化的位图, 并再次使用相同的矢量图以用于低带宽(因为它要小得多,即使分辨率更高)。

image-set() 的语法为:

<image-set()> = image-set( <image-set-option># )
<image-set-option> = [ <image> | <string> ]
                     [ <resolution> || type(<string>) ]

我们应添加“w”和“h”维度作为可能性 以匹配HTML的功能 picture

每个 <string>image-set() 中表示一个 <url>

image-set() 函数不能嵌套在其自身内部, 无论是直接 还是间接 (作为另一个 <image> 类型的参数)。

每个 <image-set-option> 定义了 image-set() 函数表示的可能图像, 由三个部分组成:

一个 image-set() 函数包含一个或多个 <image-set-option> 的列表, 并且必须从中选择一个 来确定它将表示哪个图像:

  1. 首先,从列表中移除任何 <image-set-option> 指定了未知或不支持的MIME类型的 type() 值。

  2. 其次,从列表中移除任何 <image-set-option> 具有与列表中先前选项相同的 <resolution>

  3. 最后,在剩余的 <image-set-option> 之中, 根据UA认为相关的任何标准 (例如显示器的分辨率, 连接速度, 等等)做出UA特定的选择。

  4. 然后,image-set() 函数表示所选的 <image> 图像。

UA 可以 在页面生命周期内更改其希望为给定的 image-set() 使用的 <image-set-option>, 如果用于确定选择哪个选项的标准发生了足够显著的变化,UA认为这样做是值得的。

此示例展示了如何使用 image-set() 提供图像的三个版本: 一个“普通”版本, 一个“高分辨率”版本, 以及一个用于高质量打印的超高分辨率版本 (因为打印机的分辨率可能 极高):
background-image: image-set( "foo.png" 1x,
                             "foo-2x.png" 2x,
                             "foo-print.png" 600dpi );
此示例展示了 type() 函数的使用, 在新的更高质量格式和旧的更广泛支持的格式中 提供相同图像的多个版本:
background-image: image-set( "foo.avif" type("image/avif"),
                             "foo.jpg" type("image/jpeg") );

注意AVIF图像是优先给出的; 因为两个图像的分辨率相同 (因为未指定而默认为 1x), JPEG图像, 排在第二位, 会在支持AVIF图像的UA中自动丢弃。

但是,在较旧的UA中, AVIF图像被忽略 (因为UA知道它不支持 "image/avif" 文件), 因此会选择JPEG。

光栅图像可以与矢量图像混合, 甚至是CSS生成的图像。

例如,在此代码片段中, 一个具有细微细节的高分辨率图像用于能够展现其细节的屏幕, 而在低分辨率情况下,使用普通的CSS linear-gradient() 替代:

background-image: image-set( linear-gradient(cornflowerblue, white) 1x,
                             url("detailed-gradient.png") 3x );

2.5. 图像回退和注释: image() 表示法

image() 函数允许作者:

image() 表示法定义为:

image() = image( <image-tags>? [ <image-src>? , <color>? ]! )
<image-tags> = [ ltr | rtl ]
<image-src> = [ <url> | <string> ]

<string> 中使用的 image() 表示一个 <url>。 对于CSS中的URL来说, 相对URL被解析为绝对URL (如值与单位中所述 [CSS-VALUES-3]) 当指定的 image() 值被计算时。

如果图像在其元数据中指定了方向, 例如EXIF, UA必须旋转或翻转图像以正确地按照元数据指定的方向显示。

2.5.1. 图像回退

如果在 image() 中同时指定了一个URL和一个 <color>,那么每当URL代表一个 无效图像加载中的图像 时, image() 函数将表现为好像URL根本没有被指定一样; 它会生成一个指定的纯色图像, 如 § 2.5.3 纯色图像 中所述。

如果只指定了一个URL(没有 <color>), 并且它代表一个 无效图像加载中的图像image() 函数表示相同的结果。

可以使用回退颜色来确保即使图像加载失败,文本仍然可读。 例如,以下传统代码在图像为矩形且没有透明度时可以正常工作:
body      { color: black; background: white; }
p.special { color: white; background: url("dark.png") black; }

当图像未加载时,背景颜色仍然存在以确保白色文本可读。 然而,如果图像具有某种透明度, 黑色将会在其后面显示, 这可能不是所期望的。 image() 函数解决了这个问题:

body      { color: black; background: white; }
p.special { color: white; background: image("dark.png", black); }

现在,如果图像加载成功,黑色将完全不显示, 但如果由于某种原因图像加载失败, 它会显示并防止白色文本与白色背景混合。

2.5.2. 图像片段

image() 中指定的URL表示资源的一部分时 (例如使用 媒体片段标识符), 该部分将被从其上下文中剪裁出来并用作独立图像。

例如,给定以下图像和CSS:

[9 circles, with 0 to 8 eighths filled in]

background-image: image('sprites.svg#xywh=40,0,20,20')

...元素的背景将是从(40px,0px)开始并宽高均为20px的图像部分, 这正好是一个填充了四分之一的圆。

为了使作者能够利用CSS的前向兼容解析规则来为图像切片提供回退, 支持 image() 表示法的实现 必须 支持媒体片段标识符的 xywh=#,#,#,# 形式 用于通过 image() 指定的图像。[MEDIA-FRAGS]

注意图像片段也可以与 url() 表示法一起使用。 但是,不理解媒体片段表示法的旧版UA将忽略该片段并仅显示整个图像。

由于 image() 表示法要求UA支持媒体片段, 作者可以利用CSS的前向兼容解析规则 在使用图像片段URL时提供回退:

background-image: url('swirl.png'); /* 旧版UA */
background-image: image('sprites.png#xywh=10,30,60,20'); /* 新版UA */

如果一个URL使用了实现不理解的片段标识符语法, 或者认为对于该类型的图像无效, 则该URL必须被视为代表一个 无效图像

注意: 此错误处理仅限于 image(), 而不是URL的定义, 出于传统兼容性原因。

2.5.3. 纯色图像

如果 image() 函数仅使用一个 <color> 参数(没有URL), 它表示一个没有 自然尺寸 的指定颜色的纯色图像。

例如, 可以用它作为简单的方式来“着色”背景图像, 通过在另一个图像上叠加一个部分透明的颜色:
background-image: image(rgba(0,0,255,.5)), url("bg-image.png");

background-color 无法实现这一点, 因为它生成的纯色始终位于所有背景图像的下方

2.5.4. 双向敏感图像

在列出任何 <image-src> 之前, 作者可以为图像指定方向性, 类似于在HTML元素中添加 dir 属性。 如果定向图像在具有相反 方向 的元素上使用, 必须在内联方向上翻转图像 (好像通过 scaleX(-1) 进行转换一样,如果内联方向是X轴)。

注意: 如果没有此声明, 图像默认没有方向性, 因此不关心周围元素的方向性。

列表可能使用一个箭头作为指向内容的项目符号。 然而,如果列表包含LTR和RTL文本, 则项目符号可能在左侧或右侧, 设计用于指向一侧文本的图像将在另一侧指向文本外。 这可以通过如下代码修复:
<ul style="list-style-image: image(ltr 'arrow.png');">
  <li dir='ltr'>My bullet is on the left!</li>
  <li dir='rtl'>MY BULLET IS ON THE RIGHT!</li>
</ul>

这应该呈现类似的内容:

⇒ My bullet is on the left!
  !THGIR EHT NO SI TELLUB YM ⇐

在LTR列表项中,图像将按原样使用。 然而,在RTL列表项中, 它将在内联方向上翻转, 因此它仍然指向内容。

2.6. 组合图像:cross-fade() 表示法

在图像之间过渡时, CSS需要一种明确引用中间图像的方式, 该图像是开始和结束图像的组合。 这通过 cross-fade() 函数实现, 它指示要组合的两个图像 以及组合的过渡程度。

注意: 作者还可以使用 cross-fade() 函数进行许多简单的图像处理, 如使用纯色为图像着色 或通过将图像与径向渐变结合来突出显示页面的特定区域。

cross-fade() 的语法定义如下:

cross-fade() = cross-fade( <cf-image># )
<cf-image> = <percentage [0,100]>? && [ <image> | <color> ]

该函数表示通过 组合一个或多个图像生成的图像。

<percentage> 表示在与其他图像混合时保留的每个图像的百分比。 <percentage> 必须在 0%100% 之间; 任何其他值都是无效的。

如果省略了任何百分比, 所有指定的百分比将加在一起 并从 100% 中减去, 结果向下取整为 0%, 然后在计算值时在所有省略百分比的图像之间平均分配。

尽管这不会反映在计算值中, 当所有参数的百分比总和大于 100% 时, 尺寸/绘制细节会有效地重新调整它们的比例,使它们的总和恰好为 100%

另一方面, 当总和小于 100% 时, 尺寸/绘制细节实际上会像有一个额外的 透明 参数一样, 它的百分比设置为剩余的值, 以使总和等于 100%

如果提供了 <color>, 它表示一个纯色图像, 具有“自动”尺寸 (它不会参与结果图像的尺寸调整; 请参阅下文中的尺寸细节)。

2.6.1. cross-fade() 尺寸调整

cross-fade() 表示的图像的尺寸 是函数中的 <image> 参数尺寸的加权平均; <color> 参数没有影响。 计算方法如下:

确定 cross-fade() 的自然尺寸:
  1. images 为一个空列表。

  2. 对于 cross-fade() 函数的每个具有 <image> 值的 argument

    1. item 为一个包含宽度、高度和百分比的 元组

    2. <image> 执行 对象尺寸协商算法, 以适合 cross-fade() 所在的上下文, 并将 item 的宽度和高度 设置为生成的 具体对象尺寸 的宽度和高度。

    3. item 的百分比设置为 argument 的百分比。

  3. 如果 images 为空, 则不返回任何 自然尺寸

  4. percentage sumimages 中所有 项目 的百分比之和。

  5. 对于每个 itemimages 中, 将 item 的百分比除以 percentage sum, 并将 item 的百分比设置为结果。

    断言:images 中的百分比总和现在为 100%

  6. final widthfinal height0px

  7. 对于每个 itemimages 中, 将 item 的宽度乘以 item 的百分比 并将结果加到 final width, 并将 item 的高度乘以 item 的百分比 并将结果加到 final height

  8. 返回 final width自然宽度final height自然高度

2.6.2. cross-fade() 绘制

cross-fade() 表示的图像是输入参数的加权平均, 按如下步骤计算:

确定 cross-fade() 的外观
  1. images 为一个空列表。

  2. size 为一个包含宽度和高度的 元组, 初始化为查找 cross-fade() 函数的 自然尺寸的结果。

  3. 对于 cross-fade() 函数的每个 argument

    1. item 为一个包含图像和百分比的 元组

    2. 如果 argument<image>, 将其按 size 的宽度和高度重新调整大小, 并将 item 的图像设置为结果。 否则,argument 是一个 <color>, 将 item 的图像设置为该颜色的纯色图像, 并具有 size 的尺寸。

    3. item 的百分比设置为 argument 的百分比。

  4. percentage sumimages 中所有项目的百分比之和。

  5. 如果 percentage sum 小于 100%, 向 images 添加一个包含透明黑色纯色图像的元组, 其尺寸为 size,百分比等于 100% 减去 percentage sum

    否则, 如果 percentage sum 大于 100%, 则对 images 中的每个 item, 将 item 的百分比除以 percentage sum, 并将 item 的百分比设置为结果。

  6. final image 为一个具有 size 尺寸的图像, 每个像素为 每个 item 图像的对应像素的加权线性平均, 权重由 item 的百分比决定。 (对每个像素的颜色通道和 alpha 通道进行平均。) 在此计算中, 每个像素的颜色必须是预乘的 sRGB。

    上述操作的详细信息

    这是对源图像应用 N 路 Porter-Duff dissolve 操作。 维基百科将 dissolve 定义为随机操作, 结果像素独立于源图像的相应像素随机选择, 根据其源图像的权重, 但当像素缩小到无限小时, 这趋于在预乘颜色空间中进行颜色平均。

    特别地,这意味着 `cross-fade(white 50%, transparent 50%)` 将生成部分透明的纯白色图像。 (而不是部分透明的灰色, 这是如果在非预乘空间中对不透明的白色和透明的黑色像素进行平均时会得到的结果。)

    由于转换为预乘会导致一些精度损失, 且图形库可能无法原生支持此操作, 与往常一样,只要能达到指定效果,任何方法都可以使用。

    例如,可以根据每个像素的 alpha 值重新平衡百分比, 然后在非预乘空间中对颜色通道进行平均。 例如,要渲染 cross-fade(rgb(255 0 0 / 1) 40%, rgb(0 255 0 / .5) 20%, rgb(0 0 255 / 0) 40%), 根据 1 / .5 / 0 alpha 值重新平衡百分比 会生成 40% / 10% / 0% (这会重新归一化为 80% / 20% / 0%), 此时可以平均原始颜色通道值 并生成 rgb(204 51 0 / .5) 图像。 (请注意,alpha 通道仍使用原始百分比进行平均, 而不是重新平衡的百分比。)

  7. 返回 final image

2.7. 使用元素作为图像:element() 表示法

element() 函数允许作者将文档中的一个元素作为图像使用。 当引用的元素外观发生变化时,图像也会随之变化。 例如,可以用来创建幻灯片中的下一个/上一个幻灯片的实时预览, 或引用一个 canvas 元素用于生成渐变甚至动画背景。

注意: element() 函数仅复制引用元素的外观, 而非其实际内容和结构。 作者应仅将此功能用于装饰性目的, 并且不得使用 element() 在页面中复制作为重要内容的元素。 相反,只需在文档中插入元素的多个副本。

element() 的语法为:

element() = element( <id-selector> )

其中 <id-selector> 是 ID 选择器 [SELECT]

我们是否需要能够引用外部文档中的元素 (例如 SVG 绘画服务器)? 还是仅使用 url() 就足够了?

该名称与 GCPM 中的一个类似功能冲突。 这需要以某种方式解决。

希望能够为一个元素创建“反射”, 无论是在该元素的背景图片上还是在伪元素中。 这需要特别处理,以避免触发循环检测。

当我们有 overflow:paged 时, 如何引用视图中的单个页面?

element() 函数引用与其参数匹配的元素。 ID 首先在 elementSources 映射中查找, 如该部分所述。 如果未找到, 则与文档匹配。 如果匹配多个元素, 函数引用第一个这样的元素。

element() 函数表示的图像可能会根据元素在文档中是否可见而变化:

一个 渲染的元素, 不是替换元素的后代, 并生成 堆叠上下文
该函数表示图像,其 自然大小 等于引用元素的 装饰边界框

注意: 因为图像默认会裁剪其边界之外的任何内容, 这意味着扩展到 装饰边界框 之外的装饰, 如框阴影, 可能会被裁剪。

该图像通过渲染引用的元素及其后代 (与它们在文档中的大小相同) 在无限的 透明 画布上构建, 位置使 装饰边界框 的边缘与图像的边缘齐平。

要求元素上存在某种程度的堆叠上下文似乎是实现效率的必要条件。 我们需要完整的堆叠上下文,还是只需要伪堆叠上下文? 它是否需要通常是堆叠上下文, 还是我们可以仅在渲染到 element() 时将其作为堆叠上下文渲染?

如果引用的元素或其祖先应用了变换, 则在将元素渲染为图像时必须忽略该变换。[CSS3-TRANSFORMS]

如果引用的元素跨页断开, 则元素显示为页面内容区域在分页方向上彼此连接的样式, 页边缘与初始包含块的起始边对齐。跨行或跨列断开的元素仅按照其 装饰边界框 进行渲染。

实现可以重新使用为引用元素生成的现有位图数据, 或重新生成该元素的显示以最大化图像大小的质量 (例如,如果实现检测到引用元素是 SVG 片段); 在后者情况下, 图像中的引用元素布局不得因重新生成过程而更改。 也就是说,图像必须与引用元素看起来相同, 除了光栅化质量外。

作为一个有点滑稽的例子,p 元素可以在文档中的其他地方作为背景重复使用:

<style>
#src { color: white; background: lime; width: 300px; height: 40px; position: relative; }
#dst { color: black; background: element(#src); padding: 20px; margin: 20px 0; }
</style>
<p id='src'>我是一个普通的元素!</p>
<p id='dst'>我在使用上一个元素作为我的背景!</p>

一个 未渲染的元素, 但它提供了一个 绘画源
函数表示图像,其 自然尺寸 和外观为 绘画源。 主机语言定义了绘画源的大小和外观。
例如,element() 函数可以引用 HTML 文档中的 SVG <pattern> 元素:
<!DOCTYPE html>
<svg>
<defs>
<pattern id='pattern1'>
  <path d='...'>
</pattern>
</defs>
</svg>
<p style="background: element(#pattern1)">
我在使用图案作为背景!
如果图案被更改或动画化,
我的背景也会随之更新!
</p>

HTML 还定义了一些元素, 例如 canvasimg、 和 video, 提供了一个绘画源。 这意味着 CSS 例如可以引用一个正在绘制的 canvas, 但该 canvas 未显示在页面中:

<!DOCTYPE html>
<script>
var canvas = document.querySelector('#animated-bullet');
canvas.width = 20; canvas.height = 20;
drawAnimation(canvas);
</script>
<canvas id='animated-bullet' style='display:none'></canvas>
<ul style="list-style-image: element(#animated-bullet);">
<li>我在使用 canvas 作为项目符号!</li>
<li>我也是!</li>
<li>当 JavaScript 随时间更改 canvas 时,
  我们都会随之更新我们的项目符号图像!</li>
</ul>
其他任何内容

函数表示 无效图像

例如,所有以下 element() 使用都会导致透明背景:

<!DOCTYPE html>
<p id='one' style="display:none; position: relative;">one</p>
<iframe src="http://example.com">
<p id='two' style="position: relative;">我是回退内容!</p>
</iframe>
<ul>
<li style="background: element(#one);">
display:none 元素不会渲染,P 元素也不会提供绘画源。
</li>
<li style="background: element(#two);">
替换元素(如 IFRAME)的后代不能在 element() 中使用。
</li>
<li style="background: element(#three);">
没有 ID 为 "three" 的元素,因此这也会渲染为透明图像。
</li>
</ul>

如果元素没有关联的框,则该元素被定义为未渲染。 例如,当元素或其祖先设置为 display:none 时会发生这种情况。 主机语言可以定义元素被视为未渲染的其他方式; 例如,在 SVG 中, <defs> 元素的任何后代都被视为未渲染。

element() 函数可以用于多种用途。 例如,它可以用来显示幻灯片中上一个或下一个幻灯片的预览:

<!DOCTYPE html>
<script>
function navigateSlides() {
var currentSlide = ...;
document.querySelector('#prev-slide').id = '';
document.querySelector('#next-slide').id = '';
currentSlide.previousElementSibling.id = 'prev-slide';
currentSlide.nextElementSibling.id = 'next-slide';
}
</script>
<style>
.slide {
/* 需要成为堆叠上下文才能在 element() 中使用。 */
position: relative;
}
#prev-preview, #next-preview {
position: fixed;
...
}
#prev-preview { background: element(#prev-slide); }
#next-preview { background: element(#next-slide); }
</style>
<a id='prev-preview'>上一个幻灯片</a>
<a id='next-preview'>下一个幻灯片</a>
<section class='slide'>...</section>
<section class='slide current-slide'>...</section>
...

在此示例中,navigateSlides 函数更新了下一个和上一个幻灯片的 ID, 然后在幻灯片旁边的小浮动框中显示。 由于无法通过 element() 函数与幻灯片进行交互(它只是一个图像), 甚至可以在预览框上使用 click 处理程序帮助页面导航。

2.7.1. 绘画源

主机语言可以定义一些元素提供绘画源。 绘画源具有固有的外观,并且可以在不进行布局或渲染的情况下获得具体对象大小, 因此即使它们未渲染,也可以用作图像。

在 HTML 中,imgvideo、 和 canvas 元素提供绘画源。

在 SVG 中,任何提供绘画服务器的元素都提供绘画源。注意:在 SVG1.1 中, <linearGradient><radialGradient>、 和 <pattern> 元素 提供绘画源。 它们按照规范中的描述绘制, 坐标系统定义如下:

objectBoundingBox
坐标系统的原点位于 具体对象大小定义的矩形的左上角, 它与 具体对象大小的宽度和高度相同。 单个用户坐标具体对象大小的宽度和高度。
userSpaceOnUse
坐标系统的原点位于 具体对象大小定义的矩形的左上角, 它与 具体对象大小的宽度和高度相同。用户坐标与 CSS px 单位等价。

注意: 预计此模块的未来版本将定义引用外部文档中的绘画源的方法, 或者由脚本创建的、从未插入文档中的绘画源。

2.7.2. 使用文档外的资源:ElementSources接口

element() 函数通常在文档内选择元素, 但提供绘画源的元素不一定需要在文档中。 例如,HTML canvas 元素可以完全在脚本中创建、维护和绘制, 而不需要直接插入文档中。

只需要一种引用元素的方式, 因为ID选择器不能选择文档外的元素。 elementSources 映射对象提供了这种方式。

partial namespace CSS {
  [SameObject] readonly attribute any elementSources;
};

任何在elementSources 映射中的条目,其字符串键和值是提供 绘画源的对象,都可用于 element() 函数。

每当 element() 使用 <id-selector> 时, ID 的值(不带前缀 # 字符)首先会在 elementSources 映射中查找:

这种 ID 选择器的重用与 Moz 行为匹配。 我正试图避免在语法开始时直接使用<custom-ident>, 因为这样会占用太多语法空间。 另一种可能性是用语言定义的关键字后跟<custom-ident>, 如 element(external fancy) 或类似的名称。 欢迎命名建议。

例如,使用外部画布可以制作花哨的动画背景:
<script>
var bg = document.createElement('canvas');
bg.height = 200;
bg.width = 1000;
drawFancyBackground(bg);
CSS.elementSources.set('fancy', bg);
</script>
<style>
h1 {
  background-image: element(#fancy);
}
</style>

当“fancy”画布被绘制和动画化时, 所有 H1 元素的背景将自动同步更新。

注意,elementSources 映射会在文档之前进行查找以匹配 ID 选择器, 因此即使文档中存在与 #fancy 匹配的元素, 背景仍会始终来自 elementSources 值。

2.7.3. 循环检测

element() 函数可能会产生无意义的循环关系, 例如一个元素将自己用作自己的背景。 这些关系可以通过跟踪依赖关系图并使用常见的循环检测算法轻松可靠地检测和解决。

依赖关系图包含以下边缘:

如果图中存在循环, 则任何参与循环的 element() 函数都是无效图像

3. 渐变

渐变是一种从一种颜色平滑过渡到另一种颜色的图像。 这些通常用于背景图像、按钮等的细微阴影。 本节描述的 渐变函数 允许作者以简洁的语法指定此类图像, 以便用户代理在渲染页面时自动生成图像。 <gradient> 的语法如下:

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

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

渐变绘制在具有具体对象尺寸的框中, 称为渐变框。 然而,渐变本身没有自然尺寸

例如,如果你将渐变用作背景, 默认情况下,渐变将在与元素的填充框大小相同的渐变框中绘制。 如果background-size显式设置为 100px 200px, 那么 渐变框 将是 100px 宽和 200px 高。 同样,使用渐变作为list-style-image, 框将是 1em 的正方形, 这是该属性的默认对象大小

渐变通过定义起点终点来指定 渐变线(根据渐变类型, 渐变线可以是直线、射线或螺旋), 然后在这条线上指定颜色。 颜色平滑地填充在这条线的其余部分, 然后每种类型的渐变定义如何使用渐变线的颜色生成实际渐变。

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

该级别为 <color-interpolation-method> 参数 添加到linear-gradient()repeating-linear-gradient()中, 该参数用于指定在渐变线上进行颜色插值时使用的颜色空间和路径。 详见CSS Color 4 § 12. 颜色插值

linear-gradient() = linear-gradient(
[ [ <angle> | to <side-or-corner> ] || <color-interpolation-method> ]? ,
<color-stop-list>
)
<side-or-corner> = [left | right] || [top | bottom]

3.1.1. 颜色空间对插值的影响:示例

本节为非规范性内容。

颜色空间对插值的影响可能非常显著。

在此示例中,使用相同颜色对 #f01 和 #081 的线性渐变 在三种不同的颜色空间中绘制。 中间的渐变使用了 gamma 编码的 sRGB, 这是 CSS Images 3 中唯一的选择; 结果在中点明显过暗。 上方的渐变使用 CIE Lab, 提供了更具感知均匀性的结果; 下方的渐变使用 Oklab, 其结果与 CIE Lab 几乎相同。

红色到绿色的渐变在三种颜色空间中的表现

在此示例中,使用相同颜色对 white 和 #01E 的线性渐变 在三种不同的颜色空间中绘制。 中间的渐变使用了 gamma 编码的 sRGB, 结果在中点依然过暗, 稍微有些去饱和,且带有轻微的紫色调。 上方的渐变使用 CIE Lab, 避免了过暗的中点 但带有明显的紫色调; 下方的渐变使用 Oklab, 提供了更具感知均匀性的结果, 且没有紫色调。

白色到蓝色的渐变在三种颜色空间中的表现

在此示例中,使用相同颜色对 #44C 和 #795 的线性渐变 在三种不同的颜色空间中绘制。 这表明 CIE Lab 的色调非线性影响了所有偏蓝的颜色, 而不仅仅是从饱和的原色蓝到白色的渐变。 中间的渐变使用了 gamma 编码的 sRGB, 结果在中点依然过暗, 并带有轻微的紫色调。 上方的渐变使用 CIE Lab, 避免了过暗的中点 但带有明显的紫色调; 下方的渐变使用 Oklab, 再次提供了更具感知均匀性的结果, 且没有紫色调。

蓝色到绿色的渐变在三种颜色空间中的表现

选择极坐标颜色空间,而不是矩形颜色空间来进行渐变插值时, 可以避免颜色停靠点之间色调相距较远时的去饱和现象。 在极坐标颜色空间中插值具有天然的色度保持特性, 尽管中间颜色可能容易超出色域; 它们将被映射回色域以内。

在此示例中,使用相同的颜色对 #A37 和 #595 的线性渐变 在五种不同的颜色空间中绘制, 其中两种是极坐标空间。 从上到下: CIE LCH,CIE Lab,sRGB,Oklab,Oklch。

矩形空间的中点偏灰, 而极坐标空间的中间颜色沿着弯曲的、保持色度的路径变化。

蓝色到绿色渐变在五种颜色空间中的表现

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

本级别为<color-interpolation-method>参数 添加到了radial-gradient()repeating-radial-gradient(), 以指示在渐变线上进行颜色插值时使用的颜色空间和路径。 参见 CSS Color 4 §  12. Color Interpolation

radial-gradient() = radial-gradient(
  [ [ [ <rg-ending-shape> || <rg-size> ]? [ at <position> ]? ] || <color-interpolation-method>]? ,
  <color-stop-list>
)
在此示例中,使用相同的颜色对 color(display-p3 0.918 0.2 0.161) 和 #081 的径向渐变 在三种不同的颜色空间中绘制。 请注意,颜色停靠点不必都在同一颜色空间中。 中间的渐变使用了伽马编码的 sRGB, 结果是中间点明显太暗。 上面的渐变使用了 CIE Lab, 给出了更为感知均匀的结果; 而下面的渐变使用了 Oklab, 在此给出了与 CIE Lab 几乎相同的结果。

在三种颜色空间中的红色到绿色渐变

3.3. 圆锥渐变:conic-gradient() 表示法

圆锥渐变从指定圆的中心开始,类似于径向渐变, 但圆锥渐变的颜色停靠点放置在圆周周围, 而不是从中心发出的线条上, 这使得颜色在围绕中心旋转时逐渐过渡, 而不是从中心向外渐变。

圆锥渐变通过指定旋转角度、渐变的中心, 然后指定颜色停靠点列表来定义。 与线性和径向渐变不同, 它们的颜色停靠点是通过指定<长度>, 圆锥渐变的颜色停靠点通过指定<角度>来定义。 然后从中心画出指向各个方向的光线, 每条光线的颜色等于其与渐变线相交处的颜色。

注意:这些渐变称为“圆锥”或“圆锥形”渐变, 因为如果颜色停靠点在一侧明显比另一侧亮, 它会呈现出类似从上方观察圆锥的图案。 它们在某些上下文中也被称为“角度”渐变, 因为它们是通过改变光线的旋转角度产生的。

[一张图片展示了一个盒子,其背景从白色逐渐顺时针转为黑色,从顶部开始。显示了一个渐变圆,分别在0度和216度的位置显示颜色。]

此示例直观地展示了 conic-gradient(at 25% 30%, white, black 60%) 将如何绘制。请注意,由于颜色停靠点的位置总是解析为角度, at 25% 30% 的唯一效果是对渐变进行二维平移, 它不会影响渐变的绘制方式。

3.3.1. conic-gradient() 语法

圆锥渐变的语法为:

conic-gradient() = conic-gradient(
  [ [ [ from <角度> ]? [ at <位置> ]? ] || <颜色插值方法> ]? ,
  <角度颜色停靠点列表>
)

参数定义如下:

<角度>
整个渐变按照该角度旋转。 如果省略,默认为 0deg。 如果 <角度> 的值为零,则可以省略单位标识符。
<位置>
确定渐变的渐变中心<位置> 类型(也用于 background-position) 在 [CSS-VALUES-3] 中定义, 使用中心点作为对象区域, 使用渐变盒子 作为定位区域进行解析。 如果省略此参数,则默认为 center

通常在圆锥渐变中, 0deg 的突变是不理想的, 通常通过确保第一个和最后一个颜色停靠点为相同颜色来避免。 或许可以提供一个关键词来自动实现这一点。

半径(内外半径)用于剪裁渐变是否有用? 如果有用,我们还可以支持在颜色停靠点位置使用长度值,因为我们现在有一个特定的半径。

椭圆形圆锥渐变是否有用? 图形库是否支持?

3.3.2. 放置颜色停靠点

颜色停靠点被放置在渐变线上, 该线围绕着渐变中心形成一个圆形, 0% 和 100% 的位置都在 0deg。 就像线性渐变一样,0deg 指向页面顶部, 增加的角度对应于围绕圆的顺时针方向移动。

注意: 可能更有帮助的是将渐变线视为形成螺旋, 其中仅呈现从 0deg 到 360deg 的段。 这可以避免当角度超出呈现区域时产生的任何 "重叠" 混淆。

颜色停靠点可以放置在 0% 之前或 100% 之后的位置; 虽然这些区域不会直接用于渲染, 但放置在这些区域的颜色停靠点可以通过插值或重复(见 重复渐变) 影响渲染区域内的颜色停靠点。 例如,conic-gradient(red -50%, yellow 150%) 产生的圆锥渐变 从 0deg 开始为红橙色(具体为 #f50), 并在 360deg 过渡为橙黄色(具体为 #fa0)。

渐变中任何点的颜色通过首先找到唯一的射线来确定, 该射线锚定在渐变中心并穿过给定点。 然后该点的颜色是该射线与渐变线相交处的颜色。

3.3.3. 圆锥渐变示例

以下所有 conic-gradient() 示例均假定应用于宽 300px 高 200px 的盒子, 除非另有说明。

下面是指定同一基本圆锥渐变的不同方式:
background: conic-gradient(#f06, gold);
background: conic-gradient(at 50% 50%, #f06, gold);
background: conic-gradient(from 0deg, #f06, gold);
background: conic-gradient(from 0deg at center, #f06, gold);
background: conic-gradient(#f06 0%, gold 100%);
background: conic-gradient(#f06 0deg, gold 1turn);

下面是指定同一基本圆锥渐变的不同方式。 这演示了即使角度在 [0deg, 360deg) 之外的颜色停靠点没有被直接绘制, 它们仍然可以影响渐变绘制部分的颜色。
background: conic-gradient(white -50%, black 150%);
background: conic-gradient(white -180deg, black 540deg);
background: conic-gradient(hsl(0,0%,75%), hsl(0,0%,25%));

下面是指定相同旋转圆锥渐变的两种不同方式,一种有旋转角度,另一种没有:
background: conic-gradient(from 45deg, white, black, white);
background: conic-gradient(hsl(0,0%,75%), white 45deg, black 225deg, hsl(0,0%,75%));

请注意,通过旋转角度偏移每个颜色停靠点将不起作用,并且会产生完全不同的渐变:

background: conic-gradient(white 45deg, black 225deg, white 405deg);

使用圆形渐变叠加的圆锥渐变,用于绘制色相和饱和度轮盘:
background: radial-gradient(gray, transparent),
            conic-gradient(red, magenta, blue, aqua, lime, yellow, red);
border-radius: 50%;
width: 200px; height: 200px;

使用圆锥渐变绘制一个简单的饼图。 0deg 颜色停靠点的位置将被修复为等于之前的颜色停靠点的位置。 这将产生不同颜色的停靠点之间的微小(不可见)过渡, 有效地生成实色段。
background: conic-gradient(yellowgreen 40%, gold 0deg 75%, #f06 0deg);
border-radius: 50%;
width: 200px; height: 200px;

3.4. 重复渐变:repeating-linear-gradient()repeating-radial-gradient()repeating-conic-gradient() 表示法

除了 linear-gradient()radial-gradient()conic-gradient() 之外, 本规范还定义了 repeating-linear-gradient()repeating-radial-gradient(), 和 repeating-conic-gradient() 值。 这些表示法与其前面定义的非重复兄弟项接受相同的值并以相同方式解释。

基本的重复圆锥渐变:
background: repeating-conic-gradient(gold, #f06 20deg);

具有突变过渡的重复颜色停靠点创建了星形背景:
background: repeating-conic-gradient(
                hsla(0,0%,100%,.2) 0deg 15deg,
                hsla(0,0%,100%,0) 0deg 30deg
            ) #0ac;

这里通过具有突变过渡的重复颜色停靠点创建了一个棋盘格:
background: repeating-conic-gradient(black 0deg 25%, white 0deg 50%);
background-size: 60px 60px;

同样的棋盘格可以通过非重复圆锥渐变创建:

background: conic-gradient(black 25%, white 0deg 50%, black 0deg 75%, white 0deg);
background-size: 60px 60px;

3.5. 定义渐变颜色

渐变中的颜色通过 颜色停靠点<颜色> 以及 渐变线 上的对应位置来指定) 和 颜色过渡提示(表示颜色过渡中点的两个 颜色停靠点之间的位置) 这些都放置在 渐变线 上, 从而定义线上的每个点的颜色。 (每个 渐变函数 定义了 渐变线 的形状和长度, 以及其 起始点结束点; 见上文。)

然后,整个渐变区域的颜色 通过将其与 渐变线 上的特定点联系起来,如渐变函数所定义。 UA 可以稍微“抖动”渐变颜色 (在渐变线上的附近颜色之间随机交替单个像素) 以实现更平滑的渐变效果。

3.5.1. 颜色停靠点列表

颜色停靠点过渡提示通过 颜色停靠点列表 指定, 它是两个或多个 颜色停靠点 与可选的 过渡提示交替组成的列表:

<颜色停靠点列表> =
  <线性颜色停靠点> , [ <线性颜色提示>? , <线性颜色停靠点> ]#
<线性颜色停靠点> = <颜色> && <颜色停靠点长度>?
<线性颜色提示> = <长度百分比>
<颜色停靠点长度> = <长度百分比>{1,2}

<角度颜色停靠点列表> =
  <角度颜色停靠点> , [ <角度颜色提示>? , <角度颜色停靠点> ]#
<角度颜色停靠点> = <颜色> && <颜色停靠点角度>?
<角度颜色提示> = <角度百分比>
<颜色停靠点角度> = <角度百分比>{1,2}

<颜色停靠点> = <颜色停靠点长度> | <颜色停靠点角度>
注意,<颜色停靠点列表><角度颜色停靠点列表> 的结构完全相同, 只是在指定停靠点和提示的位置时,一个接受 <长度>, 而另一个接受 <角度>

用铁路图表示, 它们都遵循此模式:

<color-stop> , <color-hint> , <color-stop> ,

具有两个位置的颜色停靠点相当于指定两个具有相同颜色的颜色停靠点,每个位置一个。指定两个位置可以更轻松地在渐变中创建纯色“条纹”,而无需重复两次颜色。

百分比值是相对于渐变线的长度来解析的,起始点为0%,结束点为100%。长度是沿着渐变线起始点朝向结束点的方向测量的。

颜色停靠点过渡提示的位置通常位于起始点结束点之间,但这不是必须的:渐变线在两个方向上无限延伸,位置可以在渐变线上的任何地方指定。

当省略颜色停靠点的位置时,它会自动分配一个位置。颜色停靠点列表中的第一个或最后一个颜色停靠点将分别分配到渐变线起始点结束点。否则,它将被分配到两个相邻停靠点之间的中间位置。如果连续多个停靠点没有指定位置,它们将在相邻的已定位停靠点之间均匀分布。详情请参见§ 3.5.3 颜色停靠点“修复”

3.5.2. 渐变线的着色

在每个 颜色停止点 的位置, 渐变线的颜色 是 颜色停止点的颜色。 在第一个 颜色停止点 之前, 渐变线的颜色 是第一个 颜色停止点 的颜色, 在最后一个 颜色停止点 之后, 渐变线的颜色是最后一个 颜色停止点 的颜色。 在两个 颜色停止点 之间, 渐变线 的颜色将在这两个 颜色停止点 的颜色之间插值, 插值是在指定的颜色空间中进行的,使用预乘的 alpha 值, 如 CSS Color 4 § 12.3 Interpolating with Alpha 中定义。 如果渐变函数中没有指定 <color-interpolation-method>, 渐变插值使用的颜色空间是 [css-color-4] 中定义的默认插值颜色空间。

默认情况下, 这种插值是线性的——在两个 颜色停止点 的距离的 25%、50% 或 75% 处, 颜色是这两个停止点颜色的 25%、50% 或 75% 的混合。

但是,如果在两个 过渡提示 之间提供了一个 颜色停止点, 则插值是非线性的, 由提示控制:

  1. 确定 过渡提示 在两个 颜色停止点 之间的距离所占百分比, 表示为 0 到 1 之间的数字, 其中 0 表示提示位于第一个 颜色停止点, 1 表示提示位于第二个 颜色停止点。 设这个百分比为 H
  2. 对于两个颜色停止点之间的任何位置, 确定该点的位置作为两个 颜色停止点 之间距离的百分比, 方式与上一步相同。 设这个百分比为 P
  3. C 为该点的颜色权重, 其值为 PlogH(.5)
  4. 该点的颜色是两个 颜色停止点 颜色的线性混合, 混合 (1 - C) 的第一个停止点颜色和 C 的第二个停止点颜色。

注意: 过渡提示 指定了“中间颜色”(两个相邻颜色停止点颜色的 50% 混合)的放置位置。 当提示位于两个相邻颜色停止点的中间时, 上述插值算法 会产生普通的线性插值。 如果提示位于其他位置, 则会在相邻颜色停止点之间产生平滑的指数曲线, “中间颜色”会正好出现在提示指定的位置。

下面是一个没有 过渡提示(顶部)的线性渐变,与在红色和蓝色颜色停止点之间有过渡提示(底部)的渐变进行对比。

顶部 - 无过渡提示(默认使用中间过渡提示):

background: linear-gradient(to right, red 0%, blue 100%);

底部 - 有过渡提示:

background: linear-gradient(to right, red 0%, 25%, blue 100%);

如果多个 颜色停止点 具有相同的位置, 它们会从列表中首先指定的颜色突然过渡到最后指定的颜色。 实际上,颜色在该位置会突然变化,而不是平滑过渡。

3.5.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. 1D 图像值:<image-1D> 类型和 stripes() 表示法

虽然 <image> 值代表二维 (2D) 图像, <color> 值可以被视为零维 (0D) 图像(在任一轴上都不变化),某些上下文需要一维 (1D) 图像,它沿抽象的、无方向的单轴 绘制线 指定颜色。

<image-1D> = <stripes()>
<stripes()> = stripes( <color-stripe># ) 
<color-stripe> = <color> && [ <length-percentage> | <flex> ]? 

stripes() 函数将 1D 图像 定义为用逗号分隔的彩色条纹列表, 每个条纹按顺序依次放置在 绘制线 上。

每个 <color-stripe> 条目定义了具有指定 <color> 的实心条纹和厚度。如果省略厚度,它默认为 1fr。厚度值解释如下:

<percentage [0,100]>
百分比厚度是相对于 总宽度 的。只有 0%100% (含)之间的值是有效的。
<length [0,∞]>
负长度值是无效的。
<flex>
<flex> 是相对于函数中 <flex> 条目的总和相对于 总宽度 的一部分计算的, 在减去任何非 <flex> 条目的厚度后(向下取零)。如果 <flex> 值的总和小于 1fr,则减法结果将乘以总和的值,然后分配。

在使用 stripes() 函数的上下文中定义了 total width。如果条纹的总和小于 total width,则剩余长度的 绘制线条透明黑色,就像给出了一个最终的 透明 参数一样。如果总和大于 total width,超出 total width 的任何条纹或部分将被截断。

例如,stripes(red 1fr, green 2fr, blue 100px),其 total width400px,将生成一个 100px 的红色条纹和 200px 的绿色条纹,分别给红色 1 份额和绿色 2 份额,剩下的 300px 是从 400px 总数中减去蓝色的 100px 后得到的。

另一方面,stripes(red .1fr, green .2fr, blue 100px),其 total width400px,将生成 30px 的红色条纹和 60px 的绿色条纹,接着是 100px 的蓝色,然后是 210px 的透明。剩余的 300px 被乘以 .3,即 <flex> 值总和的值,得出仅 90px,然后按 1:2 的比例分配,这由 <flex> 值决定。

(这类似于 弹性布局 如何处理行上的小 <flex> 总和,并确保当 <flex> 值接近零时,行为平滑连续。)

该函数的 计算值 是一个有序的条纹列表,每个条纹都有一个 计算颜色,并且其厚度表示为 <flex> 值或 <length-percentage> 的计算值。

5. 在 CSS 中调整图像和对象的大小

5.1. 调整对象大小:object-fit 属性

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

object-fit 属性指定替换元素的内容应如何适应其使用的高度和宽度所建立的框。

fill
替换内容被调整大小以填充元素的内容框:对象的 具体对象大小 是元素使用的宽度和高度。
none
替换内容未调整大小以适应元素的内容框:使用 默认尺寸算法 确定对象的 具体对象大小,且未指定尺寸,默认对象大小等于替换元素的使用宽度和高度。
contain
替换内容被调整大小以保持其宽高比,同时适应元素的内容框:其 具体对象大小 作为 contain 约束 针对元素使用的宽度和高度进行解析。

如果使用了 scale-down 标志,则按 nonecontain 指定的方式调整内容大小,以产生更小的 具体对象大小

注意: nonecontain 都尊重内容的 自然宽高比,因此“更小”的概念定义明确。

cover
替换内容被调整大小以保持其宽高比,同时填满元素的整个内容框:其 具体对象大小 作为 cover 约束 针对元素使用的宽度和高度进行解析。

如果使用了 scale-down 标志,则按 nonecover 指定的方式调整内容大小,以产生更小的 具体对象大小

注意: nonecover 都尊重内容的 自然宽高比,因此“更小”的概念定义明确。

scale-down
等同于 contain scale-down

如果内容没有完全填充替换元素的内容框,未填充的空间将显示替换元素的背景。由于替换元素始终将其内容裁剪到内容框中,因此内容永远不会溢出。有关相对于内容框定位对象的信息,请参阅 object-position 属性。

示例显示了 object-fit 的四个值如何导致替换元素(蓝色图形)按高度/宽度框(绿色背景)进行缩放,使用 object-position 的初始值。在这种情况下,scale-downscale-down contain 看起来与 contain 相同,scale-down cover 看起来与 none 相同。

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

注意: 根据 对象大小协商 算法,具体对象大小(或在这种情况下,内容的大小)不会直接缩放对象本身——它只是作为有关可见画布大小的信息传递给对象。然后如何在该大小内绘制取决于图像格式。特别是,栅格图像总是缩放到给定的大小,而 SVG 使用给定的大小作为“SVG 视口”的大小(SVG 定义的术语),然后使用根 <svg> 元素上的多个属性值来确定如何绘制自身。

6. 图像处理

6.1. 覆盖图像分辨率: image-resolution 属性

图像分辨率定义为每单位长度的图像像素数,例如每英寸的像素数。一些图像格式可以记录图像的分辨率信息。此信息在格式化过程中确定图像的实际大小时可能有用。然而,信息也可能是错误的,这种情况下应忽略该信息。默认情况下,CSS 假设每 CSS px 单位有一个图像像素;但是,image-resolution 属性允许使用其他分辨率。

名称: image-resolution
值: [ from-image || <resolution> ] && snap?
初始值: 1dppx
应用于: 所有元素
是否继承:
百分比: 不适用
计算值: 指定的关键字和/或 <resolution>(可能调整为 snap,见下文)
规范顺序: 按语法
动画类型: 离散

image-set() 表示法可以改变图像的自然分辨率,理想情况下应自动遵循该分辨率,而不需要设置此属性。我们应如何最好地解决这一问题?将初始值更改为 auto,表示“1dppx,除非 CSS 另有规定”?说明 image-resolution 对分辨率已通过 CSS 设置的图像无效?或者以某种方式修改 image-set(),使其始终以某种方式生成 1dppx 的图像?

image-resolution 属性指定所有在元素中或元素上的光栅图像的首选分辨率。它影响内容图像(例如替换元素和生成的内容)和装饰图像(例如 background-image)。图像的首选分辨率用于确定图像的自然尺寸。值具有以下含义:

<resolution>
明确指定首选分辨率。"点"在这种情况下对应于单个图像像素。
from-image
图像的首选分辨率取决于图像格式指定的分辨率(自然分辨率)。如果图像未指定其分辨率,则使用明确指定的分辨率(如果有),否则默认为 1dppx

注意: CSS Images 3 § 2.1.2 图像元数据 对可以使用的元数据施加了一些限制。

snap
如果提供了“snap”关键字,则计算的<resolution>(如果有)是指定的分辨率四舍五入到最接近的值,该值会将一个图像像素映射到整数数量的设备像素。如果分辨率取自图像,则使用的自然分辨率也类似调整。

由于 SVG 等矢量格式没有自然分辨率,因此该属性对矢量图像无效。

打印机的分辨率通常比电脑显示器高得多;因此,在屏幕上看起来很好的图像打印出来时可能显得像素化。image-resolution 属性可以用于将高分辨率图像嵌入文档中并保持适当的大小,确保在屏幕和纸张上都能有吸引人的显示:
img.high-res {
  image-resolution: 300dpi;
}

设置此属性后,分辨率为 300dpi,宽度为 5 英寸的图像将实际显示为 5 英寸宽;如果未设置该属性,则图像将显示为约 15.6 英寸宽,因为图像宽度为 15000 个像素,而默认情况下 CSS 每英寸显示 96 个像素。

一些图像格式可以将图像分辨率编码到图像数据中。此规则指定 UA 应使用图像本身的分辨率,回退到每 CSS px 单位 1 个图像像素。
img { image-resolution: from-image }

这些规则都指定 UA 应使用图像本身的分辨率,但如果图像没有分辨率,则将分辨率设置为 300dpi,而不是默认的 1dppx

img { image-resolution: from-image 300dpi }
img { image-resolution: 300dpi from-image }
使用此规则,图像分辨率设置为 300dpi。(图像中的分辨率(如果有)将被忽略。)
img { image-resolution: 300dpi }

另一方面,如果在屏幕分辨率为 96dpi 时使用该规则,图像将以 288dpi 渲染(3 个图像像素映射到 1 个设备像素):

img { image-resolution: 300dpi snap; }

当从图像中获取分辨率时,也可以使用snap 关键字:

img { image-resolution: snap from-image; }

在上述情况下,声明为 300dpi 的图像将以 288dpi 显示(3 个图像像素映射到 1 个设备像素),而声明为 72dpi 的图像将以 96dpi 渲染(1 个图像像素映射到 1 个设备像素)。

7. 插值

本节描述了如何在本规范中定义的新值类型之间进行插值,以便与 CSS 过渡和 CSS 动画等模块一起使用。

如果以下算法仅说明两个值应“插值”或“过渡”而没有进一步详细说明,则应按照过渡规范中的描述对值进行插值。否则,算法可能会在其插值的详细描述中引用变量 t。这是一个从 0% 开始到 100% 结束的数字,并设置为表示过渡进展的值,基于过渡的持续时间、经过的时间以及正在使用的计时函数。例如,使用线性计时函数和 1 秒持续时间,在 0.3 秒后,t 等于 30%。

7.1. 插值 <image>

所有图像都可以进行插值,尽管某些特殊类型的图像(如某些渐变)有其自己的特殊插值规则。一般来说,图像通过将它们缩放到 start image 的大小,并在转换到 end image 的大小时交叉淡化这两个图像来进行插值。

具体来说,在插值的每个点,图像等于 cross-fade( (100% - t) start image, end image)

特殊情况:插值到/从无图像,例如“background-image: url(foo);”到“background-image: none;”。

7.2. 插值 cross-fade()

cross-fade() 的三个组成部分独立进行插值。请注意,这可能会导致嵌套的 cross-fade() 表示法。

7.3. 插值 <gradient>

本节需要审核和改进。特别是,我认为对 linear-gradient() 的处理不完整——我们需要明确地在起始位置和结束位置之间插值渐变线的“长度”(0% 到 100% 之间的距离),以避免在一次动画过程中先增长然后缩小。

渐变图像可以在 CSS 过渡和动画中直接插值,平滑地从一个渐变动画到另一个。对允许插值的渐变只有少数限制:

  1. 起始和结束渐变必须用相同的函数表示。(例如,可以从 linear-gradient() 过渡到 linear-gradient(),但不能从 linear-gradient() 过渡到 radial-gradient()repeating-linear-gradient()。)

  2. 起始和结束渐变必须具有相同数量的 <color-stop>。出于这个目的,所有重复渐变都被认为具有无限的颜色停止点,因此所有重复渐变在这方面都是匹配的。

  3. 两个渐变都不能使用 <length><percentage> 颜色停止点的组合。

如果两个渐变满足所有这些限制,则必须按如下所述进行插值。如果它们仅不满足第三个限制,则必须在 50% 处突然过渡(除非未来的规范另有规定)。如果它们不满足前两个限制中的任何一个,则必须像通用图像一样使用 cross-fade() 进行插值。

注意: 50% 处的突然过渡是为了防止内容依赖于交叉淡化,并且可以在未来为这种情况添加更智能的插值规则。

  1. 将起始渐变和结束渐变都转换为其明确形式:

    对于线性渐变:
    • 如果方向被指定为 <angle>,它已经是明确形式。

    • 否则,将其方向更改为 [0deg,360deg) 范围内的 <angle>,以产生等效的渲染效果。

      如果起始和结束渐变的方向都是通过关键字指定的,并且它们方向映射的角度的绝对差大于 180deg,则将较小角度的渐变方向加上 360deg。这确保了从“to left”(270deg)到“to top”(0deg)的过渡按照预期顺时针旋转四分之一圈,而不是逆时针旋转四分之三圈。

    对于径向渐变:
  2. 独立插值渐变的每个组件和颜色停止点。对于线性渐变,唯一的组件是角度。对于径向渐变,组件是中心的水平和垂直位置以及水平和垂直轴长度。

  3. 要插值颜色停止点,首先将起始渐变中的每个颜色停止点与结束渐变中相同索引处的对应颜色停止点匹配。对于重复渐变,起始和结束渐变中的第一个指定颜色停止点被认为位于相同的索引处,所有其他颜色停止点按需重复和移动每个渐变的颜色停止点列表。然后,对于每对颜色停止点,独立插值位置和颜色。

7.4. 插值 stripes()

类似于渐变,两个 stripes() 可以插值,从而允许从一个图像平滑过渡到另一个图像。对允许插值的 stripes() 只有少数限制:

  1. 起始和结束图像必须具有相同数量的 <color-stripe>

  2. 两个图像都不能使用 <length><percentage><flex> 条纹的组合。

如果两个图像满足这两个限制,则必须按如下所述进行插值。如果它们仅不满足第二个限制,则必须在 50% 处突然过渡(除非未来的规范另有规定)。如果它们不满足第一个限制,则必须像通用图像一样使用 cross-fade() 进行插值。

注意: 50% 处的突然过渡是为了防止内容依赖于交叉淡化,并且可以在未来为这种情况添加更智能的插值规则。

  1. 独立插值图像的每个组件和条纹。

  2. 要插值条纹,首先将起始图像中的每个条纹与结束图像中相同索引处的对应条纹匹配。然后,对于每对条纹,独立插值 厚度颜色

8. 序列化

本节描述了为与 CSS 对象模型 [CSSOM] 交互而引入的所有新属性和值类型的序列化。

要序列化此模块中定义的任何函数,请按照其各自的语法顺序进行序列化,在不改变含义的情况下省略组件,使用单个空格连接空格分隔的标记,并在每个序列化逗号后跟一个空格。

对于 cross-fade(),始终序列化 <percentage>

例如,指定为:
Linear-Gradient( to bottom, red 0%,yellow,black 100px)

必须序列化为:

linear-gradient(rgb(255, 0, 0), rgb(255, 255, 0), rgb(0, 0, 0) 100px)

附录 A: 弃用功能和别名

实现必须接受 -webkit-image-set() 作为 image-set() 的解析时别名。(这是一个有效值,参数与 image-set() 相同,并在解析过程中转换为 image-set()。)

9. 隐私考虑

注意:[css-images-3] 相同。

10. 安全考虑

注意:[css-images-3] 相同。

11. 变更

2017年4月13日 工作草案以来的变更

2012年9月11日工作草案以来的变更

自第 3 级以来的变更

符合性

文档约定

符合性要求通过描述性断言和 RFC 2119 术语的组合来表达。关键字“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”在本规范的规范性部分中应按照 RFC 2119 中的描述进行解释。然而,为了可读性,这些词在本规范中并未全部使用大写字母。

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

本规范中的示例以“例如”引入,或通过 class="example" 从规范性文本中分离出来,例如:

这是一个信息性示例。

信息性注释以“Note”开头,并通过 class="note" 与规范性文本分离,例如:

注意,这是一个信息性注释。

建议性内容是规范性部分,样式上具有特殊强调,并通过 <strong class="advisement"> 分离出来,例如: 用户代理 (UA) 必须提供可访问的替代方案。

符合性类别

本规范的符合性定义为三个符合性类别:

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

样式表符合本规范的要求,如果它使用此模块中定义的语法的所有声明根据通用 CSS 语法和此模块中定义的每个特性的单独语法都是有效的。

渲染器符合本规范的要求,如果除了按照适当的规范解释样式表外,还通过正确解析所有功能并相应渲染文档,支持本规范中定义的所有功能。然而,UA 因设备限制无法正确渲染文档的情况不会导致 UA 不符合规范。(例如,UA 不需要在单色显示器上渲染颜色。)

创作工具符合本规范的要求,如果它编写的样式表在语法上符合通用 CSS 语法和此模块中每个特性的单独语法,并符合本模块中描述的样式表的所有其他符合性要求。

部分实现

为了让作者能够利用向前兼容的解析规则指定回退值,CSS 渲染器必须将所有没有可用支持级别的 @规则、属性、属性值、关键字和其他语法结构视为无效,并适当忽略。特别是,用户代理不得在单个多值属性声明中选择性忽略不支持的组件值并保留支持的值:如果任何值被视为无效(如不支持的值必须被视为无效),CSS 要求整个声明被忽略。

不稳定和专有功能的实现

为了避免与未来稳定的 CSS 功能发生冲突,CSSWG 建议遵循最佳实践来实现 不稳定的功能和 CSS 的 专有扩展

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现就有可能,且实现者应发布符合规范的任何 CR 级别功能的无前缀实现,并证明其正确实现。

为了建立并保持 CSS 在不同实现中的互操作性,CSS 工作组要求非实验性 CSS 渲染器在发布任何 CSS 功能的无前缀实现之前,向 W3C 提交实现报告(如有必要,还需提交该实现报告使用的测试用例)。提交给 W3C 的测试用例将由 CSS 工作组审查和更正。

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

索引

本规范定义的术语

参考定义的术语

参考文献

规范性参考

[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS 背景和边框模块第 3 级. 2023年2月14日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS 层叠和继承第 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 颜色模块第 4 级. 2022年11月1日. CR. URL: https://www.w3.org/TR/css-color-4/
[CSS-GRID-2]
Tab Atkins Jr.; Elika Etemad; Rossen Atanassov. CSS 网格布局模块第 2 级. 2020年12月18日. CR. URL: https://www.w3.org/TR/css-grid-2/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS 图片模块第 3 级. 2020年12月17日. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS-IMAGES-5]
CSS 图片模块第 5 级. URL: https://drafts.csswg.org/css-images-5/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS 列表和计数器模块第 3 级. 2020年11月17日. WD. URL: https://www.w3.org/TR/css-lists-3/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS 盒子尺寸模块第 3 级. 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-UI-4]
Florian Rivoal. CSS 基本用户界面模块第 4 级. 2021年3月16日. WD. URL: https://www.w3.org/TR/css-ui-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块第 3 级. 2022年12月1日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值和单位模块第 4 级. 2022年10月19日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS2]
Bert Bos; et al. 层叠样式表第 2 级修订 1 (CSS 2.1) 规范. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS22]
Bert Bos. 层叠样式表第 2 级修订 2 (CSS 2.2) 规范. 2016年4月12日. WD. URL: https://www.w3.org/TR/CSS22/
[CSS3-TRANSFORMS]
Simon Fraser; et al. CSS 变换模块第 1 级. 2019年2月14日. CR. URL: https://www.w3.org/TR/css-transforms-1/
[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS 对象模型 (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[FETCH]
Anne van Kesteren. Fetch 标准. 现行标准. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML 标准. 现行标准. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 标准. 现行标准. URL: https://infra.spec.whatwg.org/
[MEDIA-FRAGS]
Raphaël Troncy; et al. 媒体片段 URI 1.0 (基本). 2012年9月25日. REC. URL: https://www.w3.org/TR/media-frags/
[MIMESNIFF]
Gordon P. Hemsley. MIME 嗅探标准. 现行标准. URL: https://mimesniff.spec.whatwg.org/
[PNG]
Tom Lane. 可移植网络图形 (PNG) 规范(第二版). 2003年11月10日. REC. URL: https://www.w3.org/TR/PNG/
[RFC2119]
S. Bradner. 在 RFC 中使用关键字以指示要求级别. 1997年3月. 最佳现行做法. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECT]
Tantek Çelik; et al. 选择器第 3 级. 2018年11月6日. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. 选择器第 4 级. 2022年11月11日. WD. URL: https://www.w3.org/TR/selectors-4/
[SVG-INTEGRATION]
Cameron McCormack; Doug Schepers; Dirk Schulze. SVG 集成. 2014年4月17日. WD. URL: https://www.w3.org/TR/svg-integration/
[SVG11]
Erik Dahlström; et al. 可伸缩矢量图形 (SVG) 1.1(第二版). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/
[URL]
Anne van Kesteren. URL 标准. 现行标准. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 标准. 现行标准. URL: https://webidl.spec.whatwg.org/

参考性参考文献

[CSS-FLEXBOX-1]
Tab Atkins Jr.; et al. CSS 弹性盒布局模块第 1 级. 2018年11月19日. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[SMIL10]
Philipp Hoschka. 同步多媒体集成语言 (SMIL) 1.0 规范. 1998年6月15日. REC. URL: https://www.w3.org/TR/1998/REC-smil-19980615/

属性索引

名称 初始值 应用于 继承 百分比 动画类型 规范顺序 计算值
image-resolution [ from-image || <resolution> ] && snap? 1dppx 所有元素 不适用 离散 按语法 指定的关键字和/或 <resolution>(可能根据 snap 调整,详见下文)
object-fit 填充 | 无 | [contain | cover] || scale-down 填充 替换元素 不适用 离散 按语法 指定的关键字

IDL 索引

partial namespace CSS {
  [SameObject] readonly attribute any elementSources;
};

问题索引

此解决方案假设分辨率是文件大小的代理,因此不能适当处理矢量图像的多分辨率集或将矢量图像与光栅图像混合(例如用于图标)。 例如,对于高分辨率使用矢量图像,低分辨率使用像素优化的位图,低带宽时再次使用相同的矢量(因为它更小,即使分辨率更高)。
我们应该添加“w”和“h”维度,以匹配 HTML 的 picture 功能。
根据工作组的决议,定义图像“相等”的概念,并在计算值时合并“相同”图像,汇总它们的百分比。
根据工作组的决议,通过分配百分比并展开,在计算值时简化直接嵌套的 cross-fade()cross-fade(A 10%, cross-fade(B 30%, C 70%) 90%) 变为 cross-fade(A 10%, B 27%, C 63%)
我们是否需要能够引用外部文档中的元素(例如 SVG 绘制服务器)?或者仅使用 url() 就足够了?
此名称与 GCPM 中的一个类似功能冲突。需要解决这个问题。
需要能够对元素进行“反射”,可以是元素的 background-image,也可以在伪元素中。需要特别处理以避免触发循环检测。
当我们有 overflow:paged 时,如何在视图中定位单个页面?
对元素而言,似乎需要一定程度的堆叠上下文以实现高效实现。我们需要完整的堆叠上下文吗,还是只需要伪堆叠上下文?通常情况下,它是否需要是堆叠上下文,还是在渲染到 element() 时将其作为堆叠上下文渲染?
这个 ID 选择器的复用匹配了 Moz 行为。我试图避免在语法开始时直接使用 <custom-ident>,因为这会占用太多的语法空间。不过,另一种可能是从语言定义的关键字开始,然后跟随 <custom-ident>,例如 element(external fancy)。欢迎命名建议。
通常在圆锥渐变中,0度的尖锐过渡是不理想的,通常通过确保第一个和最后一个颜色停止点是相同颜色来避免这种情况。也许可以有一个关键字来自动实现这一点。
剪裁渐变的内半径和外半径有用吗?如果是这样,我们也可以支持在颜色停止位置使用长度,因为我们现在有了一个特定的半径。
椭圆形圆锥渐变有用吗?图形库支持它们吗?
image-set() 可能会改变图像的自然分辨率,理想情况下应自动遵守此属性。 我们该如何最好地解决这个问题? 将初始值更改为 auto,意思是“1dppx,除非 CSS 另有规定”? 说 image-resolution 对由 CSS 设置分辨率的图像没有影响? 还是通过某种方式修改 image-set(),使其总是以某种方式生成 1dppx 的图像?
特殊处理从无图像到有图像的插值,例如 "background-image: url(foo);" 到 "background-image: none;"。
本部分需要审查和改进。 特别是,我认为 linear-gradient() 的处理是不完整的——我们希望在起始和结束位置之间明确插值渐变线的“长度”(从 0% 到 100% 的距离),这样它在单个动画中不会先增长然后缩小。