Skip to main content
Bun 的打包器内置了对 CSS 的支持,具有以下特性:
  • 转译现代/未来特性以在所有浏览器上工作(包括供应商前缀)
  • 压缩
  • CSS Modules
  • 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 函数

color-mix() 函数在选定的色彩空间中按给定比例混合两种颜色。无需自己计算结果即可创建颜色变体。
styles.css
当所有颜色值都已知(不是 CSS 变量)时,Bun 的 CSS 打包器在构建时评估这些颜色混合,生成在所有浏览器中工作的静态颜色值:
styles.css

相对颜色

相对颜色语法修改现有颜色的各个分量。调整亮度、饱和度或单个通道属性,而无需重新计算整个颜色。
styles.css
当不使用 CSS 变量时,Bun 的 CSS 打包器在构建时计算这些相对颜色修改,生成静态颜色值以确保浏览器兼容性:
用于主题生成、无障碍颜色变体或从基础颜色派生的颜色比例,而不是硬编码每个值。

LAB 颜色

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

Color 函数

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 Modules

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 模块规范指出,从具有冲突属性的单独文件中组合类是未定义行为:输出可能不同且不可靠。