“CSS3” 对 CSS 来说是一个巨大的成功。 一大堆特性几乎同时出现,它们都非常棒,让我们能够在 CSS 中使用。 渐变,动画
/过渡
,圆角
,阴影
,变形
…… 太棒了! 而且更好的是,“CSS3”(以及精神上的统称“HTML5”)迅速流行起来,整个行业都沉浸在学习这些新特性的资料中。看看这些年来在 CSS-Tricks 上发布的 “CSS3”相关的资料 就知道了。
毫无疑问,很多人在那段时间里学习了这些技术。 我也认为,毫无疑问,还有很多人从那时起就没有学过多少 CSS 了。
那么我们应该告诉他们什么呢?

其他一些人也表达了类似的看法。 Scott Vandehey 在 “现代 CSS 概览” 中写到了他的一位朋友,这位朋友从 2015 年左右就停止学习 CSS 了,而且不太清楚应该学习什么。 我将尝试复述 Scott 的列表以及自 CSS3 时代以来发生的变化。
自 CSS3 时代以来,预处理器仍然被广泛使用,但使用它们的理由已经减少了,所以也许根本不用费心。 这也包括像 未来特性的 polyfill 这样的新方法。 这也包括 Autoprefixer。 JS 中的 CSS 很常见,但仅限于整个工作流程已经在 JavaScript 中的项目。 当你遇到相关的项目时,你就会知道,如果需要的话,你可以在那时学习语法。 你应该学习 自定义属性、Flexbox 和 Grid,这一点毫无疑问。
在我看来,这听起来很合理。 但请允许我列出我自己关于 CSS3 后新特性的清单,并在此基础上稍微扩展一下。
自 CSS3 以来有哪些新特性?
我们不妨把“CSS3”理解为 2015 年左右。
.card {
display: grid;
grid-template-columns:
150px 1fr;
gap: 1rem;
}
.card .nav {
display: flex;
gap: 0.5rem;
}
html {
--bgColor: #70f1d9;
--font-size-base:
clamp(1.833rem, 2vw + 1rem, 3rem);
--font-size-lrg:
clamp(1.375rem, 2vw + 1rem, 2.25rem);
}
html.dark {
--bgColor: #2d283e;
}
@media
(prefers-reduced-motion: reduce) {
* {
animation-duration: 0.001s !important;
}
}
@media
(prefers-color-scheme: dark) {
:root {
--bg: #222;
}
}
首选项查询
首选项查询通常是 @media
查询,多年来我们一直使用它来响应不同的浏览器大小,但现在还包括检测操作系统级别特定用户首选项的方法。 两个示例是 prefers-reduced-motion
和 prefers-color-scheme
。 它们使我们能够构建更尊重用户理想体验的界面。 阅读 Una 的文章。
.block {
background:
hsl(0 33% 53% / 0.5);
background:
rgb(255 0 0);
background:
/* can display colors
no other format can */
color(display-p3 0.9176 0.2003 0.1386)
background:
lab(52.2345% 40.1645 59.9971 / .5);}
background:
hwb(194 0% 0% / .5);
}
颜色变化
颜色语法正在转向接受 alpha(透明度)的函数,而无需更改函数名称。 例如,如果你在 CSS3 时代想要纯蓝色,你可能会使用 rgb(0, 0, 255)
。 然而,今天,你可以使用无逗号样式(两者都有效):rgb(0 0 255)
,然后在不使用不同函数的情况下添加 alpha:rgb(0 0 255 / 0.5)
。 hsl()
的情况也一样。 这只是一个小的改进,也是未来颜色函数的唯一工作方式。
说到未来的颜色语法
body {
font-family: 'Recursive', sans-serif;
font-weight: 950;
font-variation-settings: 'MONO' 1, 'CASL' 1;
}
.cut-out {
clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
}
.mask {
mask: url(mask.png) right bottom / 100px repeat-y;
}
.move-me {
offset-path: path('M 5 5 m -4, 0 a 4,4 0 1,0 8,0 a 4,4 0 1,0 -8,0');
animation: move 3s linear infinite;
}
@keyframes move {
100% {
offset-distance: 100%;
}
}
.disable {
filter:
blur(1px)
grayscale(1);
}
.site-header {
backdrop-filter:
blur(10px);
}
.styled-quote {
mix-blend-mode:
exclusion;
}
CSS 滤镜
如今,可以直接在 CSS 中进行大量的图像处理(更不用说其他 DOM 元素了)。 确实存在 filter
,但它还有朋友,它们都有不同的用途。
在我看来,这些都感觉有点精神上的关联
filter
——各种有用的 Photoshop 风格效果,如亮度、对比度、灰度、饱和度等。 模糊功能非常独特。background-blend-mode
— 同样,它让人联想到 Photoshop 中如何混合图层的方式。将图层相乘以使其变暗并组合。叠加以混合背景和颜色。淡化和加深是经典效果,在网页设计中具有实际用途,并且你永远不知道何时更深奥的灯光效果会创造出酷炫的外观。backdrop-filter
— 与filter
具有相同的功能,但它们仅应用于背景,而不是整个元素。仅模糊背景是一个特别有用的效果。mix-blend-mode
— 与background-blend-mode
具有相同的功能,但适用于整个元素,而不是仅限于背景。
import "https://unpkg.com/extra.css/confetti.js";
body {
background: paint(extra-confetti);
height: 100vh;
margin: 0;
}
Houdini
Houdini 实际上是一系列技术的集合,这些技术基本上都基于使用 JavaScript 扩展 CSS,或者至少位于 CSS 和 JavaScript 的交汇点。
- 绘制 API — 返回一个使用
<canvas>
API 构建的图像,并且可以通过自定义属性进行控制。 - 属性和值 API/类型化 OM — 为值(例如
10px
)提供类型,否则这些值将是字符串。 - 布局 API — 创建你自己的
display
属性。 - 动画 API
综合起来,这些功能可以创建一些非常棒的演示,尽管浏览器支持参差不齐。Houdini 的魔力部分在于它作为工作线程交付,非常易于导入和使用,因此它有可能模块化强大的功能,同时使其易于使用。
my-component {
--bg: lightgreen;
}
:host(.dark) {
background: black;
}
my-component:part(foo) {
border-bottom: 2px solid black;
}
Shadow DOM
如果你玩过 <svg>
和 <use>
元素,那么你可能会遇到 Shadow DOM。传递过来的“克隆”元素有一个 Shadow DOM,它对如何“穿透”它进行选择有限制。然后,当你深入到 <web-components>
时,它也是同样的情况。
如果你发现需要为 Web Components 设置样式,请知道从“外部”基本上有四种选择。你可能也想知道关于原生 CSS 模块和可构造样式表。
CSS 工作组
值得注意的是,CSS 工作组有自己每年划定界限的方式,指出某些规范在特定时间点的状态。
不过,这些内容都相当密集。当然,它们是很棒的参考,并且记录了我们可以看到自 CSS3 以来发生了哪些变化的地方。但我绝不会让一个普通的 前端开发人员去阅读这些内容来选择学习什么。
是的——但接下来会发生什么?
我想说,可能不用担心。;)
本文的目的是赶上自 CSS3 时代以来现在需要了解的有用内容。但如果你对 CSS 的未来有什么好奇……
- 容器查询将是一件大事。你将能够根据容器元素的大小而不是仅根据浏览器大小来做出样式选择。并且它今天就可以使用 polyfill。
- 容器单位将非常有用,用于根据容器元素的大小来调整大小。
- 独立变换,例如
scale: 1.2;
,使用起来会比总是使用transform
更合乎逻辑。 - 嵌套是所有 CSS 预处理器永远都具有的特性,开发人员显然喜欢使用它,特别是对于媒体查询。我们很可能很快就会在原生 CSS 中获得它。
- 作用域将是一种告诉CSS 代码块仅应用于特定区域(与 CSS-in-JS 库相同)的方式,并有助于解决邻近性的棘手概念。
- 级联层开辟了关于哪些样式在元素上“获胜”的全新概念。较高层上的样式将胜过较低层上的样式,无论其特异性如何。
- 视口单位将随着“相对”视口长度的引入而得到极大的改进。非常有用的将是
dvh
和dvw
,因为它们考虑了浏览器窗口中实际可用的空间,从而防止了浏览器 UI 与网站 UI 重叠等可怕的问题。 :has()
选择器就像父选择器加上。- 滚动时间轴将非常棒。
Bramus Van Damme 有一篇非常好的文章,在他的“2022 年的 CSS”综述中涵盖了这些内容以及更多内容。看起来 2022 年将是 CSS 的真正丰收之年。也许比 2015 年的 CSS3 更有意义。
reset
和revert
关键字,允许真正删除先前设置的值,而不会破坏任何东西新的函数,如
clamp()
,以及网格和弹性盒,有助于构建响应式布局,而无需大量的媒体查询基于内容的宽度和高度值,如
min-content
和fit-content
aspect-ratio
和object-fit
通过
content:
属性扩展到允许在真实元素上替换内容的表现性内容,以及新的伪元素,如 ::mark即将推出的 :has()
说得很好。
很棒的文章……新的 aspect-ratio 属性是 CSS 的新增功能,非常方便……