1. 程式人生 > 其它 >React簡單教程-3.1-樣式之使用 tailwindcss

React簡單教程-3.1-樣式之使用 tailwindcss

前言

本文是作為一個額外內容,主要介紹 tailwindcss 的用法

tailwindcss 是一個功能類優先的 CSS 框架,我在以前的文章裡有描述為什麼使用功能類優先:為什麼我在 css 裡使用功能類優先

上一章中我們的 react 元件有了一個簡單的樣式,在這一篇我們將使用 tailwindcss 來重新編寫它的樣式。我將使用我們上一章的程式碼為例子。

Tailwind CSS 前置知識

不要害怕功能類優先的寫法,總體來說它其實和我們傳統的 CSS 寫法沒有什麼不同,如果你會寫 CSS,那就一定很容易上手功能類優先的寫法。

如果你之前使用過 boostrap,那就更容易入手 tailwind 了,你完全可以當成 bootstrap 來寫。

如果你完全不會 CSS,只想找一個元件庫來使用,那麼這篇文章就不適合你了。

安裝

在專案根目錄下開啟終端,輸入

npm install -D tailwindcss@latest

這個命令將在你的 devDependencies 中安裝 tailwindcss,我們只需要在開發時使用這個包,所以確保安裝在你的 devDependencies 中。

安裝 vs code 外掛,推薦

如果你使用的時 vs code 編寫程式碼,那麼我推薦你安裝這個外掛,Tailwind CSS IntelliSense,它會在你開發的時候給你提供樣式輸入的便利。

配置檔案

安裝好後,在終端中輸入命令:

npx tailwindcss init

將在根目錄下幫我們新建一個預設的配置檔案。

配置檔案的內容如下:

module.exports = {
  content: [],
  theme: {
    extend: {},
  },
  plugins: [],
};

也可以手動建立這個檔案。

我們先看這個 content 屬性,這個屬性用來表示我們要用到樣式的原始檔路徑。我們寫入如下的路徑:

module.exports = {
  content: ["./src/**/*.{ts,tsx,jsx,js}"],
  theme: {
    extend: {},
  },
  plugins: [],
};

這樣,我們就告訴了 tailwind:根目錄 src 資料夾下的所有以 ts,tsx,jsx,js 結尾的檔案都會使用 tailwindcss。使用生成 tailwind 生成樣式檔案的時候會參考這些檔案裡的 css 類。

其他的配置我們先不說,等使用到了在說明。

生成樣式檔案

在這個時候我們就已經可以使用 tailwind 來生成樣式檔案了。我們在終端中輸入:

npx tailwindcss -o ./src/styles/tailwind.css

上面的命令用於執行 tailwind 的功能來生成樣式檔案,引數 -o 指定生成的樣式檔案放在什麼地方。執行之後,你應該會看到如下的輸出:

這是因為你還沒有寫任何的 tailwind 功能類,所以也就沒有生成樣式檔案。接下來我們在子元件 Displayer 裡寫功能類,首先先改造 .container 這個類。原來的樣式是這樣的:

// 元件
export function Displayer(/* 省略 */) {
  //  省略
  return (
    <div className="container">
      {/* 省略 */}
    </div>
  );
}

//  css
.container {
  background-color: rgb(40 40 40);
  color: white;
  padding: 0.5rem;
  margin: 0.5rem;
  border-radius: 10px;
}

改為如下寫法:

// 元件
export function Displayer(/* 省略 */) {
  //  省略
  return (
    //  功能類寫法
    <div className="bg-gray-800 text-white p-2 m-2 rounded-lg">
      {/* 省略 */}
    </div>
  );
}

再執行 npx tailwindcss -o ./src/styles/tailwind.css,生成樣式檔案,你會在目錄下看到生成的檔案:

點進入檢視內容,你會看到幫你生成的 css 樣式,除了一些基本樣式之外,在檔案的最下方,會看到我們剛剛使用的功能類樣式:

這也是和 bootstrap 不同的地方,bootstrap 是一次匯入所有的樣式,tailwindcss 是生成你用到的樣式,大大減少了體積。

最後我們在我們的根元件下引入 tailwind.css 這個檔案。

//  main.tsx
import "./styles/tailwind.css";

//  省略

啟動專案後便能夠看到效果了,也是和我們以前一樣:

