Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >精读《State of CSS 2022》

精读《State of CSS 2022》

作者头像
黄子毅
发布于 2022-11-21 11:51:02
发布于 2022-11-21 11:51:02
85700
代码可运行
举报
文章被收录于专栏:前端精读评论前端精读评论
运行总次数:0
代码可运行

本周读一读 State of CSS 2022 介绍的 CSS 特性。

概述

2022 已经支持的特性

@layer

解决业务代码的 !important 问题。为什么业务代码需要用 !important 解决问题?因为 css 优先级由文件申明顺序有关,而现在大量业务使用动态插入 css 的方案,插入的时机与 js 文件加载与执行时间有关,这就导致了样式优先级不固定。

@layer 允许业务定义样式优先级,层越靠后优先级越高,比如下面的例子,override 定义的样式优先级比 framework 高:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@layer framework, override;

@layer override {
  .title {
    color: white;
  }
}

@layer framework {
  .title {
    color: red;
  }
}
subgrid

subgrid 解决 grid 嵌套 grid 时,子网格的位置、轨迹线不能完全对齐到父网格的问题。只要在子网格样式做如下定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.sub-grid {
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
}
@container

@container 使元素可以响应某个特定容器大小。在 @container 出来之前,我们只能用 @media 响应设备整体的大小,而 @container 可以将相应局限在某个 DOM 容器内:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 将 .container 容器的 container-name 设置为 abc
.container {
  container-name: abc;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 根据 abc 容器大小做出响应
@container abc (max-width: 200px) {
  .text {
    font-size: 14px;
  }
}

一个使用场景是:元素在不同的 .container 元素内的样式可以是不同的,取决于当前所在 .container 的样式。

hwb

支持 hwb(hue, whiteness, blackness) 定义颜色:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text {
  color: hwb(30deg 0% 20%);
}

三个参数分别表示:角度 [0-360],混入白色比例、混入黑色比例。角度对应在色盘不同角度的位置,每个角度都有属于自己的颜色值,这个函数非常适合直观的从色盘某个位置取色。

lch, oklch, lab, oklab, display-p3 等

lch(lightness, chroma, hue),即亮度、饱和度和色相,语法如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text {
  color: lch(50%, 100, 100deg);
}

chroma(饱和度) 指颜色的鲜艳程度,越高色彩越鲜艳,越低色彩越暗淡。hue(色相) 指色板对应角度的颜色值。

oklch(lightness, chroma, hue, alpha),即亮度、饱和度、色相和透明度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text {
  color: oklch(59.69% 0.156 49.77 / 0.5);
}

更多的就不一一枚举说明了,总之就是颜色表达方式多种多样,他们之间也可以互相转换。

color-mix()

css 语法支持的 mix,类似 sass 的 mix() 函数功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text {
  color: color-mix(in srgb, #34c9eb 10%, white);
}

第一个参数是颜色类型,比如 hwb、lch、lab、srgb 等,第二个参数就是要基准颜色与百分比,第三个参数是要混入的颜色。

color-contrast()

让浏览器自动在不同背景下调整可访问颜色。换句话说,就是背景过深时自动用白色文字,背景过浅时自动用黑色文字:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text {
  color: color-contrast(black);
}

还支持更多参数,详情见 Manage Accessible Design System Themes With CSS Color-Contrast()。

相对颜色语法

可以根据语法类型,基于某个语法将某个值进行一定程度的变化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text {
  color: hsl(from var(--color) h s calc(l - 20%));
}

如上面的例子,我们将 --color 这个变量在 hsl 颜色模式下,将其 l(lightness) 亮度降低 20%。

渐变色 namespace

现在渐变色也支持申明 namespace 了,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text {
  background-image: linear-gradient(to right in hsl, black, white);
}

这是为了解决一种叫 灰色死区 的问题,即渐变色如果在色盘穿过了饱和度为 0 的区域,中间就会出现一段灰色,而指定命名空间比如 hsl 后就可以绕过灰色死区。

因为 hsl 对应色盘,渐变的逻辑是在色盘上沿圆弧方向绕行,而非直接穿过圆心(圆心饱和度低,会呈现灰色)。

accent-color

accent-color 主要对单选、多选、进度条这些原生输入组件生效,控制的是它们的主题色:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
body {
  accent-color: red;
}

比如这样设置之后,单选与多选的背景色会随之变化,进度条表示进度的横向条与圆心颜色也会随之变化。

inert

inert 是一个 attribute,可以让拥有该属性的 dom 与其子元素无法被访问,即无法被点击、选中、也无法通过快捷键选中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div inert>...</div>
COLRv1 Fonts

COLRv1 Fonts 是一种自定义颜色与样式的矢量字体方案,浏览器支持了这个功能,用法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

@font-palette-values --colorized {
  font-family: "Bungee Spice";
  base-palette: 0;
  override-colors: 0 hotpink, 1 cyan, 2 white;
}

.spicy {
  font-family: "Bungee Spice";
  font-palette: --colorized;
}

上面的例子我们引入了矢量图字体文件,并通过 @font-palette-values --colorized 自定义了一个叫做 colorized 的调色板,这个调色板通过 base-palette: 0 定义了其继承第一个内置的调色板。

使用上除了 font-family 外,还需要定义 font-palette 指定使用哪个调色板,比如上面定义的 --colorized

视口单位

除了 vhvw 等,还提供了 dvhlvhsvh,主要是在移动设备下的区别:

  • dvh: dynamic vh, 表示内容高度,会自动忽略浏览器导航栏高度。
  • lvh: large vh, 最大高度,包含浏览器导航栏高度。
  • svh: small vh, 最小高度,不包含浏览器导航栏高度。
:has()

可以用来表示具有某些子元素的父元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.parent:has(.child) {
}

表示选中那些有用 .child 子节点的 .parent 节点。

即将支持的特性

@scope

可以让某个作用域内样式与外界隔绝,不会继承外部样式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@scope (.card) {
  header {
    color: var(--text);
  }
}

如上定义后,.cardheader 元素样式就被确定了,不会受到外界影响。如果我们用 .card { header {} } 来定义样式,全局的 header {} 样式定义依然可能覆盖它。

样式嵌套

@nest 提案时 css 内置支持了嵌套,就像 postcss 做的一样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.parent {
  &:hover {
    // ...
  }
}
prefers-reduced-data

@media 新增了 prefers-reduced-data,描述用户对资源占用的期望,比如 prefers-reduced-data: reduce 表示期望仅占用很少的网络带宽,那我们可以在这个情况下隐藏所有图片和视频:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@media (prefers-reduced-data: reduce) {
  picture,
  video {
    display: none;
  }
}

也可以针对 reduce 情况降低图片质量,至于要压缩多少效果取决于业务。

自定义 media 名称

允许给 @media 自定义名称了,如下定义了很多自定义 @media:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@custom-media --OSdark (prefers-color-scheme: dark);
@custom-media --OSlight (prefers-color-scheme: light);

@custom-media --pointer (hover) and (pointer: coarse);
@custom-media --mouse (hover) and (pointer: fine);

@custom-media --xxs-and-above (width >= 240px);
@custom-media --xxs-and-below (width <= 240px);

我们就可以按照自定义名称使用了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@media (--OSdark) {
  :root {}
}
media 范围描述支持表达式

以前只能用 @media (min-width: 320px) 描述宽度不小于某个值,现在可以用 @media (width >= 320px) 代替了。

@property

@property 允许拓展 css 变量,描述一些修饰符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@property --x {
  syntax: "<length>";
  initial-value: 0px;
  inherits: false;
}

上面的例子把变量 x 定义为长度类型,所以如果错误的赋值了字符串类型,将会沿用其 initial-value

scroll-start

scroll-start 允许定义某个容器从某个位置开始滚动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.snap-scroll-y {
  scroll-start-y: var(--nav-height);
}
:snapped

:snapped 这个伪类可以选中当前滚动容器中正在被响应的元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.card:snapped {
  --shadow-distance: 30px;
}

这个特性有点像 IOS select 控件,上下滑动后就像个左轮枪一样转动元素,最后停留在某个元素上,这个元素就处于 :snapped 状态。同时 JS 也支持了 snapchangingsnapchanged 两种事件类型。

:toggle()

只有一些内置 html 元素拥有 :checked 状态,:toggle 提案是用它把这个状态拓展到每一个自定义元素:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
button {
  toggle-trigger: lightswitch;
}

button::before {
  content: "🌚 ";
}
html:toggle(lightswitch) button::before {
  content: "🌝 ";
}

上面的例子把 button 定义为 lightswitch 的触发器,且定义当 lightswitch 触发或不触发时的 css 样式,这样就可以实现点击按钮后,黑脸与黄脸的切换。

anchor()

anchor() 可以将没有父子级关系的元素建立相对位置关系,更详细的用法可以看 CSS Anchored Positioning。

selectmenu

selectmenu 允许将任何元素添加为 select 的 option:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<selectmenu>
  <option>Option 1</option>
  <option>Option 2</option>
  <option>Option 3</option>
</selectmenu>

还支持更复杂的语法,比如对下拉内容分组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<selectmenu class="my-custom-select">
  <div slot="button">
    <span class="label">Choose a plant</span>
    <span behavior="selected-value" slot="selected-value"></span>
    <button behavior="button"></button>
  </div>
  <div slot="listbox">
    <div popup behavior="listbox">
      <div class="section">
        <h3>Flowers</h3>
        <option>Rose</option>
        <option>Lily</option>
        <option>Orchid</option>
        <option>Tulip</option>
      </div>
      <div class="section">
        <h3>Trees</h3>
        <option>Weeping willow</option>
        <option>Dragon tree</option>
        <option>Giant sequoia</option>
      </div>
    </div>
  </div>
</selectmenu>

总结

CSS 2022 新特性很大一部分是将 HTML 原生能力暴露出来,赋能给业务自定义,不过如果这些状态完全由业务来实现,比如 Antd <Select> 组件早已实现自定义下拉选项与样式,既然 HTML 没有提供自定义能力,就按照其交互用 DIV + JS 模拟一套实现出来,定制空间更大。

但也有很多能力依赖浏览器实现,或者本身更适合实现在 CSS 侧,比如 @scope、subgrid、对颜色的处理等。

讨论地址是:精读《State of CSS 2022》· Issue #442 · dt-fe/weekly

如果你想参与讨论,请 点击这里,每周都有新的主题,周末或周一发布。前端精读 - 帮你筛选靠谱的内容。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端精读评论 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2022 年的 CSS 全览
2022年将成为 CSS 最伟大的一年。无论是在功能还是合作浏览器的功能发布方面,合作目标是实现 14 个功能。
ConardLi
2022/05/23
4.3K0
2022 年的 CSS 全览
2020年你不应该错过的CSS新特性
@argyleink在第四次的伦敦(LondonCSS 2020)CSS活动中分享了一个有关于CSS特性相关的话题。看了一下这个主题的PPT,里面有些新东西还是蛮有意思的。基于该PPT,我稍微整理近24个CSS方面的新特性,感兴趣的同学可以继续往下阅读。
童欧巴
2020/11/02
1.2K0
2020年你不应该错过的CSS新特性
大胆尝试这些新的CSS属性,释放CSS的力量吧(一)
本文章系《Unleashing the Power of CSS》(释放CSS的力量,暂且这么翻译吧)一书的学习笔记,希望通本书的学习,系统的梳理下CSS相关的高级新特性。本篇文章是其第一部分,由于全书英文版,理解和阅读会有偏差,欢迎各位大佬们指正,我们一起共同提高。
前端达人
2023/09/11
3031
大胆尝试这些新的CSS属性,释放CSS的力量吧(一)
如何在CSS中使用变量
原文链接:https://www.sitepoint.com/how-to-use-variables-in-css/[1]
chuckQu
2022/09/20
2.9K0
如何在CSS中使用变量
现代 CSS 颜色指南
在 CSS 中,颜色无处不在,它可以作为文字、背景、阴影、表格、边框、链接等属性。我们在 CSS 中使用的大多数颜色都是 hex 和 RGB,其实表示颜色的方式有很多,下面就来看看CSS中的颜色体系。
用户8921923
2022/10/24
2.8K0
现代 CSS 颜色指南
现代 CSS 解决方案:accent-color 强调色
accent-color 是从 Chrome 93 开始被得到支持的一个不算太新属性。之前一直没有好好介绍一下这个属性。直到最近在给一些系统整体切换主题色的时候,更深入的了解了一下这个属性。
Sb_Coco
2024/02/28
1410
现代 CSS 解决方案:accent-color 强调色
现代 CSS 解决方案:accent-color 强调色
accent-color 是从 Chrome 93 开始被得到支持的一个不算太新属性。之前一直没有好好介绍一下这个属性。直到最近在给一些系统整体切换主题色的时候,更深入的了解了一下这个属性。
winty
2024/04/15
1490
现代 CSS 解决方案:accent-color 强调色
5 分钟一览 CSS 颜色表示方法和专业用法
每个通道的取值范围是 0 ~ 255,因此一共有 256256256 种颜色。RGB 颜色可以通过以下方式来表示:
掘金安东尼
2023/04/22
6820
5 分钟一览 CSS 颜色表示方法和专业用法
为你的网页添加深色模式[每日前端夜话0x48]
CSS 规范一直在不断发展。尽管在 CSS 新功能的实现很复杂,但是 CSS 工作组还是决定要把简化版作为新元素添加到规范中。然后由浏览器来实现这些新元素,浏览器自行决定以哪种顺序去实现它们,这就是为什么现在对新功能的支持不匹配的原因。虽然这可能会令人讨厌,但实际上完成了规范的浏览器要好得多。
疯狂的技术宅
2019/04/23
1.6K0
为你的网页添加深色模式[每日前端夜话0x48]
现代 CSS 指南 -- at-rule 规则扫盲
这里表示的是与屏幕宽度相关的样式设置,上面的代码表示当屏幕宽度大于 900px 时,内部的样式代码块才能生效。
Sb_Coco
2022/11/14
1.2K0
现代 CSS 指南 -- at-rule 规则扫盲
初次接触CSS变量
本文的目的主要是展示CSS变量是如何工作的。随着Web应用程序变得越来越大,CSS变得越来越大,越来越多,而且很多时候都很乱,在良好的上下文中使用CSS变量,为您提供重用和轻松更改重复出现的CSS属性的机制。
用户6167509
2019/09/04
6420
聊一聊CSS的过去与未来,加深对CSS的理解
它涉及设定规则,让浏览器自动处理。你可以改变边距、字体和大小,但这只是浅尝辄止,你懂的吗?
前端达人
2023/08/31
3890
聊一聊CSS的过去与未来,加深对CSS的理解
看完了 2021 CSS 年度报告,我学到了啥?
大家好,我是 ConardLi,一年一度的 CSS年度报告 如期而至,我挑了一些我感兴趣的部分,和我一起来看看吧~
ConardLi
2021/12/21
8550
看完了 2021 CSS 年度报告,我学到了啥?
[第25期] 你不知道的 CSS - by Chrome 2019
最近看了 Chrome Dev Summit 2019 大会视频, 了解到了很多之前不知道的 CSS 新特性,挺有意思的。
皮小蛋
2020/03/02
7510
25个每个开发人员都应该知道的CSS 技巧
CSS(层叠样式表)是 Web 开发人员必不可少的工具,可让你精确地设置 HTML 元素的样式。但是,掌握 CSS 不仅仅需要了解基础知识。以下 25 个 CSS 技巧可以让您的生活更轻松,代码更简洁。
winty
2024/06/13
2100
25个每个开发人员都应该知道的CSS 技巧
这些CSS提效技巧,你需要知道!
hyphens 告知浏览器在换行时如何使用连字符连接单词。可以完全阻止使用连字符,也可以控制浏览器什么时候使用,或者让浏览器决定什么时候使用。
前端小智@大迁世界
2022/05/09
3780
这些CSS提效技巧,你需要知道!
阅读Skeleton.css源码,改善睡眠质量(尽管它只有419行代码)
虽然现在大部分业务都不需要重复造轮子了,但对于小白来说,学习完 Skeleton 源码 是能走出新手村的。
德育处主任
2022/04/17
7480
阅读Skeleton.css源码,改善睡眠质量(尽管它只有419行代码)
【CSS】CSS自定义属性进阶使用(一)
在传统的CSS中,通常我们需要写重复的属性值,而自定义原则能让我们避免这种情况。做到“一处定义,处处使用”。
前端修罗场
2023/10/07
2570
【Web前端】CSS 的值与单位
在 CSS 中,每个属性都可以接受一个或多个值。CSS 提供了多种值和单位,以便我们能够精确地控制页面的布局和样式。
一条晒干的咸鱼
2024/11/19
680
利好前端开发!Chrome/Edge/Firefox/Safari 决定合力解决 Web 兼容性问题 !
浏览器制造商 Apple、Google、Microsoft 和 Mozilla ,以及软件公司 Bocoup 和 Igalia 正在合力制定一项名为 Interop 2022 的 Web 兼容性规范,以使 Web 技术和代码在不同的设备和浏览器中有统一的渲染效果(利好前端开发)。
ConardLi
2022/04/08
2.3K0
利好前端开发!Chrome/Edge/Firefox/Safari 决定合力解决 Web 兼容性问题 !
相关推荐
2022 年的 CSS 全览
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文