CSS-in-JS vs 传统CSS:现代样式方案选择指南

♂邓文
2025-06-19 16:33
阅读 654

开篇:什么是CSS-in-JS和传统CSS?

开篇:什么是CSS-in-JS和传统CSS?

在前端开发中,我们经常需要为网页添加“样式”——比如设置按钮颜色、字体大小、背景图片等。实现这些样式的最传统方式是使用 CSS(层叠样式表),这是我们今天要介绍的第一种方法。

然而,随着 JavaScript 框架的发展(尤其是 React 的流行),一种新的做法开始兴起,叫做 CSS-in-JS。它的基本思想是:把样式写在 JavaScript 文件里,而不是单独的 .css 文件

这两种方式都能完成任务,但它们各有优缺点。接下来,我们就从零开始一步步认识它们,看看哪一种更适合你!


环境准备:搭建你的开发环境

环境准备:搭建你的开发环境

要开始实践 CSS 和 CSS-in-JS,你需要一个基础的开发环境:

步骤 1:安装 Node.js

前往 https://nodejs.org,下载并安装最新 LTS 版本(长期支持版)。

验证是否安装成功:

node -v
npm -v

你应该能看到类似输出:

v20.11.x
9.8.x

步骤 2:创建项目目录

新建一个文件夹作为你的工作目录,例如:

mkdir css-vs-js-demo
cd css-vs-js-demo

步骤 3:初始化 npm 项目

运行以下命令来创建 package.json

npm init -y

步骤 4:安装 Vite(现代前端构建工具)

我们将使用 Vite 来快速搭建开发服务器:

npm create vite@latest

按照提示选择:

  • 项目名称:css-vs-js-demo
  • 框架类型:选择 React
  • 是否使用 TypeScript?选择 No
  • 是否需要额外功能?回车继续

进入新项目并安装依赖:

cd css-vs-js-demo
npm install

启动开发服务器:

npm run dev

现在你可以访问 http://localhost:5173 查看默认页面。

🎉 至此,你的开发环境已经准备好!下一步我们来看看如何写样式。


核心概念:CSS vs CSS-in-JS 是什么?

JavaScript框架对比-1

核心概念:CSS vs CSS-in-JS 是什么?

我们先用一句话概括区别:

CSS 是独立的样式文件;而 CSS-in-JS 是将样式直接写进 JavaScript 中。

为了更清楚地说明,下面我们分别介绍两种方式的核心概念和语法特点。


传统CSS:分离式样式管理

✅ 优点:

  • 简单直观,学习成本低
  • 浏览器原生支持,性能好
  • 大型项目易维护(如果结构清晰)

💡 基本用法:

创建一个文件:src/index.css,内容如下:

.container {
  text-align: center;
  padding: 20px;
}

.title {
  color: #333;
}

然后在 main.jsx 中引入它:

import './index.css'

function App() {
  return (
    <div className="container">
      <h1 className="title">Hello, CSS!</h1>
    </div>
  )
}

export default App

✅ 效果:你会看到居中的标题文字,并带有灰色字体。


CSS-in-JS:样式和组件紧密绑定

✅ 优点:

  • 避免类名冲突
  • 动态样式更容易实现
  • 更适合组件化开发(如 React)

💡 常见库推荐:

  • styled-components(最受欢迎)
  • Emotion
  • JSS

🛠️ 我们以最常用的 styled-components 为例来演示:


使用 styled-components 实现相同效果

第一步:安装库

npm install styled-components

第二步:编写代码

打开 App.jsx,改成如下代码:

import styled from 'styled-components'

// 创建带样式的组件
const Container = styled.div`
  text-align: center;
  padding: 20px;
`

const Title = styled.h1`
  color: #333;
`

function App() {
  return (
    <Container>
      <Title>Hello, styled-components!</Title>
    </Container>
  )
}

export default App

✅ 效果:仍然看到居中的黑色标题,但这次样式是直接写在 JS 文件里!


小结对比表

特性 传统 CSS CSS-in-JS(以 styled-components 为例)
编写位置 单独 .css 文件 JS 文件内
类名控制 手动命名 className 自动生成唯一 class 名
动态样式 相对困难 易于传入变量/函数
学习难度 简单 初学者稍难
适用框架 所有 主要用于 React

