📚前言

在Web前端开发的历史长河中,CSS的编写方式经历了多次演进,从早期的原生CSSCSS预处理(Less/Sass/Stylus)CSS-in-JS(Styled-Components/Emotion) 再到 Utility-First 原子化CSS。每一种演进方案其本质都是围绕“开发效率”、“运行性能”、”可维护性“ 这三个核心点之间寻找最佳平衡而衍生出各类CSS库/框架/引擎。

在这里插入图片描述

🍀原生CSS&CSS预处理(Less / Sass / Stylus)

开发人员手动编写.css文件.less文件等,然后通过<link>标签@import引入使用

  • 存在问题: 当随着项目变大,很快就会面临命名冲突、代码冗余、缺乏逻辑组织、难以维护等
  • 解决方案:
    • CSS命名规范(BEM):CSS-BEM 命名规范通过严格的命名约定来约束作用域,增强代码的可读性和可维护性,是一种用于CSS模块化开发的命名约定规范,但它依赖于开发人员的自觉性,且class类名很长。
    • CSS预处理(Less / Sass / Stylus): 引入了变量、嵌套、混入、继承等编程概念,虽然增强了CSS的组织性和可复用性,但是并未从根本上解决命名他全局污染的问题。

🍀CSS-in-JS(Styled-Components / Emotion))

CSS-IN-JS这种解决方案,它提倡我们把CSS代码写在JavaScript代码当中,在React JSX/TSX等类似的组件化框架兴起后,也将CSS样式视为组件的一部分。

  • 核心: styled-components、Emotion 将CSS样式直接写在JavaScript文件中,为每个组件生成唯一的、带哈希值的类名,从而实现“作用域化样式”,彻底避免了全局污染的问题。
  • 优势:
    • 组件化: 样式与逻辑类聚,方便复用和维护。
    • 动态样式: 可以方便的基于组件的stateprops来动态改变样式。
  • 问题:
    • 心智负担: 要在JavaScript 和 CSS 之间来回的切换语法,而且需要一定的学习成本去学习特定库的API。
    • 运行开销: CSS样式不是提前生成的,而是在运行时解析JavaScript并动态生成CSS,所带来一定的性能损耗。

🍀Utility-First CSS(Tailwind CSS / UnoCSS)

Utility-First(功能优先)原子化CSS 是一种与传统“语义化CSS”截然不同的思路,它提供了一系列高度可组合的、功能单一的“原子类”(Atomic CSS / Utility Classes)。

  • 核心: 开发人员无需再为组件编写专门的CSS类,而是直接在HTML中组合这些原则来构建样式。

    <!-- 传统写法:-->
    <style>.btn-primary{padding: 8px 16px;color: white;border-radius: 4px;background-color: blue;}
    </style>
    <button class="btn-primary">提交</button><!-- 原子化CSS:-->
    <button class="py-2 px-4 text-white rounded bg-blue-500">提交</button>
    
  • 优势:

    • 无需思考命名:从根本上消除了为class命名的烦恼。
    • 无需切换文件:样式和结构在一起,开发人员心流不被打断。
    • 约束与一致性:所有样式都来自预设的design tokens(在tailwind.config.js文件中定义),保证了整个项目在视觉上的一致性。
    • 性能佳体积小:通过类似PurgeCSS等工具,在构建项目时自动分析扫描,首先它将 CSS 文件中使用的选择器与内容文件中的选择器进行匹配,然后它会从 CSS 中删除未使用的选择器,从而生成更小的 CSS 文件。

🏡Tailwind CSS简介

Tailwind CSS 官网 https://tailwindcss.com

在这里插入图片描述

Tailwind CSS 是一个实用优先的 CSS 框架,与传统的框架(如 Bootstrap、Foundation)不同,它没有预定义的组件,而是提供了一系列原子化的 CSS 类,允许你直接在 HTML 中应用样式。

Tailwind CSS 是一个工具优先的框架,意味着它提供了大量的预定义类,而不是预设的组件,这使得开发者可以构建几乎任何设计,而不需要编写 CSS。

简而言之,只需要知道类名以及对应的属性和值范围就OK了!

📊Vue3 项目实例

