type
status
date
slug
summary
tags
category
icon
password

1. 前言

这个系列的基础篇已经完结。
现在来更新进阶部分:
  • 上篇:如何复用样式
  • 下篇:Tailwind 的配置项
这是上篇,主要解决样式复用问题。

2. 什么是可以复用的?

在开始之前,首先要明确一个问题:什么可以复用?

2.1 .container

在网页开发中,.container 是一个出现频率极高的容器类,它用来做什么呢?给网页框定一个容器范围,例如:网页的展示区域宽度范围为 1280px - 1920px:
当浏览器窗口宽度小于 1280px 时会出现横向滚动条以确保能够显示 1280px 宽度的页面内容,当浏览器窗口大于 1920px 时,最多显示 1920px 的页面宽度。
又或者只是把内容展示在 1280px 的范围中:
在以往的开发中,控制宽度的样式声明会放在一起,然后封装在 .container 这个 CSS 类中,以后者为例,CSS 会是这样:
.container
.container

2.2 .btn

按钮样式也容易复用,假设有一个普通按钮如下:
.btn
.btn
通常样式被封装在 .btn 中:

2.3 .center

又或者是水平垂直居中,这在开发中就更常见了:
.center
.center
.center 类的声明如下:
那么这些复用的类在 Tailwind CSS 中应该如何处理呢?

3. 自定义指令

Tailwind CSS 使用了一种专属的 at 规则(at-rules)的 CSS 语句用来定义 CSS 如何运行。

3.1 @tailwind

在配置 Tailwind CSS 时,有一步非常重要的步骤就是在全局样式(例如:globals.css)中添加:
@tailwind 指令用于将 Tailwind 中的 base、components、utilities 三个层级的样式插入到全局样式中。
  • base:这是最基础的层级,在这个层级上,Tailwind 提供了一些界定基础样式的规则。例如margin、padding、color、font-size等等。
  • components:在这个层级可以创建可复用的样式块,例如:按钮、卡片等。默认情况下是空的。
  • utilities:作为工具层级,包括了 Tailwind 的大部分功能,例如: layout、flex、grid、spacing(margin 和 padding)、colors、typography、borders 等等。

3.2 @layer + @apply

@layer 这个指令告诉 Tailwind 想要把对应的样式放在上述哪一个层级(base、components、utilities)。在实际使用中需要配合 @apply它将允许我们使用现有的 Tailwind CSS 类。
上一节提到的 .btn 属于 components(组件级别的复用样式),而 .container.center 属于 utilities(更为底层的样式应用),在 globals.css 中添加以下代码:
设置完成后,就可以直接使用了。
  • .container
等价于:
  • .btn
等价于:
  • .center
等价于:

4. 自定义函数

Tailwind CSS 提供了两个实用的自定义函数——theme() 和 screen(),它们的作用是在我们自己的 CSS 样式中使用 Tailwind CSS 中的特定值。

4.1 theme()

使用 theme() 函数获取 Tailwind 样式变量,下面是一个在 React 中的使用示例:
然后引入到组件中:
spacing 是一个空间刻度系统,在基础篇中使用的数值就是基于这套系统。上述的 spacing.12 表示的是数值为 12 时的空间距离:
spacing
spacing
也就是 3rem,等价于 48px。因此最后的效果如下:
效果图
效果图

4.2 screen()

以往写媒体查询比较麻烦,需要定义各种条件而且容易搞混:
现在可以用 screen() 函数快速创建媒体查询,减少很多心智负担:
媒体查询相关内容将在《响应式篇》深入,感兴趣的话可以先关注~

5. 自定义样式

有时候 Tailwind CSS 预定义的样式没有我们想要使用的默认值,只能自己写。

5.1 任意值

第一种方式是使用任意值,这在基础篇已经用过很多次了,就是通过 name-[] 的方式。
中括号中放入任意值,可以是长度单位
长度单位
长度单位
颜色值:
文本内容:
甚至是 theme() 函数:
或者是使用 var() 定义的变量:
颜色、文本、var()、theme()
颜色、文本、var()、theme()

5.2 @layer + theme()

在自定义指令 @layer 中已经掌握了如何创建自己的自定义组件、工具样式。再结合 theme(),可以更加方便地编写自己的样式代码。
例如有一个 card 样式:
.card
.card
使用 @layer + @apply
使用 @layer + theme()
后者的写法和写原生就很像了,只需要掌握 Tailwind 的内置系统规则即可。之前提到 spacing 是一个刻度系统,同样还有颜色 colors、边框弧度 borderRadius 等等。
最后只需要愉快地写下这样一行代码就能搞定卡片样式:

6. 总结

以上就是如何实现样式复用的全部内容,总的来说就是两个方案:
  • @layer + @apply
  • @layer + theme()
不过仍然有一些需要注意的地方,我们最好不要滥用这些方法,虽然可以方便书写,但是过多的封装会造成打包体积的增大,可以直接写 Tailwind 的地方就用预设值直接写,除非是在文中提到的那种十分常见的样式才有必要封装起来。
下一篇将介绍 Tailwind CSS 的配置项,从而解决最后一波问题,例如:我想扩展更多的颜色变量、或者是字体大小?或者是重新定义默认值。
 
听说你还不会 Tailwind CSS(进阶·下篇)听说你还不会 Tailwind CSS(基础·下篇)
Eric 见嘉
Eric 见嘉
Less is more.
公告
type
status
date
slug
summary
tags
category
icon
password
💭
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。

关于我
土木转行的前端开发工程师,陆续分享技术干货。
联系我
微信公众号:见嘉 Being Dev