为什么使用Tailwind Css框架
时间:2025-11-05 16:03:53 出处:应用开发阅读(143)
简短的使用概括:
发现问题:项目中css代码痛点
.mock {
margin: auto;
font-size: 16px;
// ...
}
<div class=mock>mock</div>以上代码就是举个例子,大部分情况应该都是使用写一个类,然后整一堆样式进去。使用这种方式写多了以后,使用会感受到一些痛点,使用比如说:
1) 取名困难,使用节点结构一多,使用取名真的使用是个难事。当然了,使用我们可以用一些规范或者选择器的使用方式去规避一些取名问题。
2) 需要用 JS 控制样式的使用时候又得多写一个类,尤其交互多的使用场景。
3) 组件复用大家都懂,使用但是使用样式复用少之又少,这样就造成了冗余代码变多。使用
4) 全局污染,这个其实现在挺多工具都能帮我们自动解决了。
5) 死代码问题。JS 我们通过 tree shaking 的方式去除用不到的代码减少文件体积,但是 CSS 该怎么去除?尤其当项目变大以后,无用 CSS 代码总会出现。
6) 样式表的服务器托管插入顺序影响了 CSS 到底是如何生效的。
一、Tailwind CSS 介绍
Tailwind 能够快速将样式添加到 HTML 元素中,并提供了大量的开箱即用的设计样式。
tailwindcss 基于比组件更小、更灵活的工具类思想的 CSS 框架。这个思想简单来说就是用 class 保证灵活、便于自定义组件,而不是在组件基础上实现个性化。
官网:https://www.tailwindcss.cn/
如果你从来没见过 Tailwind 的实际应用,可以看这个:
<div class="bg-gray-100 rounded-xl p-8">Hello World</div>这里的类名就反映了 Tailwind 的定义:一个包含多个预定义类(所谓的工具类)的集合。你并不需要编写基础的 CSS 样式规则,只需要直接在 HTML 中应用已经事先定义好的类名。
这样的类名还有很多。下面这个列表展示了部分类别和对应的例子:
1)背景 (bg-gray-200, bg-gradient-to-bl)
2)弹性布局 (flex-1, flex-row)
3)网格布局 (grid-cols-1, col-span-4)
4)内边距 (p-0, p-1)
5)尺寸 (w-1, h-1)
开发大型应用的时候,亿华云每一个 HTML 元素都充斥着一大堆 Tailwind 的工具类名。
hello world
</div>问题:
要怎么组织这些类名呢?也许我们要创建并遵循某个排序规则。
解决方案:
部分 HTML 元素会使用非常多的样式,这种情况下应该考虑将样式与 HTML 标签进行分离,单独放到某个文件里。这样,我们就可以组织样式并增强其可读性。你不能把 CSS 的所有功能”塞到“ class 这一个 HTML 标签属性里,Tailwind 也不能。这样做只会让 HTML 结构越发臃肿。
@apply
针对上面提到的问题,Tailwind 允许我们在单个 CSS 文件中使用它们的类名:
.header {
@apply bg-red-200 w-4 text-gray-400 rounded-sm border-2;
}比如说项目中的按钮都是存在通用的圆角、内边距、字体等,这样我们就可以封装出这样一个类:
.btn {
@apply p-8 rounded-xl font-semibold;
}二、使用 Tailwind CSS 的理由1、超小的文件尺寸 = 令人难以置信的性能
在开发模式下,Tailwind的输出尺寸非常大。这是设计使然:在此阶段生成每个可能的类,b2b信息网因此当你想要使用某些东西时,无需等待完成构建的过程。
但是,一旦Tailwind CSS进入生产模式,就会清除所有未与PurgeCSS工具一起使用的类。这是通过在项目文件中搜索类的名称来实现的,只保留那些使用过的。你可以在purge数组中的tailwind.config.js中配置将搜索哪些文件路径。
// tailwind.config.js
module.exports = {
purge: [
"./src/**/*.html",
"./src/**/*.vue",
./src/**/*.js
],
theme: {},
variants: {},
plugins: [],
}2、原型和快速构建
使用常规SCSS,需要为页面上的每个元素编写自定义类。这样虽然可以提供更好的控制,但编写自定义类需要花费大量时间:你必须在HTML中添加类,然后在CSS中创建,再以长格式写出每个属性。你必须等待CSS构建后才能看到结果——并且,如果你需要进行更多更改,则每次都需要重新构建,这可能会花费几秒钟时间并中断你的流程。
Tailwind CSS取消了这些额外的步骤,并在为元素设置样式时提供了简单、爽快的开发体验。可以看到想要设置样式的元素,使用简写方式添加需要的属性,不需要等待CSS文件束就能很快出现改变。因此只要专注于一个地方即可,不用频繁切换到不同的文件,整个过程感觉很流畅。
Foobar
Hello world!
</div>3、消除范围泄漏
人们喜欢BEM以及它能在今天如此流行的原因是,命名系统类的构建是为了表示组件的结构。在使其易于阅读和理解的同时,开发人员还受益于这种结构:由于布局易于理解,因而可以在不使用CSS选择器的情况下编写类。如下:
// this
.block {
&__element { ... }
&__element--modifier { ... }
}
// not this
.block {
& > .element {
&.modifier { ... }
}
}CSS选择器的问题在于它们给CSS带来了复杂性:组件变得非常依赖于特定的HTML结构。由于通用CSS类,例如.container,可以重复多次,所以使用这些名称可能会导致重叠,因此更改一个类将影响许多其他的类。这是我们使用BEM的主要原因之一,因为它使得结构清晰,并将每个类扁平化到顶级范围,这样就不会互相依赖。如果没有像这样的CSS方法,那么开发工作可能会让人头疼,并且其简单性意味着其他人可以更容易地理解它。
三、Tailwindcss 为何大受欢迎

