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

API打磨师
2025-06-28 20:47
阅读 724

开篇:什么是CSS?它又有哪些新玩法?

开篇:什么是CSS?它又有哪些新玩法?

在网页开发中,**CSS(层叠样式表)**是我们用来给网页“化妆”的工具。你可以把它想象成一套“美颜滤镜”,比如让文字变大、背景变色、按钮圆角等等。

但随着网站越来越复杂,传统的CSS方式也暴露出一些问题。于是,一种新的写法应运而生 —— CSS-in-JS,意思是:把原本单独写的样式代码直接写进 JavaScript 文件里!

在这篇教程中,我们将从零开始,带你认识两种主流的写法:

  • 传统CSS
  • CSS-in-JS

并通过一个简单的小项目,对比它们的使用方法和优缺点,让你了解到底应该选哪种方式来写样式。


环境准备:搭建属于你的前端开发小窝

环境准备:搭建属于你的前端开发小窝

在开始前,我们需要准备好一个基本的开发环境,就像做蛋糕要先有烤箱一样 😊

步骤 1:安装 Node.js 和 npm

👉 访问 https://nodejs.org
👉 下载并安装 LTS 版本(推荐)

验证是否安装成功,在命令行输入:

node -v
npm -v

你会看到类似这样输出(版本号可能不同):

v18.16.0
9.5.1

步骤 2:创建一个新的项目目录

打开终端(Mac)或命令提示符(Windows),输入:

mkdir styles-tutorial
cd styles-tutorial
npm init -y

这会自动创建一个 package.json 文件,记录我们项目的配置信息。

步骤 3:安装 React(我们将在实战部分用到)

npx create-react-app my-app
cd my-app
npm start

等待几秒钟后,浏览器会自动打开一个默认页面,说明React环境已经准备好啦!

💡 小贴士:如果你还没学React也没关系,接下来我们会简单讲解所需概念。


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

CSS动画效果展示-1

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

我们现在来分别看看这两种写法到底是怎么回事!


一、传统CSS:最经典的写法

这是我们最早接触的写样式的方式。它的特点是:

  • 样式写在一个 .css 文件里
  • HTML 文件通过 <link>class 来引入样式
  • 所有组件可以共享这些样式(方便统一风格)
  • 需要特别注意样式名不要重复(容易出错)

示例:

文件结构:

my-app/
├── App.js
├── App.css

App.js:

import './App.css';

function App() {
  return (
    <div className="container">
      <h1 className="title">你好,我是传统CSS</h1>
    </div>
  );
}

export default App;

App.css:

.container {
  background-color: #f4f4f4;
  padding: 20px;
  text-align: center;
}

.title {
  color: blue;
}

二、CSS-in-JS:把样式写进JS里!

顾名思义,就是把样式直接写进 JS 文件中,比如使用库如 styled-componentsemotion

这种写法的主要优点包括:

  • 模块化:每个组件自带样式,不会污染全局
  • 可动态控制样式:根据状态实时修改样式更方便
  • 无需担心类名冲突

示例:使用 styled-components

第一步:安装依赖:

npm install styled-components

App.js:

import styled from 'styled-components';

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

const Title = styled.h1`
  color: green;
`;

function App() {
  return (
    <Container>
      <Title>你好,我是CSS-in-JS</Title>
    </Container>
  );
}

export default App;

是不是很像写HTML标签?但我们在这里定义了带有样式的组件。


三、关键对比总结

对比项 传统CSS CSS-in-JS
学习难度 入门简单 需掌握JS基础 + 库
样式管理 可能出现命名冲突 自动生成唯一类名
动态样式支持 操作困难,需手动处理 支持动态传值,灵活强大
性能 轻量高效 略重,但大多数场景无明显差异
是否适合大型项目 合理组织可支持 更利于组件化架构

实战项目:做一个天气卡片组件 🌤️

实战项目:做一个天气卡片组件 🌤️

为了更好地体会两者的区别,我们来一起实现一个简单的“天气卡片”。

目标效果:

  • 显示温度、天气状况
  • 根据天气情况动态改变背景颜色(晴天/下雨/雪天)

方式一:用传统CSS实现

文件结构:

my-app/
├── components/WeatherCard.js
├── components/WeatherCard.css

WeatherCard.js:

import './WeatherCard.css';

function WeatherCard({ temp, condition }) {
  return (
    <div className={`card ${condition}`}>
      <h2>{temp}°C</h2>
      <p>{condition}</p>
    </div>
  );
}

