供应商前缀是否已经死亡?

Avatar of Rob O'Leary
Rob O'Leary

DigitalOcean 提供适用于旅程各个阶段的云产品。 立即开始使用 价值 $200 的免费积分!

让我们快速回顾一下 供应商前缀 CSS 属性的起源。 希望不会触发任何人的 PTSD!

目前尚不清楚是谁首先开始使用前缀,或者它究竟何时开始。 唯一明确的是,到 2006 年,Internet Explorer 和 Firefox 已经开始使用带前缀的功能。 前缀存在的理由是指定特定于浏览器的功能。 它被认为是实现非标准功能并提供新标准功能预览的一种方式。

到 2012 年,W3C CSS 工作组发布了 关于使用供应商前缀的指南

在 CSS 中,我们对以下属性、值和 @ 规则使用供应商前缀: - 特定于供应商的扩展(根据 CSS 2.1),或 - 实验性实现(根据 CSS Snapshot 2010)(例如在工作草案中)

它成为了行业规范。 前缀的数量不断增加,随之而来的是混乱。 它导致了 CSS 功能的局部实现,引入了错误,最终破坏了浏览器生态系统,令开发者感到沮丧。 开发者对此做出的反应是开发 工具 来自动解决问题。

浏览器供应商逐渐开始放弃前缀,转而使用浏览器设置中的功能标记。 似乎供应商前缀引起的问题会随着时间的推移而逐渐消失。 问题是:**现在是时候了吗?**

我对 caniuse 数据集Mozilla 开发者网络兼容性数据集 进行了一些分析,以回答这个问题。

您可以在上面的图表中看到主要浏览器中带前缀的功能实现趋势。 我已排除 Android 版 Chrome,因为数据不足。

从 2007 年到 2011 年,所有浏览器中带前缀的功能数量稳步增加。 Internet Explorer 仅在 2011 年才出现上升趋势。 然后,在 2012 年,Mozilla 开始从 Firefox 中删除带前缀的功能,例如 -moz-border-radius*-moz-box-shadow。 此后,他们始终在该属性的标准版本完全实现后删除带前缀的属性。

2013 年,Mozilla 开始 在功能标记(首选项标记)后提供功能。 同年,Chrome 将其渲染引擎从 WebKit 切换到 Blink(Chromium 项目的一部分)。 这是删除某些带前缀的功能的一个重要转折点。

直到 2016 年 4 月,WebKit 才宣布不再发布带有前缀的实验性功能

随着时间的推移,这种策略的效果并不理想。 许多网站开始依赖带前缀的属性。 他们经常使用功能的每个带前缀的变体,这使得 CSS 难以维护,JavaScript 程序也更难编写。 网站经常只使用功能的带前缀版本,这使得浏览器在添加对非带前缀标准版本的支持时难以删除对带前缀变体的支持。 最终,浏览器感受到来自兼容性问题的压力,不得不实现彼此的前缀。

由于 Safari 和 iOS 浏览器始终使用 WebKit 渲染引擎,因此这些浏览器中带前缀数量的持续减少来得较晚。

Microsoft 从未对前缀表现出热衷,并且始终拥有最少的带前缀功能。 2019 年,Edge 从其自身的渲染引擎切换到 Blink。 令人啼笑皆非的是,这一改变实际上增加了 Edge 中带前缀属性的数量!

下表对比了 2013 年(前缀的顶峰时期)和 2021 年的带前缀功能。

2013 2021
浏览器
  • Chrome 31
  • Firefox 26
  • Internet Explorer 11
  • Safari 11
  • Safari iOS 7.0-7.1
  • Chrome 89
  • Edge 89
  • Firefox 88
  • Internet Explorer 11
  • Safari 14
  • Chrome Android 89
  • Safari iOS 14.0-14.5
需要某些前缀
总功能 53 35

看到原始数字可能令人惊讶。 **从 2013 年到 2021 年,需要前缀的功能数量下降了约 33%**。 我认为这个数字相当小。

