news 2026/6/24 15:29:19

CSS 编写与管理范式 - Tailwind和CSS-in-JS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CSS 编写与管理范式 - Tailwind和CSS-in-JS

Tailwind CSSCSS-in-JS是两种完全不同的CSS 编写与管理范式,代表了现代前端在“如何高效、可维护地处理样式”上的两种主流思路。

下面从本质、原理、使用方式到优劣对比,为你系统梳理:


一、Tailwind CSS:原子化(Utility-First)CSS 框架

✅ 是什么?

  • 一个预定义大量原子化工具类(Utility Classes)的 CSS 框架。
  • 直接在 HTML/JSX 中组合这些类名来构建 UI,不写传统 CSS
  • 样式最终通过@tailwind base; @tailwind components; @tailwind utilities;引入,并在构建时自动剔除未使用的类(JIT 模式)。

示例

// 用 Tailwind 写一个按钮 <button className="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600 transition"> Click me </button>

每个 class 对应一个 CSS 属性:bg-blue-500background-color: #3b82f6;

核心特点

  • 实用优先(Utility-First):不提供“按钮组件”,只提供“积木块”。
  • 设计系统约束:颜色、间距、断点等由tailwind.config.js统一配置,保证一致性。
  • 响应式 & 状态变体简单md:text-centerhover:bg-red-500dark:bg-gray-800
  • 生产 CSS 极小:仅包含项目中实际用到的类。
  • 需配合构建工具(Vite/Webpack) +Tailwind 配置文件

💡 有趣的是:shadcn/ui 虽然基于 Tailwind,但其组件内部其实用了 radix UI(无样式)+ Tailwind(样式),本质上是一种“Tailwind 版的组件封装”,兼顾了两者的优点。


二、CSS-in-JS:将 CSS 写在 JavaScript 中

✅ 是什么?

  • 一种在 JS/TS 文件中直接定义样式的技术方案。
  • 样式以JavaScript 对象或模板字符串形式存在,运行时动态生成<style>标签注入 DOM。
  • 主流库:styled-componentsEmotionStitches等。

示例(以 styled-components 为例)

import styled from 'styled-components'; const Button = styled.button` background: ${props => props.primary ? '#007bff' : '#e9ecef'}; color: white; padding: 0.5rem 1rem; border-radius: 4px; &:hover { opacity: 0.9; } `; function App() { return <Button primary>Click me</Button>; }

核心特点

  • 组件级作用域:自动生成唯一 class 名(如sc-bdVaMY),避免全局污染。
    CSS-in-JS 库在 运行时对样式内容进行处理,生成一个几乎不可能重复的字符串作为 class 名,有多种生成策略,比如基于样式内容的哈希,基于组件名+计数器等等。
  • 动态样式:直接使用 JS 变量、props、state 控制样式。
  • 逻辑与样式同文件:符合 React 组件化思想。
  • 运行时注入:样式在 JS 执行时生成并插入<head>
  • 无需额外 CSS 文件:一切在.js/.tsx中完成。

三、核心区别对比表