export default WeatherCard;

WeatherCard.css:

.card {
  width: 200px;
  padding: 20px;
  border-radius: 10px;
  color: white;
  font-family: sans-serif;
  text-align: center;
}

.sunny {
  background-color: yellow;
}

.rainy {
  background-color: #4a90e2;
}

.snowy {
  background-color: lightblue;
}

最后,在 App.js 中使用:

import WeatherCard from './components/WeatherCard';

function App() {
  return (
    <div>
      <WeatherCard temp={25} condition="sunny" />
      <WeatherCard temp={12} condition="rainy" />
      <WeatherCard temp={-5} condition="snowy" />
    </div>
  );
}

方式二:用CSS-in-JS实现(以 styled-components 为例)

安装库(如果之前没装):

npm install styled-components

WeatherCard.js:

import styled from 'styled-components';

const Card = styled.div`
  width: 200px;
  padding: 20px;
  border-radius: 10px;
  color: white;
  font-family: sans-serif;
  text-align: center;
  background-color: ${(props) => {
    switch (props.condition) {
      case 'sunny':
        return 'yellow';
      case 'rainy':
        return '#4a90e2';
      case 'snowy':
        return 'lightblue';
      default:
        return 'white';
    }
  }};
`;

function WeatherCard({ temp, condition }) {
  return (
    <Card condition={condition}>
      <h2>{temp}°C</h2>
      <p>{condition}</p>
    </Card>
  );
}

export default WeatherCard;

✅ 注意看!我们用了模板字符串配合变量来返回不同的 background-color,非常灵活。


对比小结:

能力 传统CSS CSS-in-JS
动态背景色 不易实现 简单直观,直接在JS里判断条件
组件独立性 需人为确保不重复类名 自动生成唯一标识,天然组件级隔离
可维护性 类多时难以管理 每个组件样式都在同一文件中,清晰可见

常见问题解答:新手常遇到的问题汇总

CSS动画效果展示-2


❓ Q1:CSS-in-JS 是不是比传统CSS更好?

没有绝对答案。各有优劣。

  • 适合团队协作、大型项目时,CSS-in-JS更易于管理和扩展;
  • 如果是学习阶段或者小型项目,传统CSS更容易上手。

❓ Q2:CSS-in-JS 的性能会不会差很多?

✅ 大多数实际项目中,性能差别几乎可以忽略。现代框架(如React)+ CSS-in-JS库(如styled-components)优化得很好。


❓ Q3:我该学哪个?

✅ 建议你两个都试试:

  • 学完基础HTML/CSS之后,先掌握传统CSS;
  • 再去学习React时尝试CSS-in-JS,两者都可以成为你技能包的一部分。

❓ Q4:CSS-in-JS 是必须用React的吗?

❌ 不一定,也有非React的CSS-in-JS库,比如 Emotion 的通用版。

不过目前最流行的是与React结合使用。


❓ Q5:能不能混着用?

✅ 完全可以!
你可以为部分组件使用CSS-in-JS,其它地方继续用传统CSS,互不影响。


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

现在你已经有了对两种方式的初步理解,下面是一些实用的学习路径建议:


🎯 初学者建议路线

  1. 先学基础HTML和CSS

    • 推荐资源:MDN Web Docs
    • 熟悉盒模型、布局、伪类、响应式设计等
  2. 再过渡到JavaScript + React

  3. 然后深入CSS-in-JS

  4. 练习构建真实项目

    • Todo List、天气应用、电商卡片展示
    • 结合路由和状态管理(如Redux)加深理解

📘 推荐练习项目清单

项目类型 技术要求 建议顺序
个人简历页面 HTML + CSS 第一步
ToDo任务管理器 React + CSS 第二步
博客列表系统 React + CSS-in-JS 第三步
用户认证系统 React + CSS-in-JS + API调用 第四步

结语:选择适合自己才是最好的

这篇文章我们从头开始,介绍了传统CSS和CSS-in-JS这两种写样式的方法,并通过一个小项目进行了实践对比。

作为初学者,你不需要立刻做出决定要用哪种方式,而是应该根据自己的需求和学习进度来选择合适的方式。

记住一句话:

“写得清楚,看得明白,改得轻松”的代码,才是好代码。

无论你选择哪一种方式,只要勤加练习,都能写出优秀的前端代码!


祝你在前端道路上越走越远!如果有任何疑问,欢迎留言交流。 👋😊

评论 0

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