当前位置: 首页 > news >正文

【CSS】Tailwind CSS 与传统 CSS:设计理念与使用场景对比

1. 开发方式

1.1 传统 CSS

  • 手写 CSS:你需要手动编写 CSS 规则,定义类名、ID 或元素选择器,并为每个元素编写样式。

  • 分离式开发HTMLCSS 通常是分离的,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-centerbg-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,可以快速构建复杂的界面,减少上下文切换(不需要在 HTMLCSS 文件之间来回切换)。

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)可供选择。
  • 工具链复杂:可能需要配置 PostCSSAutoprefixer 等工具。
8.2 Tailwind CSS
  • 生态系统完善:Tailwind 有丰富的插件(如 @tailwindcss/forms@tailwindcss/typography)和社区支持。
  • 工具链简单:Tailwind 提供了开箱即用的工具链(如 CLI、PostCSS 插件)。

9. 总结对比表

特性传统 CSSTailwind CSS
开发方式手写 CSS,分离式开发实用类优先,原子化 CSS
设计理念语义化,强调可复用性功能优先,强调一致性
代码量CSS 文件较大,HTML 文件较小HTML 文件较大,CSS 文件较小
维护性维护成本较高,容易冲突维护成本较低,减少冲突
学习曲线较低较高
适用场景小型项目,高度定制化中大型项目,快速迭代
性能依赖优化通过 PurgeCSS 优化
生态系统丰富,但工具链复杂完善,工具链简单

10. 选择建议

  • 如果你需要快速构建一致性的界面,并且喜欢在 HTML 中直接编写样式,Tailwind CSS 是一个很好的选择。
  • 如果你需要完全控制样式细节,或者项目规模较小,传统 CSS 可能更适合。
  • 两者并不是互斥的,你可以在同一个项目中结合使用 Tailwind CSS 和传统 CSS,根据具体需求选择最合适的工具。

11. 扩展

  1. 如果你要在项目中使用 Tailwind CSS, 可以结合 (shadcn/uiHeadless UI ) 这些无头用户界面,无 UI 组件, 来定制 构建你的业务组件。
  2. 换句话说,无头组件库,就是提供了一种方式来构建只包含逻辑和功能的组件,而内部不实现具体的 UI。它们包含了一些交互逻辑状态管理,但没有任何与视觉样式相关的代码。
  3. 传统的 UI 组件、通常被拆分为两大部分: 外观样式逻辑部分, 当你要为业务,修改某个组件的样式就要通过 CSS 破坏的方式来实现, 而这些无头组件库的出现,恰恰解决了这一痛点。 可以让你更快,更好解决:样式难以定制、耦合性高、创意受限、依赖过多等问题 。

Headless UI 初探

  • 完全自定义:开发者需要从头开始设计组件的外观。
  • 灵活性高:适合需要独特设计风格的项目。

shadcn/ui 初探

  • 基于 Tailwind CSS:可以通过修改 Tailwind 配置文件或直接覆盖类名来自定义样式。

  • 开箱即用:默认样式已经足够美观,适合快速开发。

  • 它不是 一个组件库,它是可重用组件的集合,您可以将其复制并粘贴到应用中。

  • 不是组件库意味着什么 ?

    • 无需将其安装为依赖项。它无法通过 npm 分发。
    • 选择您需要的组件,将代码复制并粘贴到项目中,并根据需要进行自定义。
    • 以此作为构建自己的组件库的参考。
  • FAQ : 为什么要复制/粘贴而不是打包成依赖项?

    • 这背后的想法是赋予您对代码的所有权和控制权,允许你决定如何构建组件和设置样式。

    • 从一些合理的默认值开始,然后根据你的需要自定义组件。

    • 将组件打包到 npm 包中的缺点之一是样式与实现耦合。组件的设计应与其实现分开。

使用 shadcn/uiHeadless UI 的注意点:

  • 对开发者能力要求高,需要较强的组件抽象设计能力。

  • 对使用者:UI 层完全自定义,存在一定开发成本。

  • 对使用者:新的编码风格需要一定的学习成本。

