【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 层完全自定义,存在一定开发成本。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025华为OD机试真题E卷 - 螺旋数字矩阵【Java】

题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:给出数字个数 n (0 < n ≤ 999)和行数 m(0 < m ≤ 999),从左上角的 1 开始,按照顺时针螺旋向内写方式,依次写出2,3,…,n,最终形成一个 m 行矩阵。小明对这个矩阵有些要求: 1、…

地下井室可燃气体监测装置:守护地下安全,防患于未“燃”!

在城市的地下&#xff0c;隐藏着无数的燃气管道和井室&#xff0c;它们是城市基础设施建设的重要部分&#xff0c;燃气的使用&#xff0c;给大家的生活提供了极大的便利。在便利生活的背后&#xff0c;也存在潜在的城市安全隐患。 近年来&#xff0c;地下井室可燃气体泄漏事故…

【使用hexo模板创建个人博客网站】

使用hexo模板创建个人博客网站 环境准备node安装hexo安装ssh配置 使用hexo命令搭建个人博客网站hexo命令 部署到github创建仓库修改_config.yml文件 编写博客主题扩展 环境准备 node安装 进入node官网安装node.js 使用node -v检查是否安装成功 安装成功后应该出现如上界面 …

C# OPC DA获取DCS数据(提前配置DCOM)

OPC DA配置操作手册 配置完成后&#xff0c;访问远程ip&#xff0c;就能获取到服务 C#使用Interop.OPCAutomation采集OPC DA数据&#xff0c;支持订阅&#xff08;数据变化&#xff09;、单个读取、单个写入、断线重连

发行思考:全球热销榜的频繁变动

几点杂感&#xff1a; 1、单机游戏销量与在线人数的衰退是剧烈的&#xff0c;有明显的周期性&#xff0c;而在线游戏则稳定很多。 如去年的某明星游戏&#xff0c;最高200多万在线&#xff0c;如今在线人数是48名&#xff0c;3万多。 而近期热门的是MH&#xff0c;在线人数8…

Unity自定义区域UI滑动事件

自定义区域UI滑动事件 介绍制作1.创建一个Image2.创建脚本 总结 介绍 一提到滑动事件联想到有太多的插件了比如EastTouchBundle&#xff0c;今天想单纯通过UI去做一个滑动事件而不是基于Box2d或者Box去做滑动事件。 制作 1.创建一个Image 2.创建脚本 using UnityEngine; us…

taosd 写入与查询场景下压缩解压及加密解密的 CPU 占用分析

在当今大数据时代&#xff0c;时序数据库的应用越来越广泛&#xff0c;尤其是在物联网、工业监控、金融分析等领域。TDengine 作为一款高性能的时序数据库&#xff0c;凭借独特的存储架构和高效的压缩算法&#xff0c;在存储和查询效率上表现出色。然而&#xff0c;随着数据规模…

《UE5_C++多人TPS完整教程》学习笔记34 ——《P35 网络角色(Network Role)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P35 网络角色&#xff08;Network Role&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephe…

K8s 1.27.1 实战系列(七)Deployment

一、Deployment介绍 Deployment负责创建和更新应用程序的实例,使Pod拥有多副本,自愈,扩缩容等能力。创建Deployment后,Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点关闭或被删除,Deployment控制器会将该实例替换为群集中另一个节点上的…

Linux(Centos 7.6)命令详解:vim

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

微信小程序引入vant-weapp组件教程

本章教程,介绍如何在微信小程序中引入vant-weapp。 vant-weapp文档:https://vant-ui.github.io/vant-weapp/#/button 一、新建一个小程序 二、npm初始化 npm init三、安装 Vant Weapp‘ npm i @vant/weapp -

C++ 作业 DAY5

作业 代码 Widtget.h class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private:Ui::Widget *ui;/************************ 起始终止坐标 ************************/QPoint end;QPoint start;QVector<QPoint> per_start_lis…

Selenium 中 ActionChains 支持的鼠标和键盘操作设置及最佳实践

Selenium 中 ActionChains 支持的鼠标和键盘操作设置及最佳实践 一、引言 在使用 Selenium 进行自动化测试时&#xff0c;ActionChains 类提供了强大的功能&#xff0c;用于模拟鼠标和键盘的各种操作。通过 ActionChains&#xff0c;可以实现复杂的用户交互&#xff0c;如鼠标…

前端面试技术性场景题

87.场景面试之大数运算&#xff1a;超过js中number最大值的数怎么处理 在 JavaScript 中&#xff0c;Number.MAX_SAFE_INTEGER&#xff08;即 2^53 - 1&#xff0c;即 9007199254740991&#xff09;是能被安全表示的最大整数。超过此值时&#xff0c;普通的 Number 类型会出现…

【js逆向】iwencai国内某金融网站实战

地址&#xff1a;aHR0cHM6Ly93d3cuaXdlbmNhaS5jb20vdW5pZmllZHdhcC9ob21lL2luZGV4 在搜索框中随便输入关键词 查看请求标头&#xff0c;请求头中有一个特殊的 Hexin-V,它是加密过的&#xff1b;响应数据包中全是明文。搞清楚Hexin-V的值是怎么生成的&#xff0c;这个值和cooki…

ES Module 的 import 导入和 import () 动态导入

ES Module 的 import 导入和 import () 动态导入介绍 一、ES Module 简介 ES Module 是 JavaScript 官方提供的标准化模块系统&#xff0c;它的出现解决了长期以来 JavaScript 在模块管理方面的混乱局面。通过 ES Module&#xff0c;开发者可以更加方便地组织和复用代码&…

使用Node.js从零搭建DeepSeek本地部署(Express框架、Ollama)

目录 1.安装Node.js和npm2.初始化项目3.安装Ollama4.下载DeepSeek模型5.创建Node.js服务器6.运行服务器7.Web UI对话-Chrome插件-Page Assist 1.安装Node.js和npm 首先确保我们机器上已经安装了Node.js和npm。如果未安装&#xff0c;可以通过以下链接下载并安装适合我们操作系…

BUUCTF——[GYCTF2020]FlaskApp1 SSTI模板注入/PIN学习

目录 一、网页功能探索 二、SSTI注入 三、方法一 四、方法二 使用PIN码 &#xff08;1&#xff09;服务器运行flask登录所需的用户名 &#xff08;2&#xff09;modename &#xff08;3&#xff09;flask库下app.py的绝对路径 &#xff08;4&#xff09;当前网络的mac地…

Java基础关键_018_集合(二)

目 录 一、泛型 ※ 1.说明 2.实例 3.擦除与补偿 4.泛型的定义 &#xff08;1&#xff09;类定义 &#xff08;2&#xff09;静态方法定义 &#xff08;3&#xff09;接口定义 5.通配符 &#xff08;1&#xff09;无限定 &#xff08;2&#xff09;上限 &#xff…

FPGA学习篇——Verilog学习3(关键字+注释方法+程序基本框架)

1 Verilog常用关键字 大概知道以下哪些是关键字就好&#xff0c;如何使用还是得在编写代码中来学习。 2 Verilog注释方法 Verilog有两种注释方式&#xff1a; 2.1 “ // ” 单行。 2.2 “ /* ... */ ” 可扩展多行。 3 Verilog程序基本框架 Verilog 的基本设计单元是“…