CSS-in-JS vs 传统CSS:现代样式方案选择指南
开篇:这个技术是做什么的?

我们都知道,在网页开发中,HTML 负责结构,CSS 控制页面的外观和样式,JavaScript 则负责交互与逻辑。但随着前端技术的发展,传统的 CSS(层叠样式表)在一些复杂项目中逐渐暴露出一些问题,比如:
- 样式命名容易冲突
- 组件化开发中样式管理困难
- 维护成本高、复用性差
为了解决这些问题,CSS-in-JS这种新的方式应运而生。它不是取代 CSS,而是将 CSS 引入 JavaScript 中编写,让样式与组件更紧密地绑定在一起。
这篇教程会带你从零开始,理解“什么是 CSS-in-JS”、“为什么要学习它”、“如何使用它”,并对比传统 CSS 的写法。无论你是刚接触前端的新手,还是已经写过几页 HTML/CSS 页面的同学,都可以轻松上手。
环境准备:搭建开发环境

第一步:安装 Node.js 和 npm
大多数现代前端项目都依赖于 Node.js 和它的包管理器 npm(或 yarn)。
请访问官网 https://nodejs.org/ 下载安装。
安装完成后,打开终端(Mac/Linux)或者命令提示符(Windows),输入以下命令检查是否成功安装:
node -v
npm -v
如果看到类似 v18.x.x 和 9.x.x 这样的版本号,说明安装成功!
第二步:创建一个 React 项目(用于实战练习)
我们将用流行的框架 React 来进行对比实践,因为它是目前最广泛使用支持 CSS-in-JS 的框架之一。
运行以下命令来创建一个基础项目:
npx create-react-app css-comparison
cd css-comparison
npm start
这会在浏览器自动打开一个空白的 React 应用页面,你可以关闭标签页继续操作。
第三步:安装常用的 CSS-in-JS 工具 —— styled-components
我们将使用 styled-components 这个库来进行演示。它是 CSS-in-JS 领域中非常流行且易于上手的解决方案。
执行以下命令安装:
npm install styled-components
现在,我们的开发环境就准备好了!
核心概念讲解

在正式写代码之前,我们先来了解一下这两个技术的基本概念和区别。
传统 CSS 是什么?
这是你可能已经接触过的经典方式:我们用 <style> 标签或者单独的 .css 文件来定义样式,并通过类名应用到 HTML 元素上。
示例:
在文件 App.css 中:
.button {
background: blue;
color: white;
padding: 10px 20px;
border-radius: 5px;
}
然后在你的 App.js 中这样使用:
import './App.css';
function App() {
return (
<button className="button">点我</button>
);
}
优点:直观,兼容性好,适合简单项目。
缺点:命名冲突、样式散乱、难以复用。
CSS-in-JS 是什么?
顾名思义,就是把 CSS 写在 JavaScript 文件中。
使用特定的库(如 styled-components)来定义可重用的“带样式的组件”。
示例:
使用 styled-components 创建一个按钮组件:
import styled from 'styled-components';
const Button = styled.button`
background: blue;
color: white;
padding: 10px 20px;
border-radius: 5px;
`;
function App() {
return <Button>点我</Button>;
}
优点:组件与样式一一对应、避免命名冲突、样式动态性强。
缺点:学习曲线略陡;对新手稍显抽象;首次构建时间稍长。
总结对比列表
| 特性 | 传统 CSS | CSS-in-JS |
|---|---|---|
| 是否需要额外安装 | 不需要 | 需要库(如 styled-components) |
| 命名是否易冲突 | 是 | 否(自动生成唯一类名) |
| 是否支持动态样式 | 否(需手动 JS 操作) | 是(直接传变量) |
| 是否便于组件化 | 较难 | 非常好 |
| 学习难度 | 简单 | 中等 |

实战项目:写一个按钮组件,两种方式实现

