如果上次学习 CSS 还是在 CSS3 时代,现在应该学习哪些新特性?

Avatar of Chris Coyier
Chris Coyier 发布

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费额度!

“CSS3” 对 CSS 来说是一个巨大的成功。 一大堆特性几乎同时出现,它们都非常棒,让我们能够在 CSS 中使用。 渐变动画/过渡圆角阴影变形…… 太棒了! 而且更好的是,“CSS3”(以及精神上的统称“HTML5”)迅速流行起来,整个行业都沉浸在学习这些新特性的资料中。看看这些年来在 CSS-Tricks 上发布的 “CSS3”相关的资料 就知道了。

毫无疑问,很多人在那段时间里学习了这些技术。 我也认为,毫无疑问,还有很多人从那时起就没有学过多少 CSS 了。

那么我们应该告诉他们什么呢?

其他一些人也表达了类似的看法。 Scott Vandehey 在 “现代 CSS 概览” 中写到了他的一位朋友,这位朋友从 2015 年左右就停止学习 CSS 了,而且不太清楚应该学习什么。 我将尝试复述 Scott 的列表以及自 CSS3 时代以来发生的变化。

自 CSS3 时代以来,预处理器仍然被广泛使用,但使用它们的理由已经减少了,所以也许根本不用费心。 这也包括像 未来特性的 polyfill 这样的新方法。 这也包括 Autoprefixer。 JS 中的 CSS 很常见,但仅限于整个工作流程已经在 JavaScript 中的项目。 当你遇到相关的项目时,你就会知道,如果需要的话,你可以在那时学习语法。 你应该学习 自定义属性FlexboxGrid,这一点毫无疑问。

在我看来,这听起来很合理。 但请允许我列出我自己关于 CSS3 后新特性的清单,并在此基础上稍微扩展一下。

自 CSS3 以来有哪些新特性?

我们不妨把“CSS3”理解为 2015 年左右。


.card {
  display: grid;
  grid-template-columns:
    150px 1fr;
  gap: 1rem;
}
.card .nav {
  display: flex;
  gap: 0.5rem;
}

布局

如果你还没有学习 FlexboxGrid,那么你真的需要学习它们——它们是如今 CSS 开发的基石。 甚至比我们在 CSS3 中获得的任何特性都重要。

当考虑到 子网格砌体布局 时,Grid 的功能更加强大,这两者目前在跨浏览器兼容性方面还不太可靠,但可能很快就会变得可靠。

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;
}

CSS 自定义属性

自定义属性 也是一件大事,原因有很多。 它们可以作为项目中设计令牌的存储位置,使项目更易于维护和保持一致性。 颜色主题是一个主要的用例,例如 深色模式

你可以使用 自定义属性 设计整个网站。 沿着这条思路,你不能忽略如今的 Tailwind。 使用 HTML 中的类来为整个网站设置样式的方法,与许多人产生了共鸣(也与许多人产生了不和谐,所以如果它与你格格不入,也不要担心)。

@media 
  (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.001s !important;
  }
}

@media 
  (prefers-color-scheme: dark) {
  :root {
    --bg: #222;
  }
}

首选项查询

首选项查询通常是 @media 查询,多年来我们一直使用它来响应不同的浏览器大小,但现在还包括检测操作系统级别特定用户首选项的方法。 两个示例是 prefers-reduced-motionprefers-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;
}

可变字体

网页字体在 CSS3 中成为 一项重要功能。 现在有了 可变字体。 你不妨了解一下它们的存在。 它们既可以解锁一些很酷的设计可能性,有时也可以提高性能(例如,不再需要为同一字体的粗体和斜体版本加载不同的字体文件)。 还有 彩色字体,但尽管 有浏览器支持,但我认为它们在网络上并没有得到广泛应用。

.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%;
  }
}

路径

SVG 自 CSS3 以来也发展迅速。 你可以直接裁剪 任何元素为各种形状,通过 clip-path 为 CSS 带来了类似 SVG 的特性。 不仅如此,你还可以沿着路径动画元素,让元素沿着路径漂浮,甚至更新 SVG 元素的路径。

在我看来,这些都感觉有点精神上的关联

  • clip-path——允许我们从字面上将元素裁剪成各种形状。
  • 蒙版——类似于裁剪,但蒙版可以具有其他特性,例如基于蒙版的 alpha 通道。
  • 偏移路径——提供一个元素可以放置在其上的路径,通常用于 沿着该路径进行动画
  • 形状外——在浮动元素上提供一个路径,其他元素围绕该路径环绕。
  • d——<path> 上 SVG 的 d 属性可以通过 CSS 更新
.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 的未来有什么好奇……

Bramus Van Damme 有一篇非常好的文章,在他的“2022 年的 CSS”综述中涵盖了这些内容以及更多内容。看起来 2022 年将是 CSS 的真正丰收之年。也许比 2015 年的 CSS3 更有意义。