Tailwind CSS
Tailwind 是什么?
中文:https://tailwind.nodejs.cn/
Tailwind CSS1 是一个实用的工具集,它允许你通过预定义的类来快速构建和定制界面样式,而不是创建传统的CSS样式表。它遵循原子设计原则,提供了大量可组合的小型样式类。
Tailwind npm trends2:
Tailwind CSS 优点3:
- 可定制化程度极高
- 不需要再写 css
- 对于类名的规范统一:不需要再为 class 取个什么名字而苦恼
- 响应式设计
- 一套专业的 UI 属性值
安装、快速上手
安装 Tailwind 及其依赖项 postcss
和 autoprefixer
:
npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
初始化配置文件:
# 执行以下命令会创建tailwind.config.js和postcss.config.js文件
# 带上`-p`参数表示同时生成postcss配置文件
npx tailwindcss init -p
生成的 tailwind.config.js 文件内容如下:
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [],
theme: {
extend: {},
},
plugins: [],
}
生成的 postcss.config.js 文件内容如下:
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
Hello World 示例参考官方 Get Started:https://tailwindcss.com/docs/installation
learn-tailwind
├── node_modules
├── package-lock.json
├── package.json
├── postcss.config.js
├── src
├── index.html
├── input.css
└── output.css
└── tailwind.config.js
提示:如果有波浪线提醒,可以在 vscode 安装下插件:PostCSS Language Support:
在 HTML 中使用
在 HTML 中直接使用 Tailwind CSS 的类,例如
<div class="bg-gray-300 p-4 rounded">
。 熟悉基础布局和定位类,如 flex, grid, justify-center, items-start 等。 学习响应式设计类,如sm: (small), md: (medium), lg: (large) 用于不同屏幕尺寸。
TailwindCSS 最基本的使用方式,就是和之前 bootstarp 等 CSS 库用法没什么两样,就是 class 上加各种类名。TailwindCSS 的类名都是由 属性缩写 + 属性程度 + [属性值]
。比如在默认情况下,TailwindCSS 对于数值分成几个程度,每个程度为 0.25rem。如: mt-2
表示 margin-top: 0.5rem
。对于 opacity 等属性还有属性值,如bg-opacity-30
表示 --tw-bg-opacity: 0.3; // e.g. background-color: rgba(0, 0, 0, var(--tw-bg-opacity));
。(对于颜色、变换等,都会使用变量。)还提供了一些字面量,如 md
sm
等用于响应式布局。
记不住怎么办?—— 可以使用 VSCode 插件:Tailwind CSS IntelliSense4
类名堆的太多怎么办? —— 可以使用 @apply
语法包起来(通过 PostCSS 预处理)
.test {
@apply relative w-full h-[40px] bg-background-regular flex items-center justify-between px-4 truncate;
}
注:需要安装 PostCSS Language Server 才能使用针对于 PostCSS 的补全。PostCSS 也是一种格式,扩展名为
.css
.pcss
Tailwind CSS 设计系统
参考:https://juejin.cn/post/6951300894684577823
Tailwind 的开箱即用主要体现在:
- 精心设计的 design token
- 支持响应式
- 支持伪类等 CSS 状态
- 支持 Dark 模式
“Tailwind CSS 的扩展机制,保证了样式层的规范都来源于同一个地方——Tailwind。”
在项目中使用
打包构建
由于 Tailwind 需要把所有的 css 属性全部都封装了一遍,所以 css 文件巨大,3M多,所以不建议在页面你及直接引入 Tailwind 原生 css 文件的做法。
为了解决这个问题,可以在编译时引入 PurgeCSS5,构建时就会自动删掉所有没用到的 css,只保留你用到的 css,这样最终打包出来的 css 文件就非常小了。
CSS in JS
对于喜欢「CSS in JS」写法的开发人员,可以借助 twin.macro 这个库,在「CSS in JS」中引用 Tailwind CSS。这样就可以既享受「CSS in JS」的优势,又能保证 Tailwind CSS 作为样式层的 Single Source Of Truth。下面是一个示例:
import 'twin.macro'
const Input = () => <input tw="border hover:border-black" />
在 Taro 中使用
把tailwindcss带给小程序开发者们 用tailwindcss来开发小程序吧!这是一个webpack/vite/gulp插件集合,兼容了各种用这类打包的框架,比如uni-app,tarojs,rax,mpx,remax,原生等等.伟大的icebreaker部署了这个文档网站 | weapp-tw 把tailwindcss带给小程序开发者们
如何保证原子化的样式类名称有一个比较合理的顺序
tailwindcss提供了一个 prettier 插件:prettier-plugin-tailwindcss
生产优化
参考:https://www.w3cschool.cn/tailwind_css/tailwind_css-vcbz3p8
PostCSS 是什么东西?
前端 - PostCSS 是个什么鬼东西? - 60sky - SegmentFault 思否
“PostCSS 可以直观的理解为:它就是一个平台、平台、平台!”
嵌套语法
tailwind 插件:@tailwindcss/nesting
固定行数后截断
tailwind 插件:@tailwindcss/line-clamp
移动端适配方案
todo:了解 css 的各个单位
可能对于移动端适配,现在流行的就是viewport
方案了,也可能有的项目还在用flexable
方案,但是我们又不想手动换算px
到rem
或vw
,虽然社区也有类似pxtorem
或者pxtovw
这种postcss
的插件,但解决问题的方法还是不够优雅,可能是因为插件的维护的不积极,可能是插件不好用,不兼容postcss8
(pxtovw
说的就是你😤),既然我们都有tailwindcss
了,那就让这些配置变的更简单一些吧!如果你们设计同学提供了常用的间距方案,比如4px
的倍数或者6px
的倍数,现在假设设计同学的设计稿都是750px
的,我们就可以基于此来写两个函数方法来处理pxtorem
和pxtovw
的任务,如果你们是flexable
方案就用pxToRem
,如果是viewport
的适配方案就用pxToVmin
。
function pxToRem(variable) {
return `${variable / 75}rem`
}
function pxToVmin(variable) {
return `${variable / 7.5}vmin`
}
// flexable
const fontSize = {
12: pxToRem(12),
14: pxToRem(14),
16: pxToRem(16),
...
}, spacing = {
0: 0,
4: pxToRem(4),
8: pxToRem(8),
12: pxToRem(12),
...
}
// viewport
const fontSize = {
12: pxToVmin(12),
14: pxToVmin(14),
16: pxToVmin(16),
...
}, spacing = {
0: 0,
4: pxToVmin(4),
8: pxToVmin(8),
12: pxToVmin(12),
...
}
module.exports = {
content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
theme: {
// ...
fontSize,
spacing
},
plugins: [],
}
其它
- 在已有项目中使用,建议使用自定义前缀(如
tw-
),方便辨认 tw 类名 - 安全列表 safelist:作用就是在安全列表的类名不会被意外删除(为提高性能和减少体积,打包时会抖掉无用的类名)
- 默认的尺寸单位是:px?rem?那么在小程序,如何转为 rpx?
- 提取组件时,该如何统一命名?
Tailwindcss 的正确打开姿势
最显眼的那个痛点可能并不存在
Tailwind 某些元素 class 名可能会非常长,但这个痛点其实有很多方法可以解决(或者说避免复杂的样式)
示例:
<div className='flex items-center text-gray-700 bg-white px-8 py-5 transition hover:bg-amber-100'>
</div>
<div className='flex items-center text-gray-700 bg-white px-8 py-5 transition hover:bg-amber-100'>
</div>
<div className='flex items-center text-gray-700 bg-white px-8 py-5 transition hover:bg-amber-100'>
</div>
以上一大串类名可以在函数组件中,将这些 class 名提取到一个字符串变量中:
var clx = 'flex items-center text-gray-700 bg-white px-8 py-5 transition hover:bg-amber-100'
<div className={clx}></div>
<div className={clx}></div>
<div className={clx}></div>
有的时候,我们使用 tailwindcss 的目的其实是为了少创建一个 css 文件,因此,就近声明变量是我认为最好的方式,只有一些全局的、共用的可以单独提炼出来放到一个单独的文件中去。