当然,仅仅关注数字可能会误导人。 影响会有所不同。 它可能是需要前缀的属性系列,例如 animation;或者它可能是一个只需要一个属性或值添加前缀的功能,例如 user-select: none。 让我们探讨一下实际功能,以更好地了解情况,首先看一下在此期间发生的变化。

二十个功能已取消前缀(在主要浏览器中完全实现),并且添加了三个带前缀的功能(backdrop-filter、CSS text-orientation 和 CSS initial-letter)。

在我看来,现在已取消前缀但以前是重大痛点的最值得注意的功能是

  1. CSS 弹性盒布局模块
  2. CSS3 盒子大小
  3. CSS 动画
  4. CSS3 2D 变换
  5. CSS3 3D 变换
  6. CSS 滤镜效果

另外 14 个功能并不那么突出

  1. :any-link
  2. ::placeholder
  3. ::selection
  4. :focus-visible
  5. :is()
  6. :read-only
  7. :read-write
  8. font-feature-settings
  9. text-align-last
  10. writing-mode
  11. CSS grabgrabbing 光标
  12. CSS 逻辑属性(随着支持的改进,将来会更多地使用)
  13. CSS3 zoom-inzoom-out 光标
  14. CSS3 多列布局

如果您选择在 2021 年不支持 Internet Explorer 11,那么另外七个功能不再需要前缀。 这将 2021 年需要前缀的功能数量减少到 28 个,与 2013 年相比减少了 46% 。

2021 年的前缀

让我们看一下需要前缀的属性。 它是一个杂乱无章的集合!

# 名称 属性/值 描述 需要前缀 无前缀支持 带前缀支持 使用前缀的改进
1 appearance appearance 定义元素(特别是表单控件)的默认外观。 将值设置为 none 会导致使用其他 CSS 属性完全重新定义元素的默认外观。
  • Safari
    (-webkit)
  • Opera
    (-webkit)
  • Android 浏览器 2.1-4.4.4
    (-webkit)
69.80% 97.03% 27.23%
2 background-clip-text background-clip: text 一种非标准方法,用于将背景图像剪裁到前景文本。
  • Chrome
    (-webkit)
  • Edge
    (-webkit)
  • Safari
    (-webkit)
  • Opera
    (-webkit)
  • Safari iOS
    (-webkit)
  • Android 浏览器
    (-webkit)
  • Android 版 Chrome
    (-webkit)
3.89% 96.65% 92.76%
3 backdrop-filter backdrop-filter 一种方法,用于将滤镜效果(如 blurgrayscalehue)应用于目标元素下方的内容或元素。
  • Safari
    (-webkit)
  • Safari iOS
    (-webkit)
70.20% 88.20% 18.00%
4 background-image: crossfade() background-image: crossfade() 用于创建图像之间“交叉淡入淡出”效果的图像函数。 这使得可以根据百分比值让一个图像过渡(淡入淡出)到另一个图像。
  • Chrome
    (-webkit)
  • Edge
    (-webkit)
  • Opera
    (-webkit)
  • Android 浏览器
    (-webkit)
  • Android 版 Chrome
    (-webkit)
17.77% 92.62% 74.85%
5 background-image: image-set() background-image: image-set() 一种方法,使浏览器可以从给定集中选择最合适的 CSS 背景图像,主要针对高 PPI 屏幕。
  • Chrome
    (-webkit)
  • Edge
    (-webkit)
  • Opera
    (-webkit)
  • Android 浏览器
    (-webkit)
  • Opera Mobile
    (-webkit)
17.77% 92.48% 74.71%
6 box-decoration-break box-decoration-break 控制盒子在断开时(如页面、列、区域或行)盒子的边距、边框、填充和其他装饰是否包裹盒子的断裂边缘。
  • Chrome
    (-webkit)
  • Edge
    (-webkit)
  • Safari
    (-webkit)
  • Opera
    (-webkit)
  • Safari iOS
    (-webkit)
  • Android 浏览器Opera Mobile
    (-webkit)
6.39% 97.17% 90.78%
7 clip-path clip-path 一种方法,使用 SVG 或形状定义来定义 HTML 元素的可见区域。
  • Safari
    (-webkit)