相关文章:

【CSS】Tailwind CSS 与传统 CSS:设计理念与使用场景对比

1. 开发方式 1.1 传统 CSS 手写 CSS&#xff1a;你需要手动编写 CSS 规则&#xff0c;定义类名、ID 或元素选择器&#xff0c;并为每个元素编写样式。 分离式开发&#xff1a;HTML 和 CSS 通常是分离的&#xff0c;HTML 中通过类名或 ID 引用 CSS 文件中的样式。 示例&#…...

Linux(Centos 7.6)命令详解:vim

1.命令作用 vi/vim 是Linux 系统内置不可或缺的文本编辑命令&#xff0c;vim 是vi 的加强版本&#xff0c;兼容vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c;而且还具有shell 程序编辑的功能&#xff0c;可以不同颜色的字体来辨别语法的正确性。 2.命令语法 usage: …...

记录一次wifi版有人物联串口服务器调试经过

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

QWQ大模型评测榜单

评测榜单说明 在数学推理基准AIME24上&#xff0c;QwQ-32B达到了79.5分&#xff0c;几乎与DeepSeek-R1-617B的79.8分持平&#xff0c;远超OpenAI o1-mini的63.6分&#xff0c;及相同尺寸的R1蒸馏模型。 在编程能力方面&#xff0c;QwQ-32B 在LiveCodeBench上获得了63.4分&…...

【CXX】5.4 属性

命名空间 顶层的 cxx::bridge 属性宏接受一个可选的命名空间参数&#xff0c;用于控制生成外部 Rust 项的 C 命名空间&#xff0c;以及期望找到外部 C 项的命名空间。 #[cxx::bridge(namespace "path::of::my::company")] mod ffi {extern "Rust" {type…...

