【CSS】Tailwind CSS 与传统 CSS:设计理念与使用场景对比
1. 开发方式
1.1 传统 CSS
-
手写
CSS
:你需要手动编写CSS
规则,定义类名、ID
或元素选择器,并为每个元素编写样式。 -
分离式开发:
HTML
和CSS
通常是分离的,HTML
中通过类名或ID
引用CSS
文件中的样式。 -
示例:
-
<div class="card">Hello World</div>
-
.card {padding: 1rem;background-color: white;border-radius: 0.5rem;box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); }
-
1.2 Tailwind CSS
-
实用类优先:
Tailwind
提供了大量的实用类(utility classes
),你直接在HTML
中使用这些类来构建样式,而不需要手写CSS
。 -
原子化 CSS:每个实用类只负责一个小的样式功能(如
p-4
表示padding: 1rem
),通过组合这些类来实现复杂的设计。 -
示例:
-
<div class="p-4 bg-white rounded-lg shadow-sm">Hello World</div>
-
2. 设计理念
2.1 传统 CSS
- 语义化:传统
CSS
强调语义化的类名(如.card
、.button
),类名通常与组件的功能或内容相关。 - 可复用性:通过定义通用的类名,可以在多个地方复用样式。
- 灵活性:你可以完全控制样式的细节,但需要手动管理样式的组织和维护。
2.2 Tailwind CSS
- 功能优先:
Tailwind
的类名直接描述样式功能(如text-center
、bg-blue-500
),而不是语义。 - 原子化设计:通过组合多个实用类来实现样式,避免了重复定义样式规则。
- 约束性设计:
Tailwind
提供了一套设计系统(如颜色、间距、字体大小等),帮助你保持设计的一致性。
3. 代码量
3.1 传统 CSS
CSS
文件较大:你需要为每个组件或页面编写独立的CSS
规则,可能会导致CSS
文件体积较大。- 重复代码:如果多个组件有相似的样式,可能会导致代码重复。
3.2 Tailwind CSS
- HTML 文件较大:由于直接在
HTML
中使用实用类,HTML
文件可能会显得臃肿。 - CSS 文件较小:
Tailwind
通过PurgeCSS
移除未使用的样式,最终生成的CSS
文件通常较小。
4. 维护性
4.1 传统 CSS
- 维护成本较高:随着项目规模的增长,
CSS
文件可能会变得难以维护,尤其是当多个开发者共同维护时。 - 命名冲突:需要小心管理类名,避免全局样式冲突。
4.2 Tailwind CSS
- 维护成本较低:由于样式是通过实用类直接应用的,减少了全局样式的冲突问题。
- 一致性:Tailwind 的设计系统确保了样式的一致性,减少了样式不一致的问题。
5. 学习曲线
5.1 传统 CSS
- 学习曲线较低:传统 CSS 是 Web 开发的基础,几乎所有开发者都熟悉。
- 灵活性高:你可以完全控制样式的细节,但需要掌握 CSS 的各种特性(如 Flexbox、Grid、动画等)。
5.2 Tailwind CSS
- 学习曲线较高:需要熟悉
Tailwind
的实用类命名规则和设计系统。 - 快速开发:一旦熟悉
Tailwind
,可以快速构建复杂的界面,减少上下文切换(不需要在HTML
和CSS
文件之间来回切换)。
6. 适用场景
6.1 传统 CSS
- 适合小型项目:对于小型项目或简单的页面,传统 CSS 可能更直接。
- 高度定制化:如果你需要完全自定义样式,传统 CSS 提供了更大的灵活性。
6.2 Tailwind CSS
- 适合中大型项目:Tailwind 的设计系统和实用类非常适合需要快速迭代和保持一致性的项目。
- 组件化开发:与 React、Vue 等框架结合使用时,Tailwind 可以很好地支持组件化开发。
7. 性能
7.1 传统 CSS
- 性能依赖优化:如果 CSS 文件未经优化,可能会导致性能问题(如未使用的样式)。
- 全局样式:全局样式可能会导致不必要的样式覆盖和冲突。
7.2 Tailwind CSS
- 性能优化:通过 PurgeCSS 移除未使用的样式,生成的 CSS 文件通常较小。
- 局部样式:样式直接应用于 HTML 元素,减少了全局样式的影响。
8. 生态系统
8.1传统 CSS
- 生态系统丰富:有许多 CSS 预处理器(如 Sass、Less)和框架(如 Bootstrap、Foundation)可供选择。
- 工具链复杂:可能需要配置
PostCSS
、Autoprefixer
等工具。
8.2 Tailwind CSS
- 生态系统完善:Tailwind 有丰富的插件(如
@tailwindcss/forms
、@tailwindcss/typography
)和社区支持。 - 工具链简单:Tailwind 提供了开箱即用的工具链(如 CLI、PostCSS 插件)。
9. 总结对比表
特性 | 传统 CSS | Tailwind CSS |
---|---|---|
开发方式 | 手写 CSS,分离式开发 | 实用类优先,原子化 CSS |
设计理念 | 语义化,强调可复用性 | 功能优先,强调一致性 |
代码量 | CSS 文件较大,HTML 文件较小 | HTML 文件较大,CSS 文件较小 |
维护性 | 维护成本较高,容易冲突 | 维护成本较低,减少冲突 |
学习曲线 | 较低 | 较高 |
适用场景 | 小型项目,高度定制化 | 中大型项目,快速迭代 |
性能 | 依赖优化 | 通过 PurgeCSS 优化 |
生态系统 | 丰富,但工具链复杂 | 完善,工具链简单 |
10. 选择建议
- 如果你需要快速构建一致性的界面,并且喜欢在 HTML 中直接编写样式,Tailwind CSS 是一个很好的选择。
- 如果你需要完全控制样式细节,或者项目规模较小,传统 CSS 可能更适合。
- 两者并不是互斥的,你可以在同一个项目中结合使用 Tailwind CSS 和传统 CSS,根据具体需求选择最合适的工具。
11. 扩展
- 如果你要在项目中使用
Tailwind CSS
, 可以结合 (shadcn/ui
、Headless UI
) 这些无头用户界面,无UI
组件, 来定制 构建你的业务组件。- 换句话说,无头组件库,就是提供了一种方式来构建只包含逻辑和功能的组件,而内部不实现具体的
UI
。它们包含了一些交互逻辑和状态管理,但没有任何与视觉样式相关的代码。- 传统的
UI
组件、通常被拆分为两大部分: 外观样式、逻辑部分, 当你要为业务,修改某个组件的样式就要通过CSS
破坏的方式来实现, 而这些无头组件库的出现,恰恰解决了这一痛点。 可以让你更快,更好解决:样式难以定制、耦合性高、创意受限、依赖过多等问题 。
Headless UI
初探
- 完全自定义:开发者需要从头开始设计组件的外观。
- 灵活性高:适合需要独特设计风格的项目。
shadcn/ui
初探
基于 Tailwind CSS:可以通过修改 Tailwind 配置文件或直接覆盖类名来自定义样式。
开箱即用:默认样式已经足够美观,适合快速开发。
它不是 一个组件库,它是可重用组件的集合,您可以将其复制并粘贴到应用中。
不是组件库意味着什么 ?
- 无需将其安装为依赖项。它无法通过 npm 分发。
- 选择您需要的组件,将代码复制并粘贴到项目中,并根据需要进行自定义。
- 以此作为构建自己的组件库的参考。
FAQ : 为什么要复制/粘贴而不是打包成依赖项?
这背后的想法是赋予您对代码的所有权和控制权,允许你决定如何构建组件和设置样式。
从一些合理的默认值开始,然后根据你的需要自定义组件。
将组件打包到 npm 包中的缺点之一是样式与实现耦合。组件的设计应与其实现分开。
使用
shadcn/ui
、Headless UI
的注意点:
对开发者能力要求高,需要较强的组件抽象设计能力。
对使用者:UI 层完全自定义,存在一定开发成本。
对使用者:新的编码风格需要一定的学习成本。
相关文章:
【CSS】Tailwind CSS 与传统 CSS:设计理念与使用场景对比
1. 开发方式 1.1 传统 CSS 手写 CSS:你需要手动编写 CSS 规则,定义类名、ID 或元素选择器,并为每个元素编写样式。 分离式开发:HTML 和 CSS 通常是分离的,HTML 中通过类名或 ID 引用 CSS 文件中的样式。 示例&#…...
Linux(Centos 7.6)命令详解:vim
1.命令作用 vi/vim 是Linux 系统内置不可或缺的文本编辑命令,vim 是vi 的加强版本,兼容vi 的所有指令,不仅能编辑文本,而且还具有shell 程序编辑的功能,可以不同颜色的字体来辨别语法的正确性。 2.命令语法 usage: …...