功能類用法解釋

我們首先用瞭如下幾個功能類:bg-gray-800 text-white p-2 m-2 rounded-lg。如果你用過 bootstrap 的話,那麼你應該對這種寫法很熟悉了。如果沒用過,那麼其實就是普通的 css 類,在 F12 裡檢視樣式,就能看到。tailwind 裡定義了一套常用的類給我們使用,像例子中

  • bg-gray-800 表示背景顏色(background-color)為灰色(gray),800 表示灰色有多濃厚。
  • text-white 表示字型顏色(color)是白色(white)。
  • p-2 表示內邊距(padding)的值為 2,在 tailwind 中是 0.5rem。
  • m-2 表示內邊距(margin)的值為 2,在 tailwind 中是 0.5rem。
  • rounded-lg 表示邊框圓角(border-radius),要多圓?lg 的程度,在 tailwind 中是 0.5rem。

功能類的用法其實直接將我們語義類的用法展開而已。

啟動時的配置

在我們生成樣式檔案的時候是在終端輸入命令來生成的,這樣每次都要敲一遍命令太麻煩了,我們可以把命令修改成

npx tailwindcss -o ./src/styles/tailwind.css --watch

--watch 引數是讓 tailwind 監聽,隨時生成最新的樣式檔案,這樣就不需要時不時手動生成了。

更方便一點,可以將我們的啟動指令碼修改為:

{
//  省略
"scripts": {
    "dev": "run-p dev:*",
    "dev:css": "tailwindcss -o ./src/styles/tailwind.css --watch",
    "dev:server": "vite",
    //  省略
  },
  "devDependencies": {
    //  省略
    "npm-run-all": "^4.1.5",
    //  省略
  }
//  省略
}

我們讓 tailwind 的監聽隨著我們的專案開發啟動而啟動,省去了輸入命令。

這裡我使用了 npm-run-all 這個包,能夠幫我們方便的執行多個指令碼。使用時要記得先安裝,關於用法看文件,在這裡不說明。這樣在我們使用 npm run dev 的時候,就會啟動 tailwind 的監聽和啟動專案的開發伺服器。

修改我們的功能類,你可以看到 tailwind 會自動幫我們生成最新的樣式,方便之極。

有那些功能類可以使用?

基本上只要你能用到的效果,tailwind 都有提供。而且除了基本的樣式之外,tailwind 也封裝了一些常用到的效果,像 ring,這個類用於在元素的周圍加上一圈光環。其他效果具體有什麼還是要去看文件的 tailwind 文件

下面我介紹幾種比較特殊的用法。

變體

tailwind 的變體寫法是用於實現偽類的樣式效果。

比如在我們把滑鼠移動到元素後需要元素改變樣式,我們會使用到偽類 :hover,在 tailwind 裡使用功能類也可以指定應用到偽類,通過新增 hover: 來使關聯的功能類在 hover 時生效。示例如下:

<div className="hover:text-center"></div>

上面的寫法,在 text-center 前加上 hover: 字首,使其應用在了 hover 偽類裡,相當於:

.text-center:hover {
  text-align: center;
}

tailwind 還有許多常用的變體,可在文件 變體 中檢視。

封裝常用樣式

如果多個相同元素的樣式是一摸一樣的,那麼每次都重複編寫功能類就會顯得繁瑣。對這種情況推薦封裝樣式,有以下兩種寫法。

1、 全域性類

通過在專案中額外引入一個全域性的 css 檔案,將可重用的樣式寫在裡面。

新建全域性 css 檔案:

編寫樣式:

/* global.css */
/* 全域性樣式 */
.btn {
  background-color: rgb(81, 81, 206);
  text-align: center;
}

在根目錄中引入:

import "./styles/global.css";

之後便可以直接在元素上使用:

<button className="btn"></button>

2、包裝常用元件

這也是推薦的方式,包裝成一個常用的元件。如下:

//  將常用的 button 樣式封裝到新的元件中
export function Button(props: any) {
  const { children, ...newProps } = props;
  return (
    <button className="bg-gray-300" {...newProps}>
      {children}
    </button>
  );
}

以後便可以用這個元件 <Button>按鈕</Button> 代替原生的 <button>按鈕</button>

參考

Tailwind CSS by Tailwind CSS