Pressidian
花园入口
笔记
项目
关于
实验室
GitHub
花园入口
笔记
项目
关于
实验室
GitHub

KNOWLEDGE PATHS

笔记库
当前位置
笔记库/前端/项目笔记/代达罗斯/模式

TailwindCSS

5 分钟阅读 · Note

目录树 578 篇

            • 表单最佳实践指南
            • 双层级导航结构
            • 以schema为中心的
            • 异步三态切换
            • 用neverthrow进行错误处理
            • Anatomy
            • cn
            • LoadingState&useList的组合
            • procedure中的service位置
            • scrollbar-gutter
            • TailwindCSS
            • TanStack Router 路由模式
            • useDebounce
            • useForm
            • void
          • 项目待做
          • 性能优化
          • UI设计
      • 前端技术栈
    • 笔记目录
    • CLAUDE.md
    • Vue 组件与 Render 函数

关联笔记 6

↗表单最佳实践指南同一路径↗双层级导航结构同一路径↗以schema为中心的同一路径↗异步三态切换同一路径↗用neverthrow进行错误处理同一路径↗Anatomy同一路径
  • TailwindCSS

TailwindCSS


code


解析

这段样式主要是在做一组可以自动换行、垂直居中的筛选下拉框。先看整体效果:

<div className="flex flex-wrap items-center gap-3 mb-[14px]">

它会让内部两个下拉框横向排列;空间不足时自动换到下一行;每个控件之间留出间距。

1. 外层容器

类名对应 CSS作用
flexdisplay: flex使用 Flex 布局,子元素默认横向排列
flex-wrapflex-wrap: wrap一行放不下时允许换行
items-centeralign-items: center子元素在交叉轴上居中,也就是垂直居中
gap-3gap: 0.75rem子元素横向和纵向间距都是 12px
mb-[14px]margin-bottom: 14px下方留 14px 间距

mb-[14px] 为什么带中括号?

这是 Tailwind 的任意值语法:

mb-[14px]

相当于:

margin-bottom: 14px;

Tailwind 自带的间距通常是:

mb-3 // 12px
mb-4 // 16px

由于 14px 不在默认间距表里,所以使用 [14px]。

一般来说,能用标准值时优先使用标准值;只有设计稿明确要求 14px 时,再使用任意值。


2. 第一个下拉框容器

<div className="relative min-w-[280px] max-w-[360px] flex-shrink-0">
类名对应 CSS作用
relativeposition: relative建立定位上下文
min-w-[280px]min-width: 280px最小宽度 280px
max-w-[360px]max-width: 360px最大宽度 360px
flex-shrink-0flex-shrink: 0空间不足时禁止被压缩

relative

单独使用时,通常不会产生明显视觉效果:

position: relative;

它往往是为了让内部的绝对定位元素以它为参照,例如自定义下拉箭头:

<div className="relative">
  <select className="appearance-none" />
  <ChevronDown className="absolute right-3 top-1/2 -translate-y-1/2" />
</div>

这里的代码暂时没有展示箭头,因此 relative 可能是为后续图标定位预留的。

min-w-[280px] 和 max-w-[360px]

也是任意值语法:

min-width: 280px;
max-width: 360px;

不过这里有一个需要注意的地方:这个容器没有设置明确宽度,例如:

w-full
w-[320px]
flex-1

因此它的实际宽度主要由内容和 Flex 布局决定。它至少是 280px,最多是 360px。

更常见的写法可能是:

<div className="relative w-full min-w-[280px] max-w-[360px] flex-shrink-0">

这样它会尝试占满可用宽度,但不会超过 360px。

flex-shrink-0

Flex 子元素默认允许缩小:

flex-shrink: 1;

flex-shrink-0 会改成:

flex-shrink: 0;

也就是说,哪怕外层空间变窄,这个下拉框也不会被挤压到小于自身宽度,而是配合外层的 flex-wrap 换到下一行。

现在 Tailwind 中也常写成:

shrink-0

两者表达的意思基本相同。


3. 第二个下拉框容器

<div className="relative w-[180px] flex-shrink-0">
类名对应 CSS作用
relativeposition: relative为内部绝对定位元素提供参照
w-[180px]width: 180px固定宽度为 180px
flex-shrink-0flex-shrink: 0不允许被 Flex 布局压缩

它和第一个容器的区别是:

// 第一个:宽度允许在 280px 到 360px 之间变化
min-w-[280px] max-w-[360px]

// 第二个:固定为 180px
w-[180px]

4. Select 样式

两个 Select 使用的是同一套样式:

className="
  h-9
  w-full
  rounded-lg
  border
  bg-background
  py-1.5
  pr-7
  pl-3
  text-[12.5px]
  text-foreground
  appearance-none
