前端样式库推广——TailwindCss
官方网址: https://tailwindcss.com/docs/installation/using-vite
中文官方文档:https://www.tailwindcss.cn/
github地址:tailwindcss
正在使用tailwindcss的网站:https://tailwindcss.com/showcase
一看github,竟然有高达86.5+stars,这库不简单
它就是近几年很流行的 “原子化CSS框架” ——TailwindCss!

tailwindcss
- 一、TailwindCss功能展示
- 二、有什么优势?
- 1. 原子化css+高度定制化
- 2. 支持伪类写法
- 3. 强大的响应式
- 三、相关辅助插件推荐
- 1. Tailwind CSS IntelliSense 补全+提示
- 2. 加强可读性-headwind (vscode)
- 3. clsx的额外拓展
- 4. tailwind-merge
- 四、实战可能的问题
- 1. Design tokens 与 Tailwindcss 结合使用
- 2. 动态样式
- 3. 公共样式的复用问题
- 总结
一、TailwindCss功能展示
相信看了上图+以下效果之后,就了解这个库了,实质就是对于css写法进行优化的库,让开发重点关注html页面编写,不必将关注点切到css文件。

二、有什么优势?
1. 原子化css+高度定制化
原子化即指单一原则,针对最小单位的css,它只对应一条具体的样式。
而TailwindCSS其实就是一个聚合了很多个原子类的库,提供了大量系统预设类名。

2. 支持伪类写法
例如hover:、focus:等,效果如下:
而平常使用的内联Style中无法支持 ,也就是 hover: 等状态下的样式,必须在另外的css文件中编写。
3. 强大的响应式
TailwindCSS 提供响应式处理,例如sm:,md:,lg:,实现在不同宽度屏幕下的样式
产物单位会自动转换成rem,当然也可以是其它比如em或者px等。
tailwindcss vs 手写媒体查询
同样是实现多列布局对各个屏幕尺寸大小的适配,左右对比一下,可见优劣
display: grid: 使用grid布局grid-cols-x:表示每行有x个