我们来一步步写一个简单的按钮组件,分别用传统 CSS 和 styled-components 来实现。
方法一:传统 CSS 实现按钮组件
第一步:新建一个 CSS 文件 MyButton.css
.my-button {
background-color: #4CAF50; /* 绿色背景 */
color: white;
padding: 12px 24px;
font-size: 16px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.my-button:hover {
background-color: #45a049;
}
第二步:在 App.js 中引入并使用
import './MyButton.css';
function MyButton() {
return (
<button className="my-button">普通按钮</button>
);
}
export default function App() {
return (
<div>
<h1>我是标题</h1>
<MyButton />
</div>
);
}
效果你应该看到了 —— 一个绿色按钮出现了!
方法二:用 CSS-in-JS 实现相同按钮
第一步:导入 styled 并创建样式组件
import styled from 'styled-components';
// 创建一个“带样式的按钮组件”
const StyledButton = styled.button`
background-color: #4CAF50;
color: white;
padding: 12px 24px;
font-size: 16px;
border: none;
border-radius: 4px;
cursor: pointer;
&:hover {
background-color: #45a049;
}
`;
第二步:在 App.js 中使用该组件
function App() {
return (
<div>
<h1>我是标题</h1>
<StyledButton>样式按钮</StyledButton>
</div>
);
}
效果是一样的!但它有一个巨大的优势:不需要再担心类名重复了!
动态样式(进阶):传递 props 改变颜色
我们可以给按钮添加属性(props),让它根据传入的值变化。
比如我们想让按钮的颜色可以设置成蓝色或红色。
const DynamicButton = styled.button`
background-color: ${props => props.color || '#4CAF50'};
color: white;
padding: 12px 24px;
font-size: 16px;
border: none;
border-radius: 4px;
cursor: pointer;
`;
然后使用时:
<DynamicButton color="blue">蓝色按钮</DynamicButton>
<DynamicButton color="red">红色按钮</DynamicButton>
是不是很方便?这就是 CSS-in-JS 的强大之处!
常见问题解答(FAQ)

Q1:学完传统 CSS 就够了吗?为什么还要学 CSS-in-JS?
如果你只是做静态网页或小型项目,传统 CSS 完全够用,甚至更好。但如果你想进入现代前端开发领域,特别是使用像 React、Vue 或 Angular 这类框架的话,掌握 CSS-in-JS 技术会让你的开发效率更高、代码结构更清晰。
Q2:CSS-in-JS 会影响性能吗?
虽然它比原生 CSS 构建慢一点,但在实际项目中影响几乎可以忽略不计。而且大多数库都会做优化(比如缓存生成的类名)。只要不过度滥用,完全不用担心性能问题。
Q3:CSS-in-JS 和内联样式的区别是什么?
很多人误以为 CSS-in-JS 就是内联样式,其实它们完全不同。
- 内联样式:直接写在 HTML 上的样式,例如
<div style="color:red"></div>,不利于维护。 - CSS-in-JS:本质还是 CSS,只不过是由 JS 创建并通过
<style>注入到页面上的。
Q4:CSS-in-JS 只能在 React 里用吗?
不完全是。虽然大部分库都是为 React 设计的,但也有一些库可以用于 Vue、Angular、甚至是普通的 JS 项目中。不过主流生态中以 React 为主。
学习建议:下一步怎么学?
恭喜你完成了本教程!接下来推荐你沿着以下路线继续深入学习:
📚 推荐学习路径
巩固 CSS 基础
- 掌握盒模型、布局(Flex / Grid)、响应式设计
- 推荐资源:MDN CSS 教程、《CSS揭秘》书籍
学习基本的 React 知识
- 函数组件、状态管理、props 传递
- 推荐资源:React 官方文档、React 新手入门课程
掌握 styled-components 更高级的用法
- 主题系统(ThemeProvider)
- 动态 props、媒体查询(media templates)
- 推荐资源:styled-components 官网
尝试其他 CSS-in-JS 方案
- 如 emotion、goober、vanilla-extract 等
参与开源项目或仿写 UI 组件库
- 锻炼组件化开发能力 + 样式封装技巧
结语
这篇文章我们介绍了两种现代前端开发中的样式方案:
- 传统 CSS:基础、实用、适合小项目
- CSS-in-JS:模块化、组件化、适合现代框架项目
对于初学者来说,建议你先熟练掌握传统 CSS,再逐步过渡到 CSS-in-JS。两种方式并不是非此即彼,很多项目中还会混合使用。
希望这篇教程能帮助你迈出学习现代前端开发的重要一步!如果你还有任何疑问,欢迎随时留言交流 ❤️
✅ 附录:本文示例完整代码地址
👉 GitHub 示例仓库链接:github.com/example/css-in-js-demo(示例仅供教学展示)

评论 0