TailWindCSS 4,你用过吗?让我来带你打开新世界的大门!

911 阅读11分钟

一、除了常规CSS,还有哪些样式体系方案,详细说明各自核心概念与缺点。

名称代表/示例核心概念优点缺点
CSS 预处理器【已过时】Sass、Less、Stylus- 变量、嵌套规则、混合器(Mixin)继承(Extend)、运算。
- 提供强大工具和逻辑控制(条件、循环)
- 提升CSS开发效率,代码模块化、易维护
- 提供逻辑控制功能。
- 需要编译,增加开发流程复杂性。
- 生成CSS可能冗余,性能优势较低。
CSS in JSStyled-components、Emotion、JSS- 样式与组件绑定,动态生成CSS。
- 支持模块化与作用域隔离。
- 与React等框架无缝集成,动态样式管理简单
- 避免全局样式污染。
- 运行时性能开销大。
- 学习曲线较陡峭。
CSS模块化(CSS Modules)Webpack支持- 自动生成唯一类名避免冲突,样式按需加载。- 避免命名冲突,性能优于CSS in Js。
- 适合模块化项目,维护性强。
- 需要构建工具支持。
- 动态样式支持不够灵活。
Atomic CSS / Utility-FirstCSSTailwind CSS、Bootstrap Utilities- 提供大量小型功能类名,通过组合构建页面。- 快速开发,无需自定义CSS规则。
- 样式统一,社区生态强大(如Tailwind)
- 学习成本高(大量类)
- HTML文件样式类名多,可读性较差。
PostCSS-CSS工具平台,通过插件链实现功能扩展(如自动前缀、变量)- 灵活性强,插件链可定制。
- 与现代构建工具无缝集成。
- 学习插件配置复杂,增加开发成本。
BEM命名规范-- 基于类名的命名约定:Block(模块) Element(元素) Modifier(变体)。
- 示例:button_icon--large
- 命名清晰,团队协作友好。
- 无工具依赖,简单直接。
- 类名较长,增加代码冗长感。
- 无法动态生成样式,灵活性低于CSS in JS。
Functional CSSTachyons- 样式为功能块,极简类名代表单一功能。
- 类似Atomic CSS,但更注重功能抽象化。
- 功能清晰,简化CSS开发。
- 易于理解和维护。
- 可读性差。依赖记忆文档
Scoped CSSVue scoped样式、ShadowDOM样式作用域限制在组件内(如Vue的scoped或WebComponents的Shadow DOM)- 样式隔离强,代码结构清晰。
- 不受外部影响。
- 需要工具链支持。
- 增加复杂性,全局样式覆盖困难。

二、请举例css、cssinjs、tailwindcss 的使用技巧与方案价值体现

css使用技巧与价值体现

css值得关注的技巧

  • 变量复用: 通过 :root 定义全局变量,提升可维护性。
  • BEM命名规范:使代码更清晰。
  • Flex布局: 快速实现响应式设计。
:root {
  --clor-primary: #123456;
  --bg-primary: withe

  --margin: 2px;
  --padding: 2px;
}

价值

  • 通过变量和BEM规范,增强了代码的模块化和复用性。
  • 响应式设计提升了适配能力。

CSS-in-JS使用技巧与价值体现

CSS-in-JS亮点:

  • 动态样式: 支持根据状态生成样式。
  • 样式隔离: 避免全局污染。
  • 嵌套规则: 便于层级关系定义。
import React, { useState } from "react"
import styled from "styled-components"

// 动态样式
const Button = styled.button`
  padding: 10px 20px;
  border-radius: 5px;
  boeder: none;
  color: white;
  font-size: 16px;
  cursor: poniter;
  background-color: ${{props) => (props.primary ? "#3498db": "#2ecc71")};
  &:hover {
    background-color: ${{props) => (props.primary ? "#2966db": "#2ecc78")};
  }
`;

const App=()=>{
  const [primary,setPrimary] = usestate(true);
  return(
    <div>
      <Button primary={primary} onclick={()=> setPrimary(!primary)}>
        {primary ? "Primary Button" : "Secondary Button")
      </Button>
    </div>
  )
}

价值

  • 样式与组件绑定,减少上下文切换,易于理解。
  • 动态样式让交互更灵活(如 primary 属性)。

Tailwindcss 使用技巧与价值体现

TailwindCss 优势:

  • 原子化设计: 快速实现复杂布局。
  • 样式集中管理: 通过配置文件定制主题。
  • 快速迭代: 减少自定义CSS编写时间。

价值

  • 开箱即用的类名加快开发速度。
  • 配置灵活(如主题扩展)满足不同项目需求。

总结