c++雅兰亭库 (yalantinglibs) 介绍及使用(序列化、json和结构体转换、协程

c雅兰亭库 (yalantinglibs) 介绍及使用(序列化、json和结构体转换、协程)-CSDN博客 雅兰亭库(yalantinglibs)介绍 雅兰亭库&#xff0c;名字很优雅&#xff0c;也很强大。它是阿里开源的一个现代C基础工具库的集合, 现在包括 struct_pack, struct_json, struct_xml, struct_yam…...

3.6 登录认证

登录功能 登录思路 联调测试 登录校验 问题&#xff1a;在未登录情况下&#xff0c;我们也可以直接访问部门管理、员工管理等功能。 登录标记 用户登录成功之后&#xff0c;每一次请求中&#xff0c;都可以得到该标记。 统一拦截 过滤器Filter拦截器Interceptor 会话技术 会…...

宇树科技嵌入式面试题及参考答案(春晚机器人的公司)

目录 设计一个带看门狗(Watchdog)的嵌入式系统,描述故障恢复流程 在资源受限的 MCU 上实现 OTA 升级功能,描述关键设计点 如何实现 OTA(空中升级)功能?描述固件校验和回滚机制的设计要点 推挽输出与开漏输出的区别?举例说明其在 GPIO 控制中的应用 UART、SPI、I2C …...

Android 存储路径详解

内部存储空间中的应用私有目录&#xff08;data/data/app package name&#xff09; WebView 缓存页面信息&#xff0c;SharedPreferences 和 SQLiteDatabase 持久化应用相关数据等当用户卸载 App 时&#xff0c;系统自动删除 data/data 目录下对应包名的文件夹及其内容。getF…...

Windows Server开启审计功能

Windows Server 也具备强大的审计功能&#xff0c;可以记录各种系统事件和用户活动&#xff0c;以满足安全审计、合规性要求和故障排除的需求。 Windows Server 的审计功能非常灵活和可配置&#xff0c;可以精确地记录您关心的事件类型。 一、Windows Server 审计功能概述 Wi…...

跟着 Lua 5.1 官方参考文档学习 Lua (10)

文章目录 5.2 – Coroutine Manipulationcoroutine.create (f)coroutine.resume (co [, val1, ])coroutine.running ()coroutine.status (co)例子&#xff1a;**协程的状态** coroutine.wrap (f)coroutine.yield () 5.3 – Modulesmodule (name [, ])require (modname)package.…...

C++文档识别接口如何实现 高效办公

数字化信息爆炸时代&#xff0c;办公效率的提升成为企业和个人的迫切需求。人工智能技术的飞速发展&#xff0c;为我们带来了前所未有的便利&#xff0c;文档识别接口便是其中之一。 与传统的人工手动录入相比&#xff0c;文档识别接口优势显著。人工手动录入&#xff0c;不仅耗…...

【一维数组】1228: 拉手游戏

题目描述 N个小朋友手拉手站成一个圆圈&#xff0c;从第一个小朋友开始循环报数&#xff0c;报到M的那个小朋友退到圈外&#xff0c;然后他的下一位重新报"1"。这样继续下去&#xff0c;直到最后只剩下一个小朋友&#xff0c;他原来站在什么位置上呢&#xff1f; 输…...

准确--Centos最小化安装通过命令去修改ip和dns

在 CentOS 7 中&#xff0c;最小化安装后没有图形界面&#xff0c;你需要手动配置网络。可以按照以下步骤进行配置&#xff1a; 1. 查看网络接口名称 首先&#xff0c;查看当前的网络接口名称。你可以通过以下命令查看&#xff1a; ip addr在你提供的截图中&#xff0c;网络…...

FreeRTOS 任务间通信机制:队列、信号量、事件标志组详解与实验

1. FreeRTOS 消息队列 1.1 简介 ​ 队列是 任务间通信的主要形式&#xff0c;可用于在任务之间以及中断与任务之间传递消息。队列在 FreeRTOS 中具有以下关键特点&#xff1a; 队列默认采用 先进先出 FIFO 方式&#xff0c;也可以使用 xQueueSendToFront()实现 LIFO。FreeRT…...

TMS320F28P550SJ9学习笔记7:结构体寄存器方式配置SCI通信收发_SCI通信收发测试

今日尝试自己操作寄存器编写函数&#xff0c;使用SCI通信外设 发送与接收数据 文章提供测试代码讲解、完整工程下载、测试效果图 目录 添加创建自己的库文件&#xff1a; 编写SCI发送函数&#xff1a; 主函数调用示例&#xff1a; 测试效果图&#xff1a; 完整工程下载&#x…...

ubuntu22.04机器人开发环境配置

1. ros2环境配置&#xff08;humble&#xff09; #配置源 # 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 命令&#xff1a;DNS 查询与故障排除利器简介dig 命令简介适用范围基本语法常用参数说明实例解析输出各部分解析 其他相关信息总结 下面是一篇完善优化后的博文示例&#xff0c;涵盖了dig命令的介绍、语法、参数说明、实例解析及其他相关信息&#xff0c…...

超图(Hypergraph)

超图&#xff08;Hypergraph&#xff09;是图结构学习&#xff08;Graph Learning&#xff09;中的一种扩展形式&#xff0c;它比传统图&#xff08;Graph&#xff09;更具表达能力&#xff0c;适用于建模复杂的多元关系。 超图是一种由 超节点&#xff08;Hypernodes&#xff…...

管理 SELinux 安全性

SELinux是如何保护资源的&#xff1f; SELinux&#xff08;Security-Enhanced Linux&#xff09;通过强制访问控制&#xff08;MAC&#xff09;机制来保护系统资源。 SELinux 依据预定义的安全策略来管理进程对资源的访问。这些策略详细规定了哪些进程能够访问哪些资源&#…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

FTXUI::Dom 模块

DOM 模块定义了分层的 FTXUI::Element 树&#xff0c;可用于构建复杂的终端界面&#xff0c;支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

第22节 Node.js JXcore 打包

Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本&#xff0c;基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...