1. 核心概念
  2. 添加自定义样式

核心概念

添加自定义样式

在 Tailwind 项目中添加自定义样式的最佳实践。

使用框架时最大的挑战往往是:当框架无法满足你的需求时,该如何处理。

Tailwind 从设计之初就考虑了可扩展性和可定制性,因此无论你在构建什么,都不会感到与框架对抗。

本指南涵盖以下主题:自定义设计标记(design tokens)、在必要时突破框架限制、添加自定义 CSS 以及通过插件扩展框架。

自定义主题

如果你想更改调色板、间距比例、排版比例或断点等设置,可以在 CSS 中使用 @theme 指令添加自定义配置:

CSS
@theme {  --font-display: "Satoshi", "sans-serif";  --breakpoint-3xl: 120rem;  --color-avocado-100: oklch(0.99 0 0);  --color-avocado-200: oklch(0.98 0.04 113.22);  --color-avocado-300: oklch(0.94 0.11 115.03);  --color-avocado-400: oklch(0.92 0.19 114.08);  --color-avocado-500: oklch(0.84 0.18 117.33);  --color-avocado-600: oklch(0.53 0.12 118.34);  --ease-fluid: cubic-bezier(0.3, 0, 0, 1);  --ease-snappy: cubic-bezier(0.2, 0, 0, 1);  /* ... */}

更多关于自定义主题的内容,请参阅主题变量文档

使用任意值

虽然通常你可以使用一组受限的设计令牌构建出精心设计的界面,但有时你需要突破这些限制来实现像素级完美的效果。

当你确实需要类似 top: 117px 这样的值来精确定位背景图片时,可以使用 Tailwind 的方括号表示法动态生成带有任意值的类:

HTML
<div class="top-[117px]">  <!-- ... --></div>

这基本上类似于内联样式,但主要优势在于你可以将其与交互修饰符如 hover 和响应式修饰符如 lg 结合使用:

HTML
<div class="top-[117px] lg:top-[344px]">  <!-- ... --></div>

这适用于框架中的所有内容,包括背景颜色、字体大小、伪元素内容等:

HTML
<div class="bg-[#bada55] text-[22px] before:content-['Festivus']">  <!-- ... --></div>

如果你需要引用 CSS 变量作为任意值,可以使用自定义属性语法:

HTML
<div class="fill-(--my-brand-color) ...">  <!-- ... --></div>

这实际上是 fill-[var(--my-brand-color)] 的简写形式,它会自动为你添加 var() 函数。

任意属性

如果你需要使用 Tailwind 没有内置工具类的 CSS 属性,也可以使用方括号表示法来编写完全自定义的 CSS:

HTML
<div class="[mask-type:luminance]">  <!-- ... --></div>

这实际上_非常_像内联样式,但同样具有可以使用修饰符的优势:

HTML
<div class="[mask-type:luminance] hover:[mask-type:alpha]">  <!-- ... --></div>

这对于 CSS 变量等场景也很有用,特别是当它们需要在不同条件下变化时:

HTML
<div class="[--scroll-offset:56px] lg:[--scroll-offset:44px]">  <!-- ... --></div>

任意变体

任意_变体_类似于任意值,但用于即时修改选择器,就像你可以使用内置的伪类变体(如 hover:{utility})或响应式变体(如 md:{utility})一样,但直接在 HTML 中使用方括号表示法。