72.00% 96.33% 24.33%
8 color-adjust color-adjust 一种非标准 CSS 扩展,可用于强制打印背景颜色和图像。
  • Chrome
    (-webkit-print-color-adjust)
  • Edge
    (-webkit-print-color-adjust)
  • Safari
    (-webkit-print-color-adjust)
  • Opera
    (-webkit-print-color-adjust)
  • Android Mobile
    (-webkit-print-color-adjust)
3.69% 39.77% 36.08%
9 element() background: element() 此函数呈现从任意 HTML 元素生成的实时图像
  • Firefox
    (-moz)
0.00% 4.04% 4.04%
10 font-kerning font-kerning 控制存储在字体中的字母间距的使用。 请注意,这只会影响具有字距信息 的 OpenType 字体,对其他字体没有影响。
  • Safari iOS
    (-webkit)
81.73% 96.03% 14.30%
11 font-smooth font-smooth 控制在渲染字体时如何应用抗锯齿。 尽管在 2002 年初的 CSS3 字体规范草案中存在,但此属性已被删除,目前不在标准轨道上。
  • Chrome
    (-webkit-font-smoothing)
  • Edge
    (-webkit-font-smoothing)
  • Firefox
    (-moz-osx-font-smoothing)
  • Safari
    (-webkit-font-smoothing)
  • Opera
    (-webkit-font-smoothing)
0.00% 39.64% 39.64%
12 hyphens hyphens 一种方法,用于控制行尾单词何时应使用连字符。
  • Internet Explorer 10+
    (-ms)
  • Safari
    (-webkit)
  • Safari iOS
    (-webkit)
76.49% 96.51% 20.02%
13 initial-letter initial-letter 一种方法,可以以健壮的方式创建放大的大写字母,包括下降或升高的大写字母。
  • Safari
    (-webkit)
  • Safari iOS
    (-webkit)
0.00% 18.00% 18.00%
14 line-clamp line-clamp 将文本限制在给定数量的行中,当与 display: -webkit-box 结合使用时。 任何超出空间的文本都会在包含 text-overflow: ellipsis 时产生省略号。
  • Chrome
    (-webkit)
  • Edge
    (-webkit)
  • Firefox
    (-webkit)
  • Safari
    (-webkit)
  • Opera
    (-webkit)
  • Safari iOS
    (-webkit)
  • Android 浏览器
    (-webkit)
  • Android 版 Chrome
    (-webkit)
  • Android 版 Firefox
    (-webkit)
  • Opera Mobile
    (-webkit)
0.19% 96.28% 96.09%
15 position: sticky position: sticky 根据元素在视窗中的显示方式,保持元素的位置为“固定”或“相对”。 因此,元素在滚动时会“固定”在适当的位置。
  • Safari 7.1-12.1
    (-webkit)
93.50% 95.36% 1.86%
16 tab-size tab-size 自定义 Tab 字符宽度的方法。 仅在与 white-space: prewhite-space: pre-wrap 结合使用时有效。
  • Firefox 4+
    (-moz)
  • Android 版 Firefox
    (-moz)
  • Opera 11.5-12-1
    (-o)
92.33% 97.38% 5.05%
17 text-decoration 样式 text-decoration
text-decoration-* 属性。
定义 text-decoration 属性中线条类型、样式和颜色的方法。 这些可以作为简写形式定义(例如 text-decoration: line-through dashed blue)或作为单个属性定义(例如 text-decoration-color: blue)。
  • Firefox 6-35
    (-moz)
  • Safari 7.1+
    (-webkit)
  • Safari for iOS 8+
    (-webkit)
80.25% 94.86% 14.61%
18 text-emphasis 样式 text-emphasis
text-emphasis-* 属性
在每个字形旁边使用小符号来强调一段文本的方法,通常用于东亚语言。 text-emphasis 简写属性及其 text-emphasis-styletext-emphasis-color 组成属性可用于对文本应用标记。 text-emphasis-position 属性单独继承,允许设置强调标记相对于文本的位置。
  • Chrome 25+
    (-webkit)
  • Edge 79+
    (-webkit)
  • Opera 15+
    (-webkit)
  • Android 浏览器
    (-webkit)
  • Android 版 Chrome
    (-webkit)
  • Opera Mobile
    (-webkit)