特性CSSCSS-in-JSTailwindCSS
学习曲线
动态样式支持
可维护性高(配合BEM等)高(模块化、隔离)中(HTML中类名较多)
适合场景静态页面、小型项目React等现代框架快速开发、设计系统

三、TailWindCSS学习

准备阶段

安装

npm install tailwindcss @tailwindcss/vite

配置

  • 导入tailwindcss
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'

export default defineConfig({
  plugins: [
    tailwindcss()
  ],
})
  • 将加载 Tailwind 的指令添加到你的 CSS 文件中
@import "tailwindcss";

基础概念

Tailwind CSS的本质

用大量可复用的原子类来代替传统的手写 CSS,让开发者通过组合这些类快速构建响应式、现代化的界面。

我们依然使用类,但是不用定义了。每个Tailwind 类只是一个预定义的CSS规则。

这是不就是内联样式吗? NO!

<div style="color: red; margin-top: 16px;"></div>

内联样式无法复用、没有响应式、没有伪类、维护性差。

区别

  • Tailwind 是类名,不是直接写 CSS 属性,会自动按需加载。
  • 这些类名在全局 CSS 文件中定义好,浏览器解析时会自动应用对应的样式。
  • 支持响应式(如 md:bg-blue-500)、伪类(如 hover:bg-blue-500)、主题切换等高级特性。
  • 可复用,且不会污染全局样式。
<div class="text-red-500 mt-4 hover:bg-blue-500"></div>

Tailwind CSS 常用类名

1. 颜色相关
类名作用说明示例
text-{color}文本颜色text-blue-500
bg-{color}背景颜色bg-gray-100
border-{color}边框颜色border-red-400
divide-{color}分割线颜色divide-gray-200
placeholder-{color}占位符文本颜色placeholder-gray-400

text-orange-200 这种写法中的 200 表示颜色的“深浅程度”或“色阶(shade)”

常见的色阶有:50、100、200、300、400、500、600、700、800、900、950。

常见的颜色有:gray(灰色)red(红色)yellow(黄色)green(绿色)blue(蓝色)indigo(靛青色)purple(紫色)pink(粉色)orange(橙色)teal(蓝绿色)cyan(青色)lime(青柠)emerald(祖母绿)sky(天蓝)violet(紫罗兰)amber(琥珀色)rose(玫瑰色)fuchsia(紫红) stone、neutral、zinc、slate(多种灰色系)

bg-transparent:背景完全透明。

bg-current:背景色等于当前元素的文本颜色(currentColor)。

2. 字体与排版
类名作用说明示例
text-{size}字体大小text-lg, text-xs
font-{weight}字体粗细font-bold, font-lightfont-normal
italic斜体
not-italic非斜体
uppercase全部大写
lowercase全部小写
capitalize首字母大写
tracking-{value}字间距tracking-wide
leading-{value}行高leading-tight``leading-snug``leading-normal leading-relaxed``leading-none
truncate单行溢出省略号
text-ellipsis多行溢出省略号
text-center居中对齐
text-left左对齐
text-right右对齐
text-justify两端对齐

关于text- {size}

  • text-xs(超小)
  • text-sm(小)
  • text-base(正常/默认)
  • text-lg(大)
  • text-xl(更大)
  • text-2xltext-3xl 等(更大)

size = 1 表示4个像素

3. 布局与间距
类名作用说明示例
m-{size}外边距m-4, mt-2
mx-auto水平居中
p-{size}内边距p-2, py-4
w-{size}宽度w-8, w-full
h-{size}高度h-16, h-screen
min-w-{size}最小宽度min-w-0
max-w-{size}最大宽度max-w-xs
min-h-{size}最小高度min-h-screen
max-h-{size}最大高度max-h-96

对于margin/padding的补充

控制上下或者左右使用mx-{size}``my-{size}

mt-{size}mt-{size}mt-{size}mt-{size}

4. 边框与圆角
类名作用说明示例
border边框宽度border-2
border-{side}指定边框border-t, border-b-4
rounded圆角rounded-lg
rounded-{side}指定方向圆角rounded-tl
divide-x/divide-y分割线divide-x-2
5. Flex 和 Grid
类名作用说明示例
flex启用 flex 布局
flex-row/flex-col主轴方向
items-center交叉轴居中
justify-between主轴两端对齐
gap-{size}间距gap-4
grid启用 grid 布局
grid-cols-{n}列数grid-cols-3
col-span-{n}跨列col-span-2
<div class="flex h-80 w-80 items-center justify-between bg-pink-300">
  <div class="h-25 w-25 bg-orange-300">1</div>
  <div class="h-25 w-25 bg-sky-300">2</div>
  <div class="h-25 w-25 bg-red-900">3</div>
</div>

