Skip to main content
Bun 的打包工具内置支持 CSS,具有以下功能:
  • 将现代/未来特性转换为可在所有浏览器上运行的代码(包括添加厂商前缀)
  • 压缩
  • CSS 模块
  • Tailwind(通过原生打包工具插件)

转译

默认启用转译和厂商前缀处理,因此你可以使用现代及未来的 CSS 特性,而无需担心浏览器兼容性。 Bun 的 CSS 解析器和打包器直接移植自 LightningCSS,其打包方式受 esbuild 启发。转译器会将现代 CSS 语法转换为向后兼容的等效写法,使其能够在各种浏览器中正常运行。
感谢 LightningCSS 和 esbuild 的作者所做的工作。

浏览器兼容性

默认情况下,Bun 的 CSS 打包目标浏览器包括:
  • ES2020
  • Edge 88+
  • Firefox 78+
  • Chrome 87+
  • Safari 14+

语法降级

嵌套

借助 CSS 嵌套,你可以直接在父级代码块中编写子级样式,而无需在 CSS 文件中重复父级选择器。
styles.css
Bun 的 CSS 打包工具会自动将此嵌套语法转换成传统的扁平 CSS,以兼容所有浏览器:
styles.css
你还可以在选择器中嵌套媒体查询和其他 at 规则:
styles.css
编译后为:
styles.css

颜色混合

color-mix() 函数会在所选色彩空间中按给定比例混合两种颜色。使用它可以创建颜色变体,而无需自行计算结果值。
styles.css
Bun 的 CSS 打包工具会在构建时评估这些颜色混合(当所有颜色值已确定,非 CSS 变量),生成适用于所有浏览器的静态颜色值:
styles.css

相对颜色

相对颜色语法可以修改现有颜色的单个组成部分。无需重新计算整个颜色,即可调整亮度、饱和度或单独的颜色通道。
styles.css
Bun 的 CSS 打包工具会在构建时计算这些相对颜色修改(不使用 CSS 变量时),生成适用于浏览器的静态颜色值:
styles.css
可将其用于主题生成、无障碍颜色变体,或根据基础颜色生成颜色阶,而不是为每个值硬编码。

LAB 颜色

现代 CSS 支持感知均匀的颜色空间 LAB、LCH、OKLAB 和 OKLCH,它们可以表示超出标准 RGB 色域的颜色。
styles.css
Bun 的 CSS 打包器会将这些颜色格式转换为向后兼容的替代方案,以支持不支持这些格式的浏览器:
styles.css

颜色函数

color() 函数可以在传统 RGB 之外的预定义色彩空间中指定颜色,让你能够使用更宽的色域。
styles.css
对于不支持这些色彩空间的浏览器,Bun 的 CSS 打包器会添加 RGB 备选值:
styles.css

HWB 颜色

HWB(色相、白度、黑度)颜色模型基于纯色相中混合了多少白色或黑色来表示颜色。与 RGB 或 HSL 值相比,使用这种方式可以更直接地创建浅色和深色变体。
styles.css
Bun 的 CSS 打包器会将 HWB 颜色转换为 RGB,以兼容所有浏览器:
styles.css

颜色表示法

现代 CSS 支持使用空格分隔的 RGB 和 HSL 值(不带逗号),以及带 alpha 通道的十六进制颜色。
styles.css
Bun 的 CSS 打包器会将这些格式转换为旧版浏览器支持的格式:
styles.css

light-dark() 颜色函数

light-dark() 函数接受两种颜色,并根据当前颜色方案应用其中一种,使样式无需使用媒体查询即可遵循用户的系统偏好。
styles.css
对于不支持 light-dark() 的浏览器,Bun 的 CSS 打包器会将其转换为带有回退值的 CSS 变量:
styles.css

逻辑属性

CSS 逻辑属性根据文档的书写模式和文本方向,而不是屏幕的物理方向来定义布局、间距和尺寸,因此布局可以适应不同的书写系统。
styles.css
对于不完全支持逻辑属性的浏览器,Bun 的 CSS 打包器会针对每种文本方向将其编译为物理属性:
styles.css
如果不支持 :dir() 选择器,Bun 会生成额外的回退方案。

:dir() 选择器

:dir() 伪类根据元素的文本方向(RTL 或 LTR)设置样式,该方向由文档或显式的 direction 属性决定。使用它可以编写无需 JavaScript 的方向感知样式。
styles.css
对于不支持 :dir() 选择器的浏览器,Bun 的 CSS 打包器会将其转换为兼容性更广的 :lang() 选择器,并使用适当的语言映射:
styles.css
如果不支持向 :lang() 传入多个参数,Bun 会生成进一步的回退方案。