21.96% 95.99% 74.03%
19 text-orientation text-orientation 指定一行中文本的方向。 当前值仅在垂直排版模式(由 writing-mode 属性定义)中有效。 Safari
(-webkit)
90.88% 94.84% 3.96%
20 text-size-adjust text-size-adjust 控制是否以及如何将文本膨胀算法应用于其应用于的元素的文本内容。
  • Edge 12-18
    (-ms)
  • Safari iOS
    (-webkit)
  • Android 版 Firefox
    (-moz)
72.75% 87.48% 14.73%
21 user-select: none user-select 防止文本或元素选择的方法。
  • Internet Explorer 10-11
    (-ms)
  • Safari
    (-webkit)
  • Safari iOS
    (-webkit)
  • Android 浏览器 2.1-4.4.4
    (-webkit)
74.81% 96.49% 21.68%
22 CSS Canvas 绘图 background: -webkit-canvas(mycanvas) 使用 HTML5 Canvas 作为背景图像的方法。 目前不属于任何规范的一部分。
  • Safari
    (-webkit)
0.00% 19.40% 19.40%
23 CSS 蒙版 mask mask-* 属性 使用选定的图像作为蒙版来显示元素的一部分的方法。
  • Chrome
    (-webkit)
  • Edge
    (-webkit)
  • Safari
    (-webkit)
  • Safari iOSAndroid 浏览器
    (-webkit)
  • Android 版 Chrome
    (-webkit)
  • Opera Mobile
    (-webkit)

WebKit/Blink 浏览器中的部分支持指的是支持 mask-imagemask-box-image 属性,但缺乏对规范其他部分的支持。

4.18% 96.93% 92.75%
24 CSS 反射 -webkit-box-reflect 显示元素反射的方法。
  • Chrome
    (-webkit)
  • Edge
    (-webkit)
  • Safari
    (-webkit)
  • Opera
    (-webkit)
  • Safari iOS
    (-webkit)
  • Android 浏览器
    (-webkit)
  • Android 版 Chrome
    (-webkit)
  • Opera Mobile
    (-webkit)
0.00% 91.20% 91.20%
25 CSS 滚动条样式 scrollbar-color
scollbar-width
设置滚动条颜色和宽度的两种方法。
  • Chrome
    (-webkit)
  • Edge
    (-webkit)
  • Safari
    (-webkit)
  • Opera
    (-webkit)
  • Safari iOS
    (-webkit)
  • Android 浏览器
    (-webkit)
  • Android 版 Chrome
    (-webkit)
4.28% 96.87% 92.59%
26 CSS 文本填充和描边 text-stroke
text-stroke-* 属性
声明文本轮廓(描边)宽度和颜色的方法。
  • Chrome
    (-webkit)
  • Edge
    (-webkit)
  • Firefox
    (-webkit)
  • Safari
    (-webkit)
  • Opera
    (-webkit)
  • Safari iOS
    (-webkit)
  • Android 浏览器
    (-webkit)
  • Android 版 Chrome
    (-webkit)
  • Android 版 Firefox
    (-webkit)
  • Opera Mobile
    (-webkit)
0.00% 96.65% 96.65%
27 内在尺寸和外在尺寸 max-content
min-content
fit-content
stretch(以前称为 fill)。
允许元素的高度和宽度以内在值而不是固定数值指定。
  • Chrome 22-45
    (-webkit)
  • Edge 3-65
    (-webkit)
  • Firefox (-moz-available)
  • Opera 15-32
    (-webkit)
  • Safari 6.1-10-1
    (-webkit)
  • Safari iOS 7-13.7
    (-webkit)
  • Androind 浏览器 4.4-4.4.4
    (-webkit)