6. 定位与显示
类名作用说明示例
relative相对定位
absolute绝对定位
fixed固定定位
sticky粘性定位
top-0, left-4偏移量
z-{n}层级z-10
hidden隐藏元素
block块级显示
inline-block行内块
inline行内显示
7. 背景与阴影
类名作用说明示例
bg-{color}背景色bg-green-200
bg-gradient-to-r渐变背景
from-{color} to-{color}渐变起止色
shadow阴影shadow-lg
shadow-none无阴影
8. 透明度与过渡
类名作用说明示例
opacity-{n}透明度opacity-50
transition启用过渡
duration-{n}过渡持续时间duration-300
ease-in ease-out ease-linear ease-in-out过渡曲线
delay-{n}过渡动画延迟时间delay-200 延迟200ms
<button class="transition-colors duration-300 hover:bg-blue-500">
  颜色过渡
</button>

<div class="transition-transform duration-300 hover:scale-110">
  鼠标悬停放大
</div>

<div class="transition-opacity duration-500 hover:opacity-50">
  透明度过渡
</div>

<button class="transition-all duration-500 ease-in-out hover:bg-green-500 hover:scale-105 hover:shadow-lg">
  组合过渡
</button>
9. 交互状态
类名作用说明示例
hover:bg-blue-700悬停时背景色
focus:outline-none聚焦时无外边框
active:scale-95激活时缩放
disabled:opacity-50禁用时透明度
10. 其他常用
类名作用说明示例
cursor-pointer鼠标指针
select-none禁止文本选中
overflow-hidden超出隐藏
overflow-auto超出滚动
resize可拖拽调整大小

更多内容详见 Tailwind CSS 官方文档

小练习1:实现flex响应式布局

<div class="flex items-center bg-green-200 px-2">
  <div class="h-6 w-10 bg-blue-200">logo</div>
  <div class="flex-1 text-center">search</div>
  <ul class="flex items-center space-x-2">
    <li class="cursor-pointer">百度</li>
    <li class="cursor-pointer">京东</li>
    <li class="cursor-pointer">淘宝</li>
  </ul>
</div>
<div class="flex items-center md:w-[70%] my-0 mx-auto h-[calc(100vh-24px)]">
  <div class="bg-orange-200 w-40 h-full hidden md:block px-2">专栏</div>
  <div class="bg-pink-200 h-full w-full px-2">内容区</div>
</div>

小练习2:实现grid响应式布局

<h1 class="text-center">grid布局</h1>
<div class="mx-auto my-2 grid min-h-[500px] w-[80%] grid-cols-[repeat(auto-fill,minmax(260px,1fr))] gap-3 rounded-md border-amber-100 bg-amber-50 p-3 shadow">
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
  <div class="flex items-center justify-center rounded-md bg-orange-300 p-3">box</div>
</div>

如何让你的网页适配不同端? --移动优先断点

在编写样式时,默认的样式优先适配移动端(小屏幕),然后通过断点(breakpoints)为更大的屏幕(如平板、桌面)增加或覆盖样式。

sm仅适用于small及以上版本

md仅适用于medium及以上版本

暗色切换练习

<template>
  <div class="mx-auto flex h-100 w-100 flex-col items-start justify-center rounded-2xl bg-amber-50 p-5 dark:bg-gray-600">
    <h1 class="text-3xl font-bold dark:text-teal-50">hello world</h1>
    <p class="mt-3 mb-8 text-gray-500 dark:text-gray-100">
      The Zero Gravity Pen can be used to writein any orientation, including upside-down. lteven works in outer space.
    </p>
    <button class="cursor-pointer rounded-md bg-blue-100 p-3 font-bold text-indigo-900 transition-colors duration-500 hover:bg-blue-200" @click="toggleDarkModel">
      Toggle Dark Model
    </button>
  </div>
</template>
<script setup>
  const toggleDarkModel = () => {
    document.documentElement.classList.toggle('dark')
  }
</script>

自定义变量

各命名空间的含义

NamespaceUtility classes 示例
--color-*颜色相关,如 bg-red-500text-sky-300
--font-*字体家族,如 font-sans
--text-*字体大小,如 text-xl
--font-weight-*字体粗细,如 font-bold
--tracking-*字符间距,如 tracking-wide
--leading-*行高,如 leading-tight
--breakpoint-*响应式断点,如 sm:*
--container-*容器查询和尺寸,如 @sm:*max-w-md
--spacing-*间距和尺寸,如 px-4max-h-16
--radius-*圆角,如 rounded-sm
--shadow-*阴影,如 shadow-md
--inset-shadow-*内阴影,如 inset-shadow-xs
--drop-shadow-*投影滤镜,如 drop-shadow-md
--blur-*模糊滤镜,如 blur-md
--perspective-*透视效果,如 perspective-near
--aspect-*宽高比,如 aspect-video
--ease-*动画缓动函数,如 ease-out
--animate-*动画效果,如 animate-spin
@import "tailwindcss";

