news 2026/4/17 15:46:20

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/4/18 5:07:42

uni-app—— uni-app 小程序页面栈超限导致跳转失败的解决方案

用户反馈"新增按钮点击无效"&#xff0c;开发第一次却无法复现。直到测试发现"新增到第16个时才会报错"&#xff0c;才揭开了微信小程序页面栈10层限制的真相。本文记录这个经典问题的排查过程和解决方案。一、问题背景 1.1 问题现象 用户在"档案管理…

作者头像 李华
网站建设 2026/4/18 5:09:58

游戏大厂 FPS 射击游戏高精度物理同步方案详解(大白话、生动版)

做 FPS 联机,最容易把人逼疯的,不是枪后坐力,也不是伤害公式,而是玩家一句话: “我明明躲到墙后了,怎么还死了?” 你以为玩家在阴阳怪气,实际上他可能说的是真话——在他屏幕上确实躲进去了。 但服务器那边判定:你还露着半个肩膀。于是你就“被打死在墙后”。 这类问…

作者头像 李华
网站建设 2026/4/18 5:01:57

CANN生态场景化部署:cann-deployer实现AIGC大模型一键落地

在AIGC大模型产业化落地进程中&#xff0c;场景化部署是连接技术与实际应用的关键环节。不同产业场景&#xff08;如智能办公、数字文创、行业咨询&#xff09;对大模型部署的需求差异较大&#xff0c;开发者常常面临部署场景适配难、流程繁琐、多环境兼容差、落地周期长等痛点…

作者头像 李华
网站建设 2026/4/18 5:02:02

CANN生态智能化升级:cann-auto-tune引领AIGC大模型自适配优化新趋势

随着AIGC大模型向多模态、千亿级参数量方向迭代&#xff0c;以及产业场景的多元化发展&#xff0c;传统手动优化模式已难以满足大模型全链路开发的效率需求&#xff0c;智能化、自适配优化成为AIGC技术落地的新趋势。开发者常常面临优化参数调试繁琐、适配场景多变、手动优化效…

作者头像 李华
网站建设 2026/4/18 5:07:40

CANN生态协同增效:cann-ensemble实现AIGC大模型集成部署与能力叠加

在AIGC大模型产业化落地过程中&#xff0c;单一模型的能力往往难以满足复杂场景的应用需求&#xff0c;多模型集成、能力叠加已成为行业新趋势。开发者常常面临多模型集成繁琐、协同效率低、资源占用过高、部署难度大等痛点&#xff0c;导致多模型能力无法高效融合&#xff0c;…

作者头像 李华