NPM.DEVTOOL 中 tailwind 标签大全
地址:https://npm.devtool.tech/tailwindcss
现在项目开发用的 TailwindCSS,在这里谈一点感受,TailwindCSS 因为一个 class 代表一个 CSS 属性这种原子化 CSS (Atomic CSS),这种细粒度的 CSS 方案备受争议。
1、四种粒度
Click Click Click <Button> Click </Button>越往下封装的粒度就越大,越抽象,灵活性就越低,但是灵活性往往是和开发工作量成反比的,灵活性越高也就意味着更多的工作需要开发者自己去处理,如何平衡开发工作量与灵活度之间的关系就显得尤为重要。
因为这涉及到css库的选择,其中BootStrap库更多的是提供颗粒度3的形式,给定一个固定的样式,开发者需要自定义样式的话必须去重写样式,而tailwind则是提供颗粒度2形式的原子样式,更多的是提供一种规范,然后将更大的自由度交由开发者,由开发者来进行样式的组装。
2、一些问题的解答
Tailwindcss 为啥受欢迎,无非是更好用的原子化的 CSS。在国外如火如荼,但是在国内论坛上争议很大,前几天看的前端大佬博客上写了一篇关于 Tailwindcss 的文章,但是底下评论很多了各种问题,总结一下
Q1: tailwind的写法和行内 CSS 有何区别,不就少写几个字吗?
大部分人的想法应该是这样的: 仅仅对于 text-center 而言,虽然提供了些许方便,但是不足以拉开差距。
如果说它仅仅是简单的原子化 CSS,好用却不亮眼。但是它却不仅仅止于此。
1. 方便性: text-center、grid-cols-3
或许一个 text-center 不足以使你觉得提供了多大的方便性,但对于一个三等分的 Grid 属性来说,一个 grid-cols-3 和 shadow 绝对方便。
.grid-cols-3 {
grid-template-columns: repeat(3, minmax(0, 1fr));
}2. 语义化: text-lg、text-white、ring、animate-spin`
text-lg,一个较大字体,如果设置行内样式,肯定有诸多麻烦的事: 我想设计一个较大的字体,那我应该设计多大尺寸、使用什么单位。
同样还有:
text-white: 白色的色值是哪个来着?
ring: 我想给这个按钮加一个圈圈?
animate-spin: 怎么做一个动画?
3. 响应式:
先来看一个在工作中会遇到的响应式布局问题,这也是我上一次在头条面试时的一道题目
响应式布局,一大堆子元素,在大屏幕三等分,中等屏幕二等分,小屏幕一等分?
</div>通过 grid 布局很容易实现,但未免繁琐
@media (min-width: 1024px) {
.container {
grid-template-columns: repeat(3,minmax(0,1fr));
}
}
@media (min-width: 768px) {
.container {
grid-template-columns: repeat(2,minmax(0,1fr));
}
}
.conainer {
display: grid;
gap: 1rem;
}那使用 tailwind 呢? 只要一行,就问你高效不高效。
4. 修饰符
把修饰符,如各种伪类、暗黑模式、响应式设计至于前缀的设计简直深得我心。
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"></div>Q2: 既然 TailwindCSS 这么好用,那岂不是可以摆脱手写 CSS 了
很遗憾,不能。不过虽然你无法摆脱手写 CSS,但是你基本上也写不了几行,说以下几种很常用的情况。
1. 复杂选择器
当父级元素鼠标悬浮时的,子级元素的样式控制
.container:hover .item {
}2. CSS function
.body {
height: calc(100vh - 6rem)
}3. 多种属性复用
.item {
@apply p-2 border-b flex justify-between font-mono;
}Q3: 造成新的记忆负担
这个问题就仁者见仁智者见智了,在 Vue 的 template 语法中也经常出现此类问题,很多人会对一些命名上的约定,特别是自己不太喜欢的约定天然排斥,这也无可厚非。
在初期确实会一边开发网页,一边瞅着文档全局搜索: TailwindCSS 属性查找,现在借助浏览器插件及熟能生巧的经验已经不太需要翻文档了。
1. Tailwind CSS IntelliSense (vscode)
智能补全


代码提示


初期经常花时间翻文档而不手写 CSS,而其中的原因不外乎两个:
1、多写几个字母,确实有点嫌麻烦,有这时间还不如看看文档,全局搜索下也不费事;
2、自己设置一个 fontSize,padding、margin 实在不知道设置多少尺寸,tailwindcss 有较大的约束;
过了多久就会觉得: 嗯,真香。
四、Tailwindcss 项目实践原本传统的写法是定义一个类,然后写上需要的样式:
.class1 {
font-size: 18px;
margin: 10px;
}
.class2 {
font-size: 16px;
color: red;
margin: 10px;
}这种写法是存在一部分样式重复的,换成 Atom CSS 就能减少一部分代码的冗余。
把 CSS 当成组件来写。大家乍一看 tailwindcss 官网肯定会觉得我在 HTML 里写个样式要敲那么多类不好吧。

“Tailwind CSS is the only framework that Ive seen scale
on large teams. It’s easy to customize, adapts to any design,
and the build size is tiny.”
Sarah Dayan
Staff Engineer, Algolia
</figure>其实我们是可以利用 Atom CSS 一次只干一件事的特性,将这些类随意组装成我们想要的类,这样就可以提供出来一个更上层的通用样式来复用。
tailwind.confing.js 配置文件
/
*** 定制配置
* 默认配置请参考 https://unpkg.com/browse/tailwindcss@2.2.6/stubs/defaultConfig.stub.js
*/
module.exports = {
purge: [
"./src/**/*.html",
"./src/**/*.vue",
./src/**/*.jsx
],
theme: {
extend: {
fontFamily: {
sans: ["Inter", "Roboto", "Segoe UI"],
dincond: ["DINCond-Black"]
},
fontSize: {
2.5: 0.625rem, // 10px
3: 0.375rem, // 12px
5.5xl: 3.25rem, // 52px
4.5xl: 2.5rem, //40px
},
width: {
4.5: 1.125rem, //18px
10.5: 2.65rem, //42px
15: 3.75rem, // 60px
18: 4.5rem, // 74px
18.5: 4.625rem, // 74px
23: 5.75rem // 92px
},
lineHeight: {
12: 3rem, // 48px
15: 3.875rem, // 62px
16: 4rem, //64px
14: 3.5rem, //56px
"18" : "4.625rem" //74px
},
padding: {
0.5: 0.125rem, // 2px
5.5: 1.375rem, // 22px
4.5: 1.125rem, //18px
0.75: 0.1875rem, //3px
7.5: 1.875rem //30px
},
paddingBottom:{
4.5: 1.375rem //22px
},
margin: {
4.5: 1.125rem, //18px
15: 3.75rem, // 60px
21.25: 5.3125rem, // 85px
11.5: 2.875rem, // 46px
19: 4.75rem, //76px
},
marginTop: {
6.5: 1.625rem, // 26px
},
spacing: {
3.5: 0.875rem, // 14px
7.5: 1.875rem, //30px
9.5: 2.375rem, // 38px
// 15: 3.375rem, // 54px
11.5: 2.875rem, // 46px
23: 5.75rem, // 92px
28: 7rem, // 112px
98: 39rem, // 624px
},
height: {
0.25: 0.0625rem, //1px
0.75: 0.1875rem, // 3px
14: 3.5rem, // 56px
10.5: 2.65rem //42px
},
backgroundColor: {
primary-a100: rgba(43, 121, 255, 0.1),
},
borderRadius: {
5.5: 1.375rem
}, //22px
zIndex: {
6: 6 // z-index: 6
},
screens:{
3xl: 1664px,
4xl: 1792px
},
scale: {
85: .85, // 0.85rem
}
}
},
plugins: [
require("tailwindcss-theming")({
variants: {
light: true
}
})
]
};至此,我们已经了解了什么是 Tailwind CSS?如何使用 Tailwind CSS?Tailwind CSS 定制以及插件的使用,相信大家对Tailwind CSS已经有一个全面的认识。
猜你喜欢
- 什么是Kdump?Kdump 是一种的新的crash dump捕获机制,用来捕获kernel crash时候产生的crash dump。Kdump需要配置两个不同目的的kernel,其中一个我们在这里称作standard(production) kernel;另外一个称之为Crash(capture)kernel。standard(production)kernel,是指我正在使用的kernel,当standard kernel在使用的过程中出现crash的时候, kdump会切换到crash kernel, 简单来说,standard kernel会正运行时发生crash,而crash(capture) Kernel 会被用来捕获production kernel crash时候产生的crash dump。捕获crash dump是在新的crash(capture) kernel 的上下文中来捕获的,而不是在standard kernel上下文进行。具体是当standard kernel方式crash的时候,kdump通过kexec(后面介绍)自动启动进入到crash kernel当中。假如启动了kdump服务,standard kernel会预留一部分内存, 这部分内存用来启动crash kernel。kdump机制主要包括两个组件:kdump和kexec kexec是一个快速启动机制,允许通过已经运行的内核的上下文启动一个Linux内核,不需要经过BIOS。BIOS可能会消耗很多时间,特别是带有众多数量的外设的大型服务器。这种办法可以为经常启动机器的开发者节省很多时间。Kexec是实现kdump机制的关键,它包括2个组成部分:一是内核空间的系统调用kexec_load,负责在生产内核(production kernel 或 first kernel)启动时将捕获内核(capture kernel或sencond kernel)加载到指定地址。二是用户空间的工具kexec-tools,他将捕获内核的地址传递给生产内核,从而在系统崩溃的时候能够找到捕获内核的地址并运行。没有kexec就没有kdump。先有kexec实现了在一个内核中可以启动另一个内核,才让kdump有了用武之地。 kdump是一种先进的基于kexec的内核崩溃转储机制。当系统崩溃时,kdump使用kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。由于kdump利用kexec启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。kdump需要两个不同目的的内核,生产内核和捕获内核。生产内核是捕获内核服务的对像。捕获内核会在生产内核崩溃时启动起来,与相应的ramdisk一起组建一个微环境,用以对生产内核下的内存进行收集和转存。注意,在启动时,kdump保留了一定数量的重要的内存,为了计算系统需要的真正最小内存,加上kdump使用的内存数量,以决定真正的最小内存的需求。kexec和kdump的设计区别:Kexec的设计是用新内核去覆盖原内核位置;而KDUMP是预留一块内存来加载第二个内核(和相关数据),Crash后第二个内核在原位置运行(不然就达不到相关目的了),收集第一个内核的相关内存信息。下面开始试验kdump特性: 操作系统:ubuntu 12.10(3.5.0-17-generic)安装kdump工具复制代码代码如下: 发现安装过程中修改了grub,在引导内核配置上(/boot/grub/grub.cfg)多了如下参数复制代码代码如下: crashkernel用来指定保留内存的大小,我们可以知道crashkernel帮我们设定的保留区域的大小是:假如内存小于384M,不保留内存;假如内存大于等于384M但小于2G,保留64M;假如内存大于2G,保留128M。 复制代码代码如下:下载dbgsym文件,改文件是用来吊事内核信息的文件复制代码代码如下: 重启机器使配置生效。复制代码代码如下:kdump-tools配置(kdump-config show):复制代码代码如下:可以通过sysrq强制系统崩溃。 复制代码代码如下: 这造成内核崩溃,如配置有效,系统将重启进入kdump内核,当系统进程进入到启动 kdump服务的点时,(dump.时间戳文件)将会拷贝到你在kdump配置文件中设置的位置。ubuntu的缺省目录是:/var/crash/时间戳文件夹。然后系统重启进入到正常的内核。一旦回复到正常的内核,就可以在上述的目录下发现dump文件,即内存转储文件。可以使用之前安装的crash工具来进行分析。生成dump文件后/var/crash的目录结构:├── 201305061817复制代码代码如下:出现如下错误提示: crash: cannot resolve: xtime,此时crash的版本为5.1.6,版本太低,调试不了3.5的内核,需要升级crash,可以手动安装crash。
- 2025年数据中心值得关注的冷却趋势和策略
- 一文读懂 Nginx 访问日志与错误日志
- Host容器:Tomcat如何实现热部署和热加载?
- 电脑QQ文件打开错误的解决方法(排除电脑QQ文件打开错误的常见问题)
- 数据中心的电力需求可能在三年内翻一番
- 服务器多?密码烦?用这个脚本,一键搞定 SSH 免密信任!
- DDoS攻击:数据中心陷入十字准线
- 斐讯K2P原厂救砖教程——故障恢复的利器(简单易懂的步骤让你的斐讯K2P重获新生)