@theme {
  --color-primary:#1e40af // 在这里可以自定义你需要的变量
}

组件复用

官方推荐复用方式:@apply 指令 + @layer components

@layer base:用于定义全局的基础样式,通常会影响所有页面的基础 HTML 元素(如 h1、p、a 等)。

@layer components:用于定义项目中可复用的组件类(class),比如卡片、按钮、表单等。

@utility :用来定义一些非常小巧、单一职责、可复用性极高的工具类(utility class)。

@import "tailwindcss";

@custom-variant dark (&:where(.dark, .dark *));

@layer base {
  h1 {
    @apply text-3xl font-bold dark:text-teal-50
  }

  p {
    @apply mt-3 mb-8 text-gray-500 dark:text-gray-100
  }
}

@layer components {
  .card {
    @apply mx-auto flex h-100 w-100 flex-col items-start justify-center rounded-2xl bg-amber-50 p-5 dark:bg-gray-600
  }
  .switch-button {
    @apply m-3 cursor-pointer rounded-md bg-blue-100 p-3 font-bold text-indigo-900 transition-colors duration-500 hover:bg-blue-200
  }
}

@utility flex-center {
  @apply flex justify-center items-center
}
<template>
<div class="card flex-center">
  <h1>hello world</h1>
  <p>The Zero Gravity Pen can be used to writein any orientation, including upside-down. lteven works in outer space.</p>
  <button class="switch-button" @click="toggleDarkModel">Toggle Dark Model</button>
  <button class="switch-button" @click="toggleDarkModel">Toggle light Model</button>
</div>
</template>
<script setup>
  const toggleDarkModel = () => {
    document.documentElement.classList.toggle('dark')
  }
</script>

小Tips

accent-{color}:用于设置表单控件(如 checkbox、radio、range、progress)的主题色(高亮色)

<!-- Accent -->
<div class="my-4 ml-2 flex flex-col">
  <label> <input type="checkbox" checked />Brower defalut </label>
  <label> <input type="checkbox" class="accent-pink-500" checked />Customized </label>
</div>

Fluid Texts: 字体大小不再是固定的,而是根据屏幕宽度在一定区间内线性变化----流动字体

<!-- Fluid Texts -->
<!-- <p class="sm:text-7xl text-5xl">Hello TailWindCSS</p> --> 
<p class="text-[min(10vw,70px)]">Hello TailWindCSS</p>

注释掉的实现是一种僵硬的字体大小“跳变”的方式。下面的是流动字体。

file:xxx是专门用来给 <input type="file"> 元素的“选择文件”按钮部分添加样式

<!-- File -->
<div class="h-80 w-80 bg-indigo-950 flex justify-center items-center">
  <label class="my-4 block">
    <input type="file" class="block w-full text-sm text-slate-500 file:mr-4 file:rounded-full file:border-0 file:bg-violet-50 file:px-4 file:py-2 file:text-sm file:font-semibold file:text-violet-700 hover:file:bg-violet-100" />
  </label>
</div>

Highlight: 文字高亮设置

<div class="selection:bg-orange-400 selection:text-white">
  <p>夜色如墨,城市的霓虹在雨后朦胧中闪烁。林然独自走在回家的路上,耳边回荡着远处的钢琴声。她停下脚步,抬头望见那扇熟悉的窗,灯光温暖。她忽然明白,人生的答案,也许就在这平凡的夜晚里悄然降临。
</p>
</div>

使用折叠实现 less JavaScript

<template>
<div class="max-w-xl mx-auto p-8 bg-orange-200 rounded-lg">
  <div class="max-w-lg mx-auto p-8">
    <details class="rounded-lg p-6 open:bg-white open:shadow-lg open:ring-1 open:ring-black/5 dark:open:bg-slate-900 dark:open:ring-white/10">
      <summary class="text-sm leading-6 font-semibold text-slate-900 select-none dark:text-white">Why do they call it Ovaltine?</summary>
      <div class="mt-3 text-sm leading-6 text-slate-600 dark:text-slate-400">
        <p>The mug is round. The jar is round. They should call it Roundtine.</p>
      </div>
    </details>
    <button class="switch-button" @click="toggleDarkModel">toggle dark model</button>
  </div>
</div>

</template>
<script setup>
  const toggleDarkModel = () => {
    document.documentElement.classList.toggle('dark')
  }
</script>

caret-{color} ****在文本框输入时改变光标颜色

<!-- Caret -->
<textarea class="m-2 w-200 p-2 text-slate-900 caret-pink-500" placeholder="type something nice.."></textarea>