"

尺寸相关

类名对应 CSS作用
h-9height: 2.25rem高度 36px
w-fullwidth: 100%占满父容器宽度
py-1.5padding-top/bottom: 0.375rem上下内边距 6px
pr-7padding-right: 1.75rem右侧内边距 28px
pl-3padding-left: 0.75rem左侧内边距 12px

这里右侧的内边距明显比左侧大:

pr-7 // 28px
pl-3 // 12px

通常是为了给下拉箭头留空间,防止文字和箭头重叠。

不过 appearance-none 会隐藏浏览器原生箭头,所以通常还需要手动添加一个箭头图标。

py-1.5

Tailwind 支持部分小数间距:

py-1   // 4px
py-1.5 // 6px
py-2   // 8px

其中:

p  = padding
y  = top + bottom
1.5 = 0.375rem = 6px

5. 边框和圆角

类名对应 CSS作用
rounded-lgborder-radius: 0.5rem约 8px 圆角
borderborder-width: 1px添加默认边框

border 主要设置边框宽度。边框颜色通常来自 Tailwind 默认颜色、全局 CSS,或者组件库中的基础样式。

如果项目使用 shadcn/ui,可能还会看到:

border-input

例如:

border border-input

这样边框颜色会使用主题变量。


6. bg-background 和 text-foreground

bg-background
text-foreground

这两个通常不是 Tailwind 原生默认颜色名,而是项目中自定义的主题颜色。

大概率在 Tailwind 配置或 CSS 变量中有类似定义:

:root {
  --background: 0 0% 100%;
  --foreground: 222.2 84% 4.9%;
}

.dark {
  --background: 222.2 84% 4.9%;
  --foreground: 210 40% 98%;
}

然后 Tailwind 配置将它们映射为:

bg-background
text-foreground

它们的优点是能够自动适配明暗主题:

bg-background

表示使用当前主题的背景色,而不是固定写:

bg-white dark:bg-slate-950

这类命名在 shadcn/ui 项目中非常常见。


7. text-[12.5px]

text-[12.5px]

表示:

font-size: 12.5px;

这也是任意值语法。

Tailwind 默认字号一般包括:

text-xs   // 12px
text-sm   // 14px
text-base // 16px

12.5px 不在默认字号中,所以使用中括号。

除非设计稿要求非常精确,否则通常可以考虑:

text-xs

因为标准字号更容易保持项目整体的一致性。


8. appearance-none

这是这里比较重要、也比较不常见的类:

appearance-none

对应:

appearance: none;

浏览器会为 &lt;select&gt; 提供原生外观,包括:

  • 默认下拉箭头
  • 系统边框
  • 不同操作系统特有的样式

设置 appearance-none 后,会移除大部分浏览器原生外观,方便自己控制样式。

例如:

<div className="relative">
  <select className="appearance-none pr-8">
    ...
  </select>

  <ChevronDown
    className="
      pointer-events-none
      absolute
      right-3
      top-1/2
      size-4
      -translate-y-1/2
    "
  />
</div>

这里:

  • appearance-none 隐藏原生箭头
  • pr-8 为自定义箭头留位置
  • 父元素 relative 作为定位参照
  • 图标使用 absolute 定位

所以你这段代码里的:

relative
pr-7
appearance-none

很可能本来就是为自定义下拉箭头准备的。


9. 整体布局关系

可以把它理解成:

外层 Flex 容器
├── 运行记录下拉框
│   ├── 最小 280px
│   ├── 最大 360px
│   └── 不允许压缩
│
└── 状态筛选下拉框
    ├── 固定 180px
    └── 不允许压缩

当屏幕宽度足够时:

[ 运行记录下拉框 ]  12px  [ 状态下拉框 ]

当屏幕宽度不足时,由于存在:

flex-wrap
flex-shrink-0

它们不会被强行压得很窄,而是变成:

[ 运行记录下拉框 ]

[ 状态下拉框 ]

最值得注意的几个类

这段代码中相对不常见、但比较重要的是:

mb-[14px]       // 任意值:下边距 14px
min-w-[280px]   // 任意值:最小宽度 280px
max-w-[360px]   // 任意值:最大宽度 360px
w-[180px]       // 任意值:固定宽度 180px
text-[12.5px]   // 任意值:字号 12.5px
flex-shrink-0   // Flex 空间不足时不压缩
appearance-none // 移除 select 的浏览器原生外观
bg-background   // 项目自定义的主题背景色
text-foreground // 项目自定义的主题文字色

其中 relative + appearance-none + pr-7 这三个组合起来看,基本可以判断该下拉框设计上准备使用一个自定义箭头。