91.99% 96.36% 4.37%
28 媒体查询:分辨率功能 @media (min-resolution: 300dpi) { … }, @media (max-resolution: 300dpi) { … } 允许根据每个 CSS 单位使用的设备像素设置媒体查询。 虽然标准使用 min-resolutionmax-resolution,但一些浏览器支持旧的非标准 device-pixel-ratio 媒体查询。
  • Chrome 4-28
    (-webkit)
  • Safari 4+
    (-webkit)
  • Opera 10-11.5
    (-webkit)
  • Safari iOS
    (-webkit)
  • Android 浏览器 (2.3-4.3) Opera Mobile 12
    (-webkit)
  • Firefox 3.5-15
    (min--moz-device-pixel-ratio)

支持 -webkit 的浏览器支持非标准的 -webkit-min-device-pixel-ratiowebkit-min-device-pixel-ratio

80.40% 99.16% 18.76%

在整理完这份清单后,我的最初印象是这些并不是我经常遇到的东西。 一些属性还没有(也可能永远不会)完全实现。 我认为 element() 函数和 CSS Canvas 绘图就属于这种情况。 Safari 最近取消了 position: sticky 的前缀,所以它很快就会从清单中消失。

如果你想缩减清单并避开某些情况,你可以这样做。 你可以忽略它并说它不重要,为什么要费心呢? 现实情况是,清单仍然很长,以至于你不想在代码中手动管理前缀。 需要回答的一个相关问题是:你想将跨浏览器支持提高到很高水平吗? 如果答案是肯定的,那么你应该将其视为开发工作的一部分。

还必须记住,这不仅仅是关于这些属性和当前浏览器。 仍然有人在使用旧设备和旧浏览器,这些浏览器不支持一些功能的无前缀版本。 例如,以 animation 属性为例。 Chrome 是最后一个在 2015 年取消该属性前缀的浏览器。 然而,今天,全球 1.3% 的用户仍然使用不支持无前缀版本的浏览器。

我最近遇到了一些需要使用前缀属性的情况。 例如,我正在为博客制作 阅读进度条,需要使用 -webkit-appearance: none;-moz-appearance: none; 来重置 progress 元素的默认样式。 它还需要粘性定位,所以我不得不为 Safari 添加 position: sticky 的前缀来支持粘性定位。

另一个例子? 我想使用 PNG 图像作为圣诞主题设计的蒙版图像,发现 -webkit-mask-image 是唯一正常工作的属性。 蒙版通常有点不稳定,因为大多数浏览器只部分支持规范。

再举一个例子:Flavio Copes 在 “如何在 CSS 中对多行应用填充” 中写道,他希望在多行标题的每一行都具有相同的填充。 解决方法是使用 box-decoration-break: clone。 大多数浏览器需要此属性的 -webkit 前缀版本,因此你需要使用它。

工具

一些为解决前缀和浏览器支持问题而创建的 工具 已经过时。 我建议在使用之前先检查工具是否已更新。

当然,Autoprefixer(一个 PostCSS 插件)得到维护,它使用来自 caniuse 的直接数据来保持最新。

Emmet 还具有出色的前缀功能。 特别是,它有一个 css.autoInsertVendorPrefixes 选项,可以自动为你插入前缀。 我没有验证它是否是最新的,但它值得作为开发环境的一部分进行考虑。

由于大多数代码编辑器都支持 Emmet,因此编辑前缀属性变得容易得多。 Emmet 有一个 CSS 反射值 命令,可以更新规则中同一属性的所有前缀版本的 value。 你可以阅读 Emmet 文档 以获取有关前缀功能的更多信息。

结论

不幸的是,供应商前缀并没有消失。 我们仍然在承受着这种遗留问题的影响。 同时,我们也应该感谢前缀功能在不断减少。 浏览器供应商在实现无前缀功能以代替前缀功能方面做了一些很好的工作。 这减轻了开发人员的很大一部分负担。

然而,你可能偶尔会遇到仍然需要前缀的情况。 如果你想支持尽可能多的浏览器,你应该继续使用自动前缀策略。