是不是少写很多行代码,懒癌党狂喜~~
对于需要特定数值的样式如宽高、字体大小和边距等,TailwindCSS提供的工具类默认为响应式,如 p-4 实际上是padding: 1rem。而对于特定值可以这样用:p-[12px],bg-[#fff]。
也可以在配置文件手动预设一些值。
三、相关辅助插件推荐
1. Tailwind CSS IntelliSense 补全+提示
官方给用户贴心地提供了对应的vscode插件,可以快速选择并提示css原用法:

2. 加强可读性-headwind (vscode)
- 竖着写
- headwind自动排序className

3. clsx的额外拓展
- 基本拼接:将多个类名直接拼接
import clsx from 'clsx';
const MyComponent = () => {const classes = clsx('class1', 'class2');return <div className={classes}>{'这是一个带有组合类名的元素'}</div>;
};
export default MyComponent;
- 条件拼接:可根据特定条件动态拼接,默认为true时拼接false时不做拼接
import clsx from 'clsx';
const MyButtonComponent = ({ isActive }) => {const classes = clsx('button', { 'active': isActive });return <button className={classes}>{'这是一个按钮'}</button>;
};
export default MyButtonComponent;
- 多条件拼接:支持同时拼接多个条件的类名,原理同上
import clsx from 'clsx';
const MyButtonComponent = ({ isActive, isLarge }) => {const classes = clsx('button', {'active': isActive,'large': isLarge});return <button className={classes}>{'这是一个按钮'}</button>;
};
export default MyButtonComponent;
4. tailwind-merge
解决多个原子CSS结合时的冲突,可以清除冗余的类名,只保留最后生效的。
import clsx from 'clsx';
import { twMerge } from 'tailwind-merge'const MyComponent = () => {const classes = twMerge('px-2 py-1 bg-red hover:bg-green', 'p-3 bg-[#ffffff]');return <div className={classes}>{'组合类'}</div>;/*'hover:bg-green p-3 bg-[#ffffff]'*/
};
export default MyComponent;
可与clsx结合使用:twMerge(clsx( ))
四、实战可能的问题
1. Design tokens 与 Tailwindcss 结合使用
design-tokens.json:
{"color": {"primary": "#4f46e5","secondary": "#ec4899"},"spacing": {"small": "8px","medium": "16px","large": "24px"}
}
配置文件tailwindcss.config.js
const designTokens = require('./design-tokens.json');module.exports = {theme: {colors: {primary: designTokens.color.primary,secondary: designTokens.color.secondary},spacing: {sm: designTokens.spacing.small,md: designTokens.spacing.medium,lg: designTokens.spacing.large}}
};
2. 动态样式
- 控制单条样式
例如用isTrue控制border和py
const Button = ({ isTrue }) => {return (<buttonclassName={`${isTrue ? 'border-[1px]' : 'border-2'}${isTrue ? 'py-1' : 'py-3'}`}>label</button>)
}
- 失效写法
此时使用变量来控制盒子宽度和字体颜色就会失效了:
const Div = ({ width, color }) => {return <div className={`w-[${width}px] text-${color}`}></div>
}
以上写法暂不支持,样式会失效,是因为TailwindCSS是在构建时按需生成类名以及相应的样式,这种运行时生成的无法被检测到。
正确写法:
const Div = ({ width, color }) => {return <div className="..." style={{ width, color }}></div>
}
3. 公共样式的复用问题
设计初衷:不要过早抽象,相对独立维护
官方的推荐做法
重复多使用jsx+循环,也可以利用代码编辑器快速同时编辑多个className

总结
tailwindcss:
- 关注当前页面,不必关注类名
- 高效处理响应式和伪类
- 与内联style类似,各样式独立,不必担心复用问题,维护性强
tip:
常用工具类普遍好记,如
grid就是display: gird,relative就是position: relative, 但是有一些css和tailwindcss写法出入比较大的,比如width,写法w-[100px]
可以边写边在官方文档ctrl+k查找,基本两遍也就记住了~
相关文章:
前端样式库推广——TailwindCss
官方网址: https://tailwindcss.com/docs/installation/using-vite 中文官方文档:https://www.tailwindcss.cn/ github地址:tailwindcss 正在使用tailwindcss的网站:https://tailwindcss.com/showcase 一看github,竟然…...
Gemini分析屏幕截图时,如何处理图像模态(如界面元素、文字内容)与文本模态(用户指令)的语义对齐?
在通过Gemini大语言模型进行屏幕截图分析时,实现图像模态(界面元素/文字内容)与文本模态(用户指令)的语义对齐,需要结合多模态融合技术和领域知识。以下是具体的技术实现路径和挑战应对方案: 1.…...
【6】组合计数学习笔记
前言 关于今天发现自己连快速幂都忘记怎么写这件事 这篇博客是组合计数基础,由于大部分内容都是 6 6 6 级,所以我就给整个提高级的组合数学评了 6 6 6 级。 组合计数基础 加法原理与乘法原理 加法原理(分类计数原理)&#…...
Ai客服机器人系统源码
我将基于常见的自然语言处理库,用 Python 编写一个简单的 AI 客服机器人功能代码示例,它能处理常见问题并根据用户输入提供相应回复。 import nltk from nltk.chat.util import Chat, reflections # 下载必要的NLTK数据 nltk.download(pun…...
Redis——事务实现以及应用场景
本文介绍Redis事务相关的原理以及知识点,从redis的常用命令出发,深入理解redis在日常工作中的实际场景使用用法。 本文目录 一、Redis事务简介二、事务相关命令三、事务应用场景 一、Redis事务简介 Redis 事务本质上是一个命令队列。用户可以使用MULTI命…...
SpringBoot 第二课(Ⅰ) 整合springmvc(详解)
目录 一、SpringBoot对静态资源的映射规则 1. WebJars 资源访问 2. 静态资源访问 3. 欢迎页配置 二、SpringBoot整合springmvc 概述 Spring MVC组件的自动配置 中央转发器(DispatcherServlet) 控制器(Controller) 视图解…...
Kafka 八股文
一、基础概念 1. Kafka 是什么?它的核心组件有哪些? Kafka 的定义 Kafka 是一个 分布式流处理平台,最初由 LinkedIn 开发,后成为 Apache 顶级项目。它主要用于 高吞吐量的实时数据流处理,支持发布-订阅模式的消息传递…...
OpenHarmony 开源鸿蒙北向开发——3.配置SDK
安装、配置完成之后我们就要配置SDK。 我们创建工程后,点击右上角设置 进入设置 进入OpenHarmony SDK,选择编辑 这里配置一下SDK安装位置 点击完成 这里我们API版本勾选第一个即可 确认安装 勾选接受 这里要等一会 安装完成后,点击完成...
电子工程师转战汽车OEM主机厂之路
文章目录 1 电子工程师2 汽车系统工程师 第一篇分享一个笔者2018年的一个心得文章,回头想想从事汽车行业也小8年了,从懵懂稚嫩到所谓的老油条,也是难忘的经历,希望我的经历对从事电子行业和汽车行业的小伙伴有所帮助。 1 电子工程…...
vulhub Matrix-Breakout
1.下载靶机,打开靶机和kali虚拟机 2.查询kali和靶机ip 3.浏览器访问 访问81端口有登陆界面 4.扫描敏感目录 kali dirb 扫描 一一访问 robot.txt提示我们继续找找,可能是因为我们的字典太小了,我们换个扫描器换个字典试下,利用kali自带的最大…...
Unity3D开发AI桌面精灵/宠物系列 【二】 语音唤醒 ivw 的两种方式-Windows本地或第三方讯飞等
Unity3D 交互式AI桌面宠物开发系列【二】ivw 语音唤醒 该系列主要介绍怎么制作AI桌面宠物的流程,我会从项目开始创建初期到最终可以和AI宠物进行交互为止,项目已经开发完成,我会仔细梳理一下流程,分步讲解。 这篇文章主要讲有关于…...
三月九次前端面试复盘:当场景题成为通关密钥
三月初集中面了包括字节、美团、滴滴在内的9家公司,经历7场技术面2场Leader面后,发现如今的面试逻辑已发生根本转变。这里分享真实经历与题目,供近期求职者参考。 一、面试形态变化:从理论背诵到实战推演 1. 八股文边缘化&#…...
STM32 —— 嵌入式系统、通用计算机系统、物联网三层架构
目录 一、嵌入式系统的概念 二、通用计算机系统与嵌入式系统的比较 用途 硬件 软件 性能与功耗 开发与维护 三、嵌入式系统与物联网的关系 四、物联网的三层架构 1. 感知层(Perception Layer) 2. 网络层(Network Layer) …...
如何选择合适的 AI 模型?(开源 vs 商业 API,应用场景分析)
1. 引言 在 AI 迅猛发展的今天,各类 AI 模型层出不穷,从开源模型(如 DeepSeek、Llama、Qwen)到商业 API(如 OpenAI 的 ChatGPT、Anthropic 的 Claude、Google Gemini),每种方案都有其优势与适用…...
视频对讲系统中,强插和强拆;视频分发功能
强插和强拆 在视频对讲系统中,强插和强拆是两个具有特定功能的操作,具体含义如下: 强插功能:指在视频对讲过程中,具有更高权限的用户或管理员可以强行插入正在进行的通话或视频连接。例如,当小区保安室监控…...
C++输入输出流第一弹:标准输入输出流 详解(带测试代码)
目录 C输入输出流 流的四种状态(重点) 标准输入输出流 标准输入流 逗号表达式 1. 逗号表达式的基本规则 示例 2. 图片中的代码分析 关键点解析 3. 常见误区 误区 1:逗号表达式等同于逻辑与 && 误区 2:忽略输入…...
{瞎掰} 手机安装app问题:app签名,手机 or OS官方商店 其他非官方app源,安全防护 突破限制
以下,在华为安卓系统手机中,在安装app过程中得到的一些可能是错误的经验。 商品化 app 的收钱方式:通过商店来收钱,通过 app 本身提供的注册码功能来收钱,或是其他的收钱方式。 手机安装 app的特点 从官方商店里安装…...
鸿蒙NEXT项目实战-百得知识库05
代码仓地址,大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点: 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…...
记录一次,rabbitmq开启stomp插件之后,还是连不上15674端口的问题
原因是装在docker 里面的rabbitmq 没有映射15674端口,需重新删除容器之后重新运行 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -p 15674:15674 -p 1883:1883 -p 15675:15675 rabbitmq:版本号 进入docker容器开启插件 docker exec -it rabbitm…...
黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)
文章目录 代码示例效果 代码示例 axiosTest.html <!DOCTYPE html> <!-- 文档类型声明,告诉浏览器这是一个HTML5文档 --> <html lang"en"> <!-- HTML根元素,设置文档语言为英语 --><head> <!-- 头部区域&am…...
vue 自制列表,循环滚动
需求人员表示,超过高度的表格内容需要滚动展示,所以效果图如下: 自定义列表样式,主要是通过flex布局,控制 类th 与 类td 的宽度保持一致,标签结构还是参考了table的结构,由thead与tbody包裹tr再…...
【QA】模板方法模式在Qt中有哪些应用?
在 Qt 框架中,模板方法模式(Template Method Pattern)被广泛应用于框架的设计中,通过定义算法骨架并允许子类在不改变结构的情况下重写部分步骤。以下是 Qt 中典型的应用场景及示例: 1. 事件处理(Event Ha…...
图论——kruskal算法
53. 寻宝(第七期模拟笔试) 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通…...
Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传
以下内容源于日常学习的整理,欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图: 注意,下面谈及的所有方式,都要求两者的IP地址处于同一网段,涉及到的软件资源见felm。 一、Windows主…...
Flutter Dart 泛型详解
引言 在 Flutter 开发中,Dart 语言的泛型是一项强大且实用的特性。泛型允许我们在定义类、方法或接口时使用类型参数,这样可以编写更加灵活、可复用且类型安全的代码。下面将详细介绍 Dart 泛型的各个方面,并结合代码示例进行说明。 1. 泛型…...
Windows Docker 报错: has no HTTPS proxy,换源
pull python 3.7报错: 尝试拉取Docker 测试库hello world也失败 尝试使用临时镜像源,可以成功拉取: sudo docker pull docker.m.daocloud.io/hello-world说明确实是网络问题,需要配置镜像源,为了方便,在d…...
Java:Arrays类:操作数组的工具类
文章目录 Arrays类常见方法SetAll(); 代码排序如果数组中存储的是自定义对象 Arrays类 常见方法 SetAll(); 注意: 不能用新的数组接是因为修改的是原数组,所以完了要输出原数组发现会产生变化参数是数组下标变成灰色是因为还能简化(Lambda…...
【面试场景题-Redis中String类型和map类型的区别】
今天在面试中碰到一个场景题:在 Redis 中存储 100 万用户数据时,使用 String 类型和 Hash(Map)类型的主要区别是什么?体现在以下几个方面: 1. 存储结构与内存占用 String 类型 存储方式:每个用…...
List附加对象
List里面的某个对象需要修改,赋值 可以使用ALL或者ForEach,All的话,不能直接使用赋值对象只能赋值对象的某个字段 static void Main(string[] args){List<UserData> UserDatas new List<UserData>{new UserData { Id 1, Name …...
VLLM专题(三十六)—自动前缀缓存
PagedAttention 的核心思想是将每个请求的 KV 缓存划分为 KV 块。每个块包含固定数量的标记(tokens)对应的注意力键(keys)和值(values)。PagedAttention 算法允许将这些块存储在非连续的物理内存中,从而通过按需分配内存来消除内存碎片。 为了自动缓存 KV 缓存,我们利…...