为了便于项目演示,这里就以常用的 Vite + Vue3 + TypeScript + Tailwind CSS 4 为项目实例,从项目的安装、初始化配置等流程逐一说明。

1、创建项目

# 构建Vue项目
bun create vue@latest# 输入项目名,这里以tailwind-css-demo为例
tailwind-css-demo# 进入tailwind-css-demo项目根目录
cd tailwind-css-demo

2、安装依赖

# 安装vite项目依赖
bun install# 安装Tailwind CSS引擎依赖 和@tailwindcss/vite插件
bun add -D tailwindcss @tailwindcss/vite

3、配置 vite.config.ts

Tailwind CSS 4.x最大的变化就是 “零配置” 优先,无需再配置tailwind.config.js 和 postcss.config.js 文件,所有配置都可以直接在vite.config.ts中完成。

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
import vueDevTools from 'vite-plugin-vue-devtools'// 引入@tailwindcss/vite插件,在编译时自动将class类名对应的样式提取出来添加到style标签中
import tailwindcss from '@tailwindcss/vite'// https://vite.dev/config/
export default defineConfig({plugins: [vue(),vueJsx(),vueDevTools(),tailwindcss(),  // 注入tailwindcss插件],resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))},},server: {// host: '0.0.0.0',// port: 8080,open: true,cors: true,},
})

4、Tailwind CSS IntelliSense 扩展

在代码编辑器中,例如:常见的 Visual Studio Code 、Cursor AI Code Editor 、Trae - IDE 等编辑器,在扩展管理中搜索 :Tailwind CSS IntelliSense 关键字,直接安装即可,Tailwind CSS IntelliSense - Visual Studio Marketplace,安装成功后,在HTML中编写class原子类时就会自动辅助提示,以便高效的开发。

Tailwind CSS IntelliSense

具体了解更多扩展配置说明https://tailwindcss.com/docs/editor-setup

5、引入tailwindcss

在前端项目工程src目录中的全局的style.cssmain.css 样式文件中引入 tailwindcss 核心库

<!-- https://tailwindcss.com/docs/preflight -->
@import "tailwindcss";

6、使用Tailwind CSS

完成以上步骤以后,就可以在项目任意HTML标签中的class属性中添加原子类了,同时还支持响应试设计:smmdlgxsxl等,例如w-lg表示在中等屏幕,以及悬停 伪类、伪元素 、焦点和其他状态Hover, focus, and other states等等,都可以通过不同的修饰符,快速得到对应状态样式。

使用实用程序类(Utility Classes)进行样式设置

这是Tailwind的基石,每一个类名都代表一个 单一不可再分的CSS样式属性,例如,以下是常用的Tailwind CSS 原子类 与 原生CSS样式属性 对照情况。

🚀查看更多Tailwind CSS 原子类、🛠️线在尝试体验 Tailwind Play

Tailwind CSS 原子类原生CSS样式属性
flexgriddisplay: flex;display: grid;
justify-centeritems-centerjustify-content: center;align-items: center;
box-borderbox-sizing: border-box;
float-leftfloat: left;
absoluterelativeposition: absolute;position: relative;
w-pxw-[50px]w-fullwidth: 1px;width: 50px;width: 100%;
text-xsfont-size: 0.75rem(12px) ;
text-<size>/<number>font-size: <size>;
text-centertext-align: center;
text-whitecolor: #fff;
font-boldfont-weight: 700;
bg-whitebackground-color: #000;
bg-red-500background-color: #fb2c36;
shadow-2xsbox-shadow: 0 1px rgb(0 0 0 / 0.05);
text-shadow-xstext-shadow: 0px 1px 1px rgb(0 0 0 / 0.2);
rounded-xsborder-radius: 0.125rem (2px);
cursor-pointercursor: pointer;

颜色(Colors)

Tailwind CSS 定义了一系列符合大众UI的色阶,可根据自己需要选择使用,当然如果在不满足你的需求时可以在方括号中,如text-[#000] 来自定义任意色值。

🚀Tailwind CSS 色值体系

<body><div class="text-red-500 bg-blue-500">红色文字, 蓝色背景</div><div class="text-[#000] bg-[#fff]">自定义:黑色文字,白色背景</div>
</body>

在这里插入图片描述

7、自定义Tailwind CSS原子类

  • @layer 自定义原子类, 如果在Tailwind CSS中,原有的原子类不能满足需求时,可在全局style.cssmain.css 样式文件中通过使用@layer{...}来添加自定义的原子类。

    @import "tailwindcss";:root {--color-primary: #409eff;--color-primary-hover: #155dfc;--color-success: #67c23a;--color-success-hover: #4c8b2f;
    }@layer {.item {position: relative;&::after {content: '';display: inline-block;position: relative;top: 1px;width: 18px;height: 12px;background: url('@/assets/img/not.webp') no-repeat center center;background-size: contain !important;}}.item_active {b::after {background: url('@/assets/img/yes.webp') no-repeat center center;}}.type_primary {border: 2px solid var(--color-primary);background-color: var(--color-primary-hover);}.type_success {color: var(--color-success);background-color: var(--color-success-hover);}
    }
    
    <body><ul class="m-5 p-2"><li class="mb-10 item"><span class="p-2 type_primary">primary</span><span class="p-2 type_success">success</span></li></ul>
    </body>
    
  • @theme 主题、变量定义, 在自定义CSS中,自定义设计令牌,如:颜色值,宽高、间距等,可通过@theme{...}来定义(类似原生CSS中的:root{...}),以保证项目整体样式的一致性。

    @import "tailwindcss";@theme {--mu-primary: #409eff;--mu-primary-hover: #155dfc;--mu-success: #67c23a;--mu-success-hover: #4c8b2f;--mu-warning: #e6a23c;--mu-warning-hover: #c88b2f;--mu-danger: #f56c6c;--mu-danger-hover: #d33f3f;--mu-info: #909399;--mu-info-hover: #7c7c7c;
    }
    
  • @apply 组合现有工具类, 如果有一些原子类经常被反复的使用时,就可以通过@apply{...}将它们组合成一个新的原子类,在使用时,只需使用那个新的原子类名即可!

    @import "tailwindcss";.btn-primary {@apply px-5 py-2 rounded-md text-white bg-blue-500 hover:bg-blue-600 hover:cursor-pointer;
    }
    
    <body><button class="px-5 py-2 rounded-md text-white bg-blue-500 hover:bg-blue-600 hover:cursor-pointer">反复使用时</button><!-- 调用新的组合原子类名 --><button class="btn-primary">组合使用后</button>
    </body>
    
  • @utility 创建动态工具类,这是Tailwind CSS 4 新增的强大功能,它可以创建全新的、可被修饰的、组合式工具类,通过@utility 类名-*{...} 来动态匹配对应的样式类,其中 * 表示动态变化的样式类。

    @import "tailwindcss";@theme {--mu-primary: #409eff;--mu-primary-hover: #155dfc;--mu-primary-dark: #fff;--mu-primary-hover-dark: #409eff;--mu-success: #67c23a;--mu-success-hover: #4c8b2f;--mu-success-dark: #fff;--mu-success-hover-dark: #67c23a;--mu-warning: #e6a23c;--mu-warning-hover: #c88b2f;--mu-danger: #f56c6c;--mu-danger-hover: #d33f3f;--mu-info: #909399;--mu-info-hover: #7c7c7c;
    }@utility btn-* {@apply px-5 py-2 rounded-md text-white hover:cursor-pointer;background-color: --value(--mu-*);&:hover {background-color: --value(--mu-*-hover);}<!-- 暗色主题时的颜色 -->@variant dark {@apply text-black;background-color: --value(--mu-*-dark);&:hover {background-color: --value(--mu-*-hover-dark);}}
    }
    
    <body><button class="btn-primary">主要样式颜色</button><button class="btn-success">成功样式颜色</button><button class="btn-warning">警告样式颜色</button>
    </body>
    

8、扩展

除了 Tailwind CSS 功能优先的原子化 CSS 框架原子类以外,其他还有类似的原子化 CSS引擎,如:Uno CSS 即时按需的原子化 CSS 引擎,它不会预先生成任何 CSS,而是根据你在代码中实际使用的类名,动态地、即时地生成对应的 CSS 规则。

Tailwind CSS:目前依然是一个功能强大、可靠且值得信赖的选择,它定义了 Utility-First 的最佳实践。

Uno CSS 将是CSS工具未来的演进方向。它以更智能、更高效的方式解决了同样的问题,进一步提升了性能和灵活性。

最后、无论是原子化CSS框架,还是原子化CSS引擎,都会给你带来不样的开发体验,都可以去尝试用一下。

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

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

相关文章

单例模式的智慧:从UVM看控制的艺术

有时候&#xff0c;生活中的很多东西其实只需要一个就够了&#xff0c;就像一个公司只需要一个CEO&#xff0c;一个王朝只需要一个皇帝。在UVM验证环境中&#xff0c;也有很多这样的需求——有些对象&#xff0c;我们希望它在整个仿真过程中只存在一个实例。这就是我们今天要聊…

Hexo - 免费搭建个人博客01 - 安装软件工具

导言我的博客&#xff1a;https://q164129345.github.io/ Hexo 作为一个 Node.js 框架&#xff0c;它依赖于 Node.js 运行时环境来执行。 一、安装Node.js官方网址&#xff1a;https://nodejs.org/zh-cn追求系统稳定性、可靠性以及希望减少维护频率的用户来说&#xff0c;LTS版…

【Kubernetes】集群启动nginx,观察端口映射,work节点使用kubectl配置

参考b站叩丁狼总结&#xff1a;完整版Kubernetes&#xff08;K8S&#xff09;全套入门微服务实战项目&#xff0c;带你一站式深入掌握K8S核心能力 在master节点执行 kubectl create deployment nginx --imagenginxkubectl expose deployment nginx --port80 --typeNodePort1. …

20250704-基于强化学习在云计算环境中的虚拟机资源调度研究

基于强化学习在云计算环境中的虚拟机资源调度研究 随着云计算规模的持续扩大&#xff0c;数据中心虚拟机资源调度面临动态负载、异构资源适配及多目标优化等挑战。传统启发式算法在复杂场景下易陷入局部最优&#xff0c;而深度强化学习&#xff08;DRL&#xff09;凭借序贯决策…

day 33打卡

day 21 常见的降维算法 # 先运行之前预处理好的代码 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings(ignore)# 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] plt.rcParam…

sec(x)积分推导

在MATLAB中绘制 sec⁡(x)、cos(x) 和 ln⁡∣sec⁡(x)tan⁡(x)∣的函数图像&#xff0c;需要特别注意 sec⁡(x) 在 cos⁡(x)0&#xff08;即 xπ/2kπ&#xff09;处的奇点。&#xff08;deepseek生成代码&#xff09;% 定义x范围&#xff08;-2π到2π&#xff09;&#xff0c;…

gpt面试题

vue面试题 &#x1f4a1; 一、响应式系统相关 ❓1. Vue 3 的响应式系统是如何实现的&#xff1f;和 Vue 2 有何本质区别&#xff1f; 答案&#xff1a; Vue 3 使用 Proxy 实现响应式&#xff08;位于 vue/reactivity 模块&#xff09;&#xff0c;替代 Vue 2 的 Object.defineP…

【基于OpenCV的图像处理】图像预处理之图像色彩空间转换以及图像灰度化处理

目录 零、写在前面的话 一、图像色彩空间转换 1.1 RGB颜色空间 1.1.1 RGB颜色空间概念 1.1.2 RGB颜色模型​编辑 1.1.3 关于颜色加法 1.1.4 颜色加权加法 1.2 HSV颜色空间 1.2.1 HSV颜色空间概念 1.2.2 HSV颜色模型 1.2.3 应用意义 1.3 颜色转换 1.3.1 转换方法 …

Java TCP 通信详解:从基础到实战,彻底掌握面向连接的网络编程

作为一名 Java 开发工程师&#xff0c;你一定在实际开发中遇到过需要建立稳定连接、可靠传输、有序通信等场景。这时&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff09; 通信就成为你必须掌握的重要技能之一。TCP 是一种面向连接、可靠、基于字节流的传输协…

HTML5 网页游戏设计开发——1、HTML基础

前言 互联网上的应用程序被称为Web程序&#xff0c;Web引用用程序是用Web文档&#xff08;网页&#xff09;累表现用户界面&#xff0c;而Web文档都遵守HTML格式。HTML5是最新的HTML标准。之前的版本HTML4.01于1999年发布&#xff0c;小20年过去了&#xff0c;互联网已经发声了…

opencv圖片標注

功能使用python opencv, 將文字信息標注在圖片中同一張圖片中涉及多次標注文字大小為標注框的0.3倍使用多綫程運行import cv2 import threading import numpy as npdef draw_annotations(item, annotations):"""在图片上绘制标注框和文本annotations: 标注列表…

矩阵SVD分解计算

对于有数学库的时候,进行矩阵相关计算还是不复杂,但是没有数学库就很麻烦,利用算法实现了矩阵奇异值分解。 void decompose(const std::vector<std::vector<double>>& A, std::vector<std::vector<double>>& U, std::vector<dou…

Flutter基础(前端教程①⑦-Column竖直-Row水平-Warp包裹-Stack堆叠)

MainAxisAlignment 是一个枚举类&#xff0c;用于控制主轴&#xff08;Main Axis&#xff09; 方向上子组件的排列和对齐方式。MainAxisAlignment 的常用取值及效果&#xff1a;MainAxisAlignment.start子组件沿主轴的起点对齐&#xff08;Row 左对齐&#xff0c;Column 顶部对…

构建智能视频中枢--多路RTSP转RTMP推送模块在轨道交通与工业应用中的技术方案探究

1️⃣ 行业背景与技术需求&#x1f688; 轨道交通行业对视频监控的深度依赖在现代城市轨道交通系统中&#xff0c;视频监控已不仅仅是安防的一部分&#xff0c;更是贯穿于运营管理、车辆调度、应急指挥和安全保障的核心技术手段。列车车载监控 ——列车上普遍部署多路高清摄像头…

【Android Studio 2025 汉化教程】

废话不多说&#xff0c;直接上干货。 前提&#xff1a;JeBrains系列2025版已经集成中文插件&#xff0c;用户不需下载&#xff0c;只要设置下即可&#xff0c;但Android Studio并不内置也不提供汉化插件。需要工具&#xff1a; 1.IDEA&#xff08;其他JeBrains系列也可以&#…

网络安全初级(前端页面的编写分析)

源代码index.html<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录页面</title><!--…

RAG项目实战:LangChain 0.3集成 Milvus 2.5向量数据库,构建大模型智能应用

项目背景 最近&#xff0c;有时间&#xff0c;想着动手实战一下&#xff0c;从0到1搭建一个 RAG 系统&#xff0c;也是想通过实战的方式来更进一步学习 RAG。因此&#xff0c;就定下了以项目实战为主&#xff0c;书籍为辅的执行方式。&#xff08;书籍是黄佳老师著的《RAG 实战…

docker build 和compose 学习笔记

目录 docker build 笔记 1. 路径解析 2. 关键注意事项 2. docker compose up -d 核心区别对比 常见工作流 补充说明 1. 功能区别 2. 协作关系 场景 1&#xff1a;Compose 自动调用 Build 场景 2&#xff1a;先 Build 后 Compose 3. 关键区别 4. 为什么需要协作&…

Java学习第六十六部分——分布式系统架构

目录 一、前言提要 二、核心目标 三、核心组件与技术 1. 服务拆分与通信 2. 服务注册与发现 3. 配置中心 4. 负载均衡 5. 熔断、降级与限流 6. API 网关 7. 分布式数据管理 8. 分布式追踪与监控 9. 容器化与编排 四、典型Java分布式技术栈组合 五、关键…

Pycharm的Terminal打开后默认是python环境

Pycharm的Terminal打开后默认是python环境解决方案Pycharm的Terminal打开后默认是python环境&#xff0c;无法执行pip等命令&#xff0c;也没办法退出 解决方案 点击Settings -> Tools -> Terminal 可以看到当前默认打开的是torch19py38环境中的python.exe&#xff08;…