实战项目:做一个彩色按钮组件

目标:

用两种方式都实现一个“按钮”,可以点击,并根据状态显示不同颜色。


方法一:传统CSS方式

1. 创建 Button.css

.my-button {
  padding: 10px 20px;
  font-size: 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

.my-button.red {
  background-color: red;
  color: white;
}

.my-button.blue {
  background-color: blue;
  color: white;
}

2. 使用 Button 组件

import './Button.css'
import { useState } from 'react'

function MyButton({ label }) {
  const [color, setColor] = useState('red')

  return (
    <button 
      className={`my-button ${color}`} 
      onClick={() => setColor(color === 'red' ? 'blue' : 'red')}
    >
      {label}
    </button>
  )
}

export default function App() {
  return (
    <div>
      <MyButton label="切换颜色" />
    </div>
  )
}

✅ 运行后你会看到一个红色按钮,点击会变成蓝色。


方法二:CSS-in-JS 方式(使用 styled-components)

1. 安装和导入

确认已安装:

npm install styled-components

2. 修改代码:

import styled from 'styled-components'
import { useState } from 'react'

const StyledButton = styled.button`
  padding: 10px 20px;
  font-size: 16px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  color: white;
  background-color: ${props => props.color};
  transition: background-color 0.3s ease;


![移动端适配方案-2](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025061916/676aaf9f-f309-486c-95ce-1fe063149fc7.jpg)


  &:hover {
    opacity: 0.85;
  }
`

function MyStyledButton({ label }) {
  const [color, setColor] = useState('red')

  return (
    <StyledButton 
      color={color} 
      onClick={() => setColor(color === 'red' ? 'blue' : 'red')}
    >
      {label}
    </StyledButton>
  )
}

export default function App() {
  return (
    <div>
      <MyStyledButton label="切换颜色" />
    </div>
  )
}

✅ 这个版本同样实现动态变色按钮,但所有样式都在 JS 文件中定义。


常见问题解答

Q1:我学哪个更好?CSS 还是 CSS-in-JS?

👉 如果你是新手,建议先掌握传统 CSS。因为它是所有前端开发的基础,而且很多项目仍在使用。

👉 如果你想深入 React 生态,或想提升组件封装能力,CSS-in-JS 是个不错的选择。


Q2:CSS-in-JS 性能好吗?

大部分情况下不会成为瓶颈。现代库优化很好。但在大型项目或极端场景下,纯 CSS 可能更快一点。


Q3:怎么避免类名冲突?

✔️ 传统 CSS 需要手动注意类名命名规范(BEM 等),容易出错。

✔️ CSS-in-JS 库自动帮你生成唯一类名,几乎不需担心冲突。


Q4:CSS-in-JS 会不会让 JS 文件太臃肿?

如果你把所有样式都写在一起,确实可能影响可读性。建议保持组件小而精,按需导入导出。


Q5:可以用多个 CSS-in-JS 库吗?

可以,但不推荐。选择其中一个统一使用更利于团队协作和后期维护。


学习建议:下一步怎么学?

✅ 先掌握的传统 CSS 技术栈(适合初学者)

  • HTML 基础结构
  • CSS 布局(Flexbox/Grid)
  • 使用预处理器(如 SCSS / LESS)
  • 掌握模块化 CSS(如 BEM 规范)

🔍 再探索 CSS-in-JS 技术栈(适合 React 开发者)

  • 掌握 styled-components 或 emotion
  • 理解主题系统(theme)
  • 学会与 TypeScript 配合使用
  • 尝试 CSS-in-JS 工具链配置(如 SSR 支持)

总结

通过本教程,你学会了:

  • 什么是传统 CSS 与 CSS-in-JS;
  • 如何搭建开发环境;
  • 如何使用两种方式写样式;
  • 动态样式的实现技巧;
  • 常见疑问的解答;
  • 后续学习路径建议。

无论你选择哪种方式,记住:写出来的代码要易于理解和维护才是最重要的

继续练习吧!你可以尝试自己写一个简单的个人主页或者博客界面,尝试两种风格分别实现。很快你就能找到属于自己的最佳实践方式!


🎉 欢迎在评论区留言分享你的项目成果,也可以继续提问!祝你学习愉快,早日成为前端高手!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