维度Tailwind CSSCSS-in-JS
编写位置HTML/JSX 的className属性中JavaScript/TypeScript 文件内部
样式形式预定义的 CSS 类名(字符串)JS 对象 / 模板字符串
作用域全局类名(但通过命名约定避免冲突)自动局部作用域(唯一 class 名)
动态能力有限(需结合 JS 条件拼接 class)原生支持(直接用 props/state)
构建时 vs 运行时构建时生成静态 CSS(无运行时开销)运行时生成 CSS(有轻微性能成本)
包体积影响最终 CSS 小;无 JS 运行时增加 JS bundle(如 styled-components ~10KB)
主题切换通过 CSS 变量 +dark:前缀通过ThemeProvider+ props
调试体验浏览器 DevTools 显示清晰类名(如bg-blue-500显示随机 class 名(如sc-123abc),需插件辅助
学习曲线需记忆大量工具类(但文档完善)需理解 JS 作用域和模板字符串
典型用户Vercel (Next.js)、Shopify、NetflixAtlassian、Airbnb、早期 GitHub

四、如何选择?

✅ 选Tailwind CSS如果:

  • 你追求极致性能(无运行时、纯静态 CSS)
  • 你希望快速搭建一致 UI(受设计系统约束)
  • 你习惯声明式、组合式的开发方式
  • 你使用Next.js、Remix 等 SSR 框架(Tailwind 与之深度集成)

✅ 选CSS-in-JS如果:

  • 你需要高度动态的样式(如根据 API 数据变色)
  • 你坚持样式与组件完全封装(真正“组件即一切”)
  • 你讨厌全局 CSS 命名冲突的历史包袱
  • 你的团队已熟悉styled-components生态

五、趋势与融合

  • Tailwind 正在吸收 CSS-in-JS 优点

    • 支持@apply封装组件类
    • 支持任意值text-[#123456]
    • 结合clsx/cva实现条件 class 组合
  • CSS-in-JS 也在优化性能

    • Emotion 支持cssprop + Babel 插件提取关键 CSS
    • Linaria、Astro 等实现编译时 CSS-in-JS(零运行时)

💡 有趣的是:shadcn/ui 虽然基于 Tailwind,但其组件内部其实用了 radix UI(无样式)+ Tailwind(样式),本质上是一种“Tailwind 版的组件封装”,兼顾了两者的优点。


总结一句话:

Tailwind 是“用类名拼 UI”,CSS-in-JS 是“用 JS 写 CSS”。前者重构建时效率设计约束**,后者重运行时灵活性组件封装。没有绝对好坏,只有是否匹配你的项目需求与团队习惯。**

如果你刚开始新项目,且用 Next.js + Tailwind,Tailwind 是更安全、高效的选择
如果你在做高度定制化的可视化应用,CSS-in-JS 的动态能力可能更合适

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 18:15:51

机器学习 —— 数据泄露

摘要&#xff1a;机器学习中数据泄露会导致模型过拟合&#xff0c;主要分为目标泄露&#xff08;使用预测时无法获取的特征&#xff09;和训练-测试集污染&#xff08;预处理时混入测试集信息&#xff09;。防止措施包括&#xff1a;严格划分训练/测试集、仅使用可获取特征、采…

作者头像 李华
网站建设 2026/6/10 7:50:57

大数据领域 OLAP 的实时数据分析平台搭建

大数据领域 OLAP 的实时数据分析平台搭建 关键词&#xff1a;大数据、OLAP、实时数据分析平台、数据仓库、架构设计 摘要&#xff1a;本文围绕大数据领域 OLAP 的实时数据分析平台搭建展开。首先介绍了搭建此平台的背景&#xff0c;包括目的、预期读者等信息。接着阐述了 OLAP …

作者头像 李华
网站建设 2026/6/18 21:01:00

CANN 性能调优指南:如何榨干昇腾芯片算力?

从模型转换到推理部署&#xff0c;全链路解锁昇腾 NPU 极致性能 &#x1f9e9; 引言&#xff1a;为什么你的模型没跑满昇腾算力&#xff1f; 你是否遇到过以下情况&#xff1f; 昇腾 910 理论算力 256 TFLOPS&#xff08;FP16&#xff09;&#xff0c;但实测仅用到 30%&#…

作者头像 李华
网站建设 2026/6/15 12:11:30

LLM - 从 0 打造专业 Agent Skill:一套能落地的完整实践指南

文章目录引言&#xff1a;为什么该重视 Agent Skill&#xff1f;一、先搞清楚&#xff1a;Skill 到底解决什么问题&#xff1f;1.1 传统用法的三大痛点1.2 一句话理解 Skill1.3 Skill 相比其他方案的定位1.4 什么时候值得做成 Skill&#xff1f;二、四个核心设计原则&#xff1…

作者头像 李华
网站建设 2026/6/13 8:08:13

关于 lint-staged 的解析

1. 它是什么可以把代码仓库想象成一个文件柜&#xff0c;里面存放了许多文件。当开发人员修改代码时&#xff0c;这些改动并不会直接扔进文件柜&#xff0c;而是先放在一个叫“暂存区”的篮子里。这个篮子里的文件&#xff0c;就是准备被正式归档&#xff08;提交&#xff09;的…

作者头像 李华
网站建设 2026/6/23 10:17:49

Lucide React 详解

1. 它是什么Lucide React 是一个为 React 应用提供的图标组件库。它本质上是一套封装成 React 组件的矢量图标集合。可以把它理解为一套精心设计、风格统一的“图形字”&#xff0c;但它是用代码&#xff08;SVG&#xff09;的形式提供的&#xff0c;而不是字体文件。生活中常见…

作者头像 李华