:lang() 选择器

:lang() 伪类根据元素的语言定位元素。要为相关语言组合规则,可以向单个 :lang() 传入多个语言代码。
styles.css
对于不支持在 :lang() 选择器中使用多个参数的浏览器,Bun 的 CSS 打包器会将此语法转换为行为相同的 :is() 选择器:
styles.css
如果需要,Bun 还可以为 :is() 生成额外的回退方案。

:is() 选择器

:is() 伪类函数(之前称为 :matches())接收一个选择器列表,如果列表中的任意选择器匹配,则匹配成功。
styles.css
对于不支持 :is() 的浏览器,Bun 的 CSS 打包工具提供使用厂商前缀的替代写法:
与标准化的 :is() 选择器相比,带厂商前缀的版本存在一些限制,尤其是在处理复杂选择器时。Bun 只会在带前缀的版本能够正常工作时使用它们。

:not() 选择器

:not() 伪类会排除匹配某个选择器的元素。现代版本支持多个参数,可以通过一个 :not() 排除多种模式。
styles.css
对于不支持 :not() 中多个参数的浏览器,Bun 的 CSS 打包器会将此语法转换为行为相同且兼容性更好的形式:
styles.css
如果不支持 :is(),Bun 会生成进一步的回退:
styles.css
转换后的选择器保留了原始选择器的优先级和行为。

数学函数

CSS 包含标准数学函数(round()mod()rem()abs()sign())、三角函数(sin()cos()tan()asin()acos()atan()atan2())以及指数函数(pow()sqrt()exp()log()hypot())。
styles.css
当所有值都是已知常量(而非变量)时,Bun 的 CSS 打包器会在构建时计算这些表达式:
styles.css

媒体查询范围

媒体查询范围语法使用比较运算符(<><=>=)表示断点,而不是使用更冗长的 min-max- 前缀。
styles.css
Bun 的 CSS 打包器会将范围查询转换为传统的媒体查询语法,以兼容所有浏览器:
styles.css

简写属性

CSS 引入了几种将多个长属性组合在一起的简写属性。
styles.css
对于不支持这些简写属性的浏览器,Bun 会将它们转换为对应的组件长属性:
styles.css

双位置渐变

双位置渐变语法会在两个相邻位置指定相同的颜色,从而创建硬色标:产生锐利的过渡,而不是平滑的渐变。它适用于条纹、色带以及其他多色设计。
styles.css
对于不支持此语法的浏览器,Bun 的 CSS 打包器会通过复制颜色标记,将其转换为传统格式:
styles.css

system-ui 字体

system-ui 通用字体系列使用设备的原生 UI 字体。
styles.css
对于不支持 system-ui 的浏览器,Bun 的 CSS 打包器会将其扩展为跨平台字体堆栈:
styles.css
扩展后的字体堆栈包含适用于 macOS/iOS、Windows、Android 和 Linux 的系统字体,以及针对旧版浏览器的回退字体。

CSS 模块

Bun 的打包器还支持 CSS 模块,具有以下功能:
  • 无需配置即可检测 CSS 模块文件(.module.css
  • 组合(composes 属性)
  • 将 CSS 模块导入 JSX/TSX
  • 针对 CSS 模块无效用法的警告/错误
CSS 模块是一种 CSS 文件(扩展名为 .module.css),其中所有类名和动画都限定在该文件的作用域内。这有助于避免类名冲突,因为 CSS 声明默认是全局作用域的。 Bun 的打包器会将局部作用域的类名转换为唯一标识符。

快速入门

创建一个以 .module.css 结尾的 CSS 文件:
styles.module.css
other-styles.module.css
然后你可以导入此文件,比如在 TSX 文件中:
app.tsx
导入 CSS 模块会得到一个对象,该对象将每个类名映射到其唯一标识符:
app.tsx
输出结果如下:
app.tsx
每个文件中的类名都是唯一的,因此不会发生冲突。

组合

CSS 模块可以将类选择器组合在一起,以便在多个类之间复用样式规则。 例如:
styles.module.css
这与以下写法相同:
styles.module.css
使用 composes 时需要遵循以下两条规则:
组合规则:
  • composes 属性必须写在任何常规 CSS 属性之前
  • 只能在带有单个类名的简单选择器上使用 composes
styles.module.css

从独立 CSS 模块文件组合

你也可以从其他 CSS 模块文件中组合类:
background.module.css
styles.module.css
从独立文件组合类时,请确保它们不包含相同的属性。CSS 模块规范规定,从独立文件中组合具有冲突属性的类属于未定义行为:输出结果可能有所不同,并且不可靠。