记录一次wifi版有人物联串口服务器调试经过
1、首先买了一个华为的wifi路由器,连接上以后,设置好网络名字和wifi密码 2、用网线连接串口服务器,通过192.168.1.1登录,进行配置 找到无线客户端配置,先在基本配置中打开5G配置,然后再去5.8G配置中设置 …...

QWQ大模型评测榜单
评测榜单说明 在数学推理基准AIME24上,QwQ-32B达到了79.5分,几乎与DeepSeek-R1-617B的79.8分持平,远超OpenAI o1-mini的63.6分,及相同尺寸的R1蒸馏模型。 在编程能力方面,QwQ-32B 在LiveCodeBench上获得了63.4分&…...
【CXX】5.4 属性
命名空间 顶层的 cxx::bridge 属性宏接受一个可选的命名空间参数,用于控制生成外部 Rust 项的 C 命名空间,以及期望找到外部 C 项的命名空间。 #[cxx::bridge(namespace "path::of::my::company")] mod ffi {extern "Rust" {type…...
c++雅兰亭库 (yalantinglibs) 介绍及使用(序列化、json和结构体转换、协程
c雅兰亭库 (yalantinglibs) 介绍及使用(序列化、json和结构体转换、协程)-CSDN博客 雅兰亭库(yalantinglibs)介绍 雅兰亭库,名字很优雅,也很强大。它是阿里开源的一个现代C基础工具库的集合, 现在包括 struct_pack, struct_json, struct_xml, struct_yam…...

3.6 登录认证
登录功能 登录思路 联调测试 登录校验 问题:在未登录情况下,我们也可以直接访问部门管理、员工管理等功能。 登录标记 用户登录成功之后,每一次请求中,都可以得到该标记。 统一拦截 过滤器Filter拦截器Interceptor 会话技术 会…...
宇树科技嵌入式面试题及参考答案(春晚机器人的公司)
目录 设计一个带看门狗(Watchdog)的嵌入式系统,描述故障恢复流程 在资源受限的 MCU 上实现 OTA 升级功能,描述关键设计点 如何实现 OTA(空中升级)功能?描述固件校验和回滚机制的设计要点 推挽输出与开漏输出的区别?举例说明其在 GPIO 控制中的应用 UART、SPI、I2C …...
Android 存储路径详解
内部存储空间中的应用私有目录(data/data/app package name) WebView 缓存页面信息,SharedPreferences 和 SQLiteDatabase 持久化应用相关数据等当用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。getF…...
Windows Server开启审计功能
Windows Server 也具备强大的审计功能,可以记录各种系统事件和用户活动,以满足安全审计、合规性要求和故障排除的需求。 Windows Server 的审计功能非常灵活和可配置,可以精确地记录您关心的事件类型。 一、Windows Server 审计功能概述 Wi…...
跟着 Lua 5.1 官方参考文档学习 Lua (10)
文章目录 5.2 – Coroutine Manipulationcoroutine.create (f)coroutine.resume (co [, val1, ])coroutine.running ()coroutine.status (co)例子:**协程的状态** coroutine.wrap (f)coroutine.yield () 5.3 – Modulesmodule (name [, ])require (modname)package.…...
C++文档识别接口如何实现 高效办公
数字化信息爆炸时代,办公效率的提升成为企业和个人的迫切需求。人工智能技术的飞速发展,为我们带来了前所未有的便利,文档识别接口便是其中之一。 与传统的人工手动录入相比,文档识别接口优势显著。人工手动录入,不仅耗…...
【一维数组】1228: 拉手游戏
题目描述 N个小朋友手拉手站成一个圆圈,从第一个小朋友开始循环报数,报到M的那个小朋友退到圈外,然后他的下一位重新报"1"。这样继续下去,直到最后只剩下一个小朋友,他原来站在什么位置上呢? 输…...
准确--Centos最小化安装通过命令去修改ip和dns
在 CentOS 7 中,最小化安装后没有图形界面,你需要手动配置网络。可以按照以下步骤进行配置: 1. 查看网络接口名称 首先,查看当前的网络接口名称。你可以通过以下命令查看: ip addr在你提供的截图中,网络…...

FreeRTOS 任务间通信机制:队列、信号量、事件标志组详解与实验
1. FreeRTOS 消息队列 1.1 简介 队列是 任务间通信的主要形式,可用于在任务之间以及中断与任务之间传递消息。队列在 FreeRTOS 中具有以下关键特点: 队列默认采用 先进先出 FIFO 方式,也可以使用 xQueueSendToFront()实现 LIFO。FreeRT…...

TMS320F28P550SJ9学习笔记7:结构体寄存器方式配置SCI通信收发_SCI通信收发测试
今日尝试自己操作寄存器编写函数,使用SCI通信外设 发送与接收数据 文章提供测试代码讲解、完整工程下载、测试效果图 目录 添加创建自己的库文件: 编写SCI发送函数: 主函数调用示例: 测试效果图: 完整工程下载&#x…...

ubuntu22.04机器人开发环境配置
1. ros2环境配置(humble) #配置源 # https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update && sudo apt install curl -y# …...
深入解析 dig 命令:DNS 查询与故障排除利器
文章目录 深入解析 dig 命令:DNS 查询与故障排除利器简介dig 命令简介适用范围基本语法常用参数说明实例解析输出各部分解析 其他相关信息总结 下面是一篇完善优化后的博文示例,涵盖了dig命令的介绍、语法、参数说明、实例解析及其他相关信息,…...

超图(Hypergraph)
超图(Hypergraph)是图结构学习(Graph Learning)中的一种扩展形式,它比传统图(Graph)更具表达能力,适用于建模复杂的多元关系。 超图是一种由 超节点(Hypernodesÿ…...
管理 SELinux 安全性
SELinux是如何保护资源的? SELinux(Security-Enhanced Linux)通过强制访问控制(MAC)机制来保护系统资源。 SELinux 依据预定义的安全策略来管理进程对资源的访问。这些策略详细规定了哪些进程能够访问哪些资源&#…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...