HTML
<ul role="list">  {#each items as item}  <li class="lg:[&:nth-child(-n+3)]:hover:underline">{item}</li>  {/each}</ul>

了解更多信息,请参阅任意变体文档。

处理空白字符

当任意值需要包含空格时,使用下划线 (_) 替代,Tailwind 会在构建时自动将其转换为空格:

HTML
<div class="grid grid-cols-[1fr_500px_2fr]">  <!-- ... --></div>

在下划线常见但空格无效的场景中,Tailwind 会保留下划线而不是转换为空格,例如在 URL 中:

HTML
<div class="bg-[url('/what_a_rush.png')]">  <!-- ... --></div>

在极少数情况下,当您确实需要使用下划线但存在歧义(因为空格也有效时),可以用反斜杠转义下划线,这样 Tailwind 就不会将其转换为空格:

HTML
<div class="before:content-['hello\_world']">  <!-- ... --></div>

如果您使用的是 JSX 等会从渲染的 HTML 中去除反斜杠的环境,请使用 String.raw(),这样反斜杠就不会被当作 JavaScript 转义字符处理:

<div className={String.raw`before:content-['hello\_world']`}>  <!-- ... --></div>

解决歧义问题

Tailwind 中的许多工具类共享相同的命名空间但对应不同的 CSS 属性。例如 text-lgtext-black 都使用 text- 命名空间,但一个用于 font-size 而另一个用于 color

当使用任意值时,Tailwind 通常能根据传入的值自动处理这种歧义:

HTML
<!-- 会生成字体大小工具类 --><div class="text-[22px]">...</div><!-- 会生成颜色工具类 --><div class="text-[#bada55]">...</div>

但有时确实会出现歧义,例如使用 CSS 变量时:

HTML
<div class="text-(--my-var)">...</div>

在这些情况下,你可以通过在值前添加 CSS 数据类型 来向 Tailwind "提示"底层类型:

HTML
<!-- 会生成字体大小工具类 --><div class="text-(length:--my-var)">...</div><!-- 会生成颜色工具类 --><div class="text-(color:--my-var)">...</div>

使用自定义 CSS

虽然 Tailwind 旨在满足大部分样式需求,但当需要时你完全可以编写普通的 CSS:

CSS
@import "tailwindcss";.my-custom-style {  /* ... */}

添加基础样式

如果你想为页面设置一些默认样式(如文本颜色、背景颜色或字体),最简单的方法就是直接在 htmlbody 元素上添加类名:

HTML
<!doctype html><html lang="en" class="bg-gray-100 font-serif text-gray-900">  <!-- ... --></html>

这种方式让你的基础样式决策与其他样式一起保留在标记中,而不是隐藏在单独的文件里。

如果你想为特定的 HTML 元素添加自定义的默认基础样式,可以使用 @layer 指令将这些样式添加到 Tailwind 的 base 层:

CSS
@layer base {  h1 {    font-size: var(--text-2xl);  }  h2 {    font-size: var(--text-xl);  }}

添加组件类

使用 components 层来添加项目中更复杂的类,这些类你仍然希望能够通过工具类进行覆盖。

传统上这些会是像 cardbtnbadge 这样的类。

CSS
@layer components {  .card {    background-color: var(--color-white);    border-radius: var(--rounded-lg);    padding: var(--spacing-6);    box-shadow: var(--shadow-xl);  }}

通过在 components 层定义组件类,你仍然可以在必要时使用工具类来覆盖它们:

HTML
<!-- 看起来像卡片,但有直角 --><div class="card rounded-none">  <!-- ... --></div>

使用 Tailwind 时,你可能并不像想象中那样经常需要这些类型的类。阅读我们的管理重复项指南获取我们的建议。

components 层也是放置你使用的任何第三方组件自定义样式的好地方:

CSS
@layer components {  .select2-dropdown {    /* ... */  }}

使用变体

使用 @variant 指令在自定义 CSS 中应用 Tailwind 变体:

app.css
.my-element {  background: white;  @variant dark {    background: black;  }}
Compiled CSS
.my-element {  background: white;  @media (prefers-color-scheme: dark) {    background: black;  }}

如果需要同时应用多个变体,可以使用嵌套:

app.css
.my-element {  background: white;  @variant dark {    @variant hover {      background: black;    }  }}
Compiled CSS
.my-element {  background: white;  @media (prefers-color-scheme: dark) {    &:hover {      @media (hover: hover) {        background: black;      }    }  }}

添加自定义工具类

简单工具类

除了使用 Tailwind 内置的工具类外,你还可以添加自己的自定义工具类。当项目中需要使用 Tailwind 默认未提供的 CSS 特性时,这会非常有用。

使用 @utility 指令向项目添加自定义工具类:

CSS
@utility content-auto {  content-visibility: auto;}

现在你可以在 HTML 中使用这个工具类:

HTML
<div class="content-auto">  <!-- ... --></div>

它也能与 hoverfocuslg 等变体配合使用:

HTML
<div class="hover:content-auto">  <!-- ... --></div>

自定义工具类会自动插入到 utilities 层,与框架中的所有内置工具类一起。

复杂工具类

如果你的自定义工具类比单个类名更复杂,可以使用嵌套来定义该工具类:

CSS
@utility scrollbar-hidden {  &::-webkit-scrollbar {    display: none;  }}

函数式工具类

除了使用 @utility 指令注册简单工具类外,你还可以注册接受参数的函数式工具类:

CSS
@utility tab-* {  tab-size: --value(--tab-size-*);}

特殊的 --value() 函数用于解析工具类的值。

匹配主题值

使用 --value(--theme-key-*) 语法根据一组主题键解析工具类值:

CSS
@theme {  --tab-size-2: 2;  --tab-size-4: 4;  --tab-size-github: 8;}@utility tab-* {  tab-size: --value(--tab-size-*);}

这将匹配 tab-2tab-4tab-github 等工具类。

原始值

要将值解析为原始值,请使用 --value({type}) 语法,其中 {type} 是你想要验证原始值的数据类型:

CSS
@utility tab-* {  tab-size: --value(integer);}

这将匹配 tab-1tab-76 等工具类。

字面量值

要支持字面量值,请使用 --value('literal') 语法(注意引号):

CSS
@utility tab-* {  tab-size: --value('inherit', 'initial', 'unset');}

这将匹配 tab-inherittab-initialtab-unset 等工具类。

任意值

要支持任意值,请使用 --value([{type}]) 语法(注意方括号)来告诉 Tailwind 哪些类型可以作为任意值:

CSS
@utility tab-* {  tab-size: --value([integer]);}

这将匹配像 tab-[1]tab-[76] 这样的工具类。如果你想支持任何数据类型,可以使用 --value([*])

同时支持主题值、裸值和任意值

--value() 函数的所有三种形式都可以在规则中作为多个声明使用,任何无法解析的声明将在输出中被省略:

CSS
@theme {  --tab-size-github: 8;}@utility tab-* {  tab-size: --value([integer]);  tab-size: --value(integer);  tab-size: --value(--tab-size-*);}

这使得在必要时可以针对每种情况以不同方式处理值,例如将裸整数转换为百分比:

CSS
@utility opacity-* {  opacity: --value([percentage]);  opacity: calc(--value(integer) * 1%);  opacity: --value(--opacity-*);}

如果你不需要在不同情况下区别对待返回值,--value() 函数也可以接受多个参数并按从左到右的顺序解析它们:

CSS
@theme {  --tab-size-github: 8;}@utility tab-* {  tab-size: --value(--tab-size-*, integer, [integer]);}@utility opacity-* {  opacity: calc(--value(integer) * 1%);  opacity: --value(--opacity-*, [percentage]);}

负值支持

要支持负值,请将正负工具类分别注册到不同的声明中:

CSS
@utility inset-* {  inset: calc(var(--spacing) * --value([percentage], [length]));}@utility -inset-* {  inset: calc(var(--spacing) * --value([percentage], [length]) * -1);}

修饰符处理

修饰符通过 --modifier() 函数处理,其工作方式与 --value() 函数完全相同,但仅作用于存在的修饰符:

CSS
@utility text-* {  font-size: --value(--text-*, [length]);  line-height: --modifier(--leading-*, [length], [*]);}

如果修饰符不存在,任何依赖修饰符的声明将不会包含在输出中。

分数处理

为了处理分数值,我们依赖 CSS 的 ratio 数据类型。如果与 --value() 一起使用,它会提示 Tailwind 将值和修饰符视为单个值:

CSS
@utility aspect-* {  aspect-ratio: --value(--aspect-ratio-*, ratio, [ratio]);}

这将匹配如 aspect-squareaspect-3/4aspect-[7/9] 这样的工具类。

添加自定义变体

除了使用 Tailwind 内置的变体外,你还可以通过 @custom-variant 指令添加自己的自定义变体:

@custom-variant theme-midnight {  &:where([data-theme="midnight"] *) {    @slot;  }}

现在你可以在 HTML 中使用 theme-midnight:<utility> 变体:

<html data-theme="midnight">  <button class="theme-midnight:bg-black ..."></button></html>

当不需要嵌套时,可以使用简写语法创建变体:

@custom-variant theme-midnight (&:where([data-theme="midnight"] *));

当自定义变体包含多条规则时,它们可以相互嵌套:

@custom-variant any-hover {  @media (any-hover: hover) {    &:hover {      @slot;    }  }}
Copyright © 2025 Tailwind Labs Inc.·Trademark Policy