給我一個(gè)你不用tailwindcss的理由!

封面圖

原由 & 前言

  • 如果你沒有聽說過tailwindcss盗似,請(qǐng)先return哩陕,本篇不談?wù)?code>tailwindcss是什么怎么用,而是怎么優(yōu)雅的使用。
  • 如果你聽說過悍及,請(qǐng)繼續(xù)閱讀并考慮使用tailwindcss闽瓢,因?yàn)榭赐曛螅?
    • 開發(fā)上:可能為你甚至你們的前端團(tuán)隊(duì)節(jié)省很多寫樣式的時(shí)間,也能讓你或者你們的項(xiàng)目開發(fā)體驗(yàn)有很大提升
    • 生產(chǎn)上:你們的項(xiàng)目打出來的包體積中的樣式代碼占比將突然驟降然后趨于不變心赶。

你真的需要css預(yù)處理器嗎

可能大多數(shù)同學(xué)在開發(fā)或者維護(hù)一個(gè)項(xiàng)目的時(shí)候扣讼,項(xiàng)目中應(yīng)該都使用了諸如scssless缨叫、stylus...等css預(yù)處理語言椭符,甚至有的單個(gè)項(xiàng)目中使用了多種預(yù)處理語言,可能是為了使用變量耻姥,可能是為了復(fù)用樣式方便销钝,也可能是為了寫一些函數(shù)方便我們對(duì)一些樣式值做一些處理,但是大部分時(shí)候我們是為了可以寫嵌套樣式琐簇,總之是為了提高我們的開發(fā)效率蒸健,這一切在tailwindcss出現(xiàn)之前都是那么的美好,直到我們遇到了tailwindcss鸽嫂,你會(huì)發(fā)現(xiàn)你甚至連stylelint都不需要配置纵装,因?yàn)槟憧赡芨静挥脤?code>css

How & Which Version

tailwindcss v2 vs v3

如果你的項(xiàng)目需要兼容IE,請(qǐng)使用v2版本据某,如果不需要請(qǐng)果斷上v3版本

具體如何在你的項(xiàng)目中使用tailwindcss,請(qǐng)務(wù)必查看官網(wǎng)文檔v2中文 v3English诗箍,推薦基于postcss來添加

安裝vscode插件

如果你決定使用tailwindcss癣籽,安裝bradlc.vscode-tailwindcss這個(gè)官方提供的插件,可以提供提示滤祖、補(bǔ)全筷狼、查看實(shí)際設(shè)置的樣式的能力

配置你的tailwind

如果你已經(jīng)按照文檔教程創(chuàng)建了tailwind.config.js文件,那么接下來我們要對(duì)這個(gè)文件進(jìn)行進(jìn)一步的配置

PC端項(xiàng)目

如果你的項(xiàng)目是只針對(duì)PC端網(wǎng)頁的匠童,可能你只需要問你們的設(shè)計(jì)同學(xué)你們項(xiàng)目中的一些基礎(chǔ)的設(shè)計(jì)原則有哪些埂材,比如會(huì)使用的一些主題顏色字體大小汤求、梯度俏险、內(nèi)外邊距大小、梯度扬绪,常用的邊框圓角大小竖独、梯度邊框?qū)挾燃放!⑻荻?/strong>莹痢,如果設(shè)計(jì)同學(xué)沒有這些原則,就協(xié)商一下這些基本原則,比如都會(huì)用到哪些顏色啊竞膳,邊距單位一般按照4px的倍數(shù)來設(shè)置啊……

顏色

如果設(shè)計(jì)同學(xué)提供了項(xiàng)目中的主題色航瞭,并且有語義化的名稱,比如類似success坦辟,info沧奴,warning這種語義化的顏色,我們就可以基于這些來配置我們的顏色长窄,包括但不限于字體滔吠、背景、邊框挠日、陰影顏色(配置完之后直接可以使用類似text-success的類來設(shè)置顏色)疮绷,可以替換css預(yù)處理器的變量功能

// tailwindcss v3
const colors = {
  'success': '#654321',
  'info': '#123456',
  'warning': '#666666',
  // ...
}
module.exports = {
  content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
  theme: {
    // ...
    colors,
  },
  plugins: [],
}
// tailwindcss v2
const colors = {
  'success': '#654321'嚣潜,
  'info': '#123456',
  'warning': '#666666',
  // ...
}
module.exports = {
  content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
  theme: {
    // ...
    textColor: colors,
    backgroundColor: colors,
    borderColor: colors,
  },
  plugins: [],
}

v2v3版本的設(shè)置有些許區(qū)別冬骚,v2具體的設(shè)置什么類別的顏色需要特別指定。

間距 & 寬高 & 行高 & 圓角 & 邊框?qū)挾?/h3>

因?yàn)?code>tailwindcss默認(rèn)長(zhǎng)度相關(guān)的配置是基于rem的懂算,而PC端的項(xiàng)目大多數(shù)時(shí)候我們都是固定一個(gè)寬度只冻,左右留白,所以大多數(shù)情況下计技,設(shè)計(jì)稿都會(huì)在固定一個(gè)寬度內(nèi)喜德,元素的大小寬高邊距單位都是px,所以我們需要對(duì)默認(rèn)的做一些特定配置來適配我們的項(xiàng)目

const spacing = {
  0: 0,
  4: '4px',
  8: '8px',
  12: '12px',
  // ... 項(xiàng)目中常用的都可以配置
}
module.exports = {
  content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
  theme: {
    // v3 & v2
    spacing,
    lineHeight: spacing,
    borderWidth: spacing,
    borderRadius: spacing,
  },
  plugins: [],
}

移動(dòng)端適配方案

可能對(duì)于移動(dòng)端適配垮媒,現(xiàn)在流行的就是viewport方案了舍悯,也可能有的項(xiàng)目還在用flexable方案,但是我們又不想手動(dòng)換算pxremvw睡雇,雖然社區(qū)也有類似pxtorem或者pxtovw這種postcss的插件萌衬,但解決問題的方法還是不夠優(yōu)雅,可能是因?yàn)椴寮木S護(hù)的不積極它抱,可能是插件不好用秕豫,不兼容postcss8(pxtovw說的就是你??),既然我們都有tailwindcss了观蓄,那就讓這些配置變的更簡(jiǎn)單一些吧混移!如果你們?cè)O(shè)計(jì)同學(xué)提供了常用的間距方案,比如4px的倍數(shù)或者6px的倍數(shù)蜘腌,現(xiàn)在假設(shè)設(shè)計(jì)同學(xué)的設(shè)計(jì)稿都是750px的沫屡,我們就可以基于此來寫兩個(gè)函數(shù)方法來處理pxtorempxtovw的任務(wù),如果你們是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: [],
}

當(dāng)然圓角大小金矛,邊框?qū)挾鹊榷伎梢赃@么配置,是不是比使用插件優(yōu)雅多了

嵌套語法

有的同學(xué)可能對(duì)css預(yù)處理器的嵌套語法情有獨(dú)鐘勺届,tailwindcss里面可以嗎驶俊?安排!
tailwindcss有一個(gè)插件叫@tailwindcss/nesting免姿,基于官網(wǎng)的一些配置饼酿,需要注意的是文檔上的是給postcss配置tailwindcss/nesting,實(shí)際上需要配置@tailwindcss/nesting,然后就可以基于css提供嵌套的能力,試試唄~

固定行數(shù)后截?cái)?/h1>

有時(shí)候我們會(huì)為了寫一個(gè)文本在x行之后階段并顯示...要寫好幾行樣式代碼鹿驼,所以我們通常會(huì)定義一個(gè)這樣的scss工具函數(shù)

@mixin ellipsis($line: 1, $substract: 0) {
    @if $line==1 {
        white-space: nowrap;
        text-overflow: ellipsis;
    } @else {
        display: -webkit-box;
        -webkit-line-clamp: $line;
        -webkit-box-orient: vertical;
    }
    width: 100% - $substract;
    overflow: hidden;
}

tailwindcss對(duì)于這種特殊情況提供了專有的插件@tailwindcss/line-clamp,只需要安裝一下药版,然后在tailwind.config.js中的plugins中引入即可

安裝插件

npm install -D @tailwindcss/line-clamp

配置

// tailwind.config.js
module.exports = {
  // ...
  plugins: [
    require('@tailwindcss/line-clamp'),
  ],
}

使用

<div class="line-clamp-3">
  <!-- ...3行后截?cái)?-->  
<div>

多主題

可能你維護(hù)的是一個(gè)需要支持多主題的項(xiàng)目,不同的情況下有多種配色方案喻犁,在tailwindcss中配合css var來實(shí)現(xiàn)多主題配色會(huì)簡(jiǎn)單到讓你窒息:

在你的全局css文件中配置主題槽片,假設(shè)我們有successinfo肢础、warning這三種不同的主題配色

/* global base css */
@tailwind base;
@tailwind components;
@tailwind utilities;
// 默認(rèn)主題
:root {
  --success: 5 193 174;
  --info: 51 163 238;
  --warning: 237 214 18;
}
// 主題1的配色
.theme-1 {
  --success: 36 195 102;
  --info: 54 143 255;
  --warning: 234 209 27;
}
// 主題2的配色
.theme-2 {
  --success: 57 209 121;
  --info: 0 186 255;
  --warning: 234 209 27;
}

然后到我們的tailwind.config.js中改變我們的顏色配置

// 讓我們的顏色支持透明度設(shè)置
function withOpacityValue(variable) {
  return ({ opacityValue }) => {
    return opacityValue === undefined
      ? `rgb(var(${variable}))`
      : `rgb(var(${variable}) / ${opacityValue})`
  }
}

const colors = {
  success: withOpacityValue('--success'),
  info: withOpacityValue('--info'),
  warning: withOpacityValue('--warning'),
  // ...
}
module.exports = {
  content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
  theme: {
    // ...
    colors,
  },
  plugins: [require('@tailwindcss/line-clamp')],
}

最后根據(jù)不同的情況設(shè)置你的主題还栓,對(duì)要設(shè)置的主題的頂級(jí)元素設(shè)置對(duì)應(yīng)的class即可,內(nèi)部的所有顏色樣式都會(huì)對(duì)應(yīng)特定的主題而改變传轰!

<!-- 默認(rèn)主題 -->
<div>
  <!-- ... -->
</div>
<!-- 主題1 -->
<div class="theme-1">
  <!-- ... -->
</div>
<!-- 主題2 -->
<div class="theme-2">
  <!-- ... -->
</div>

一些最佳實(shí)踐

  • 如果某些元素樣式特別復(fù)雜剩盒,導(dǎo)致html代碼很長(zhǎng)很亂怎么優(yōu)化?你可以通過tailwindcss提供的@apply指令將一系列樣式通過一個(gè)語義化的類表現(xiàn)出來
<div class="complex-node">xxxx<div>

// ...
<style>
.complex-node {
  @apply flex m-3 text-success rounded ....;
}
</style>
  • 我有一些樣式是全局通用的路召,比如按鈕勃刨,卡片的一些樣式,我該怎么維護(hù)股淡?你可以通過tailwindcss提供的@layer指令將比較通用的樣式layercomponents層,作為組件級(jí)別的樣式廷区,從而可以達(dá)到全局復(fù)用的目的
@layer components {
  .btn-blue {
    @apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded;
  }
}
  • 我的項(xiàng)目是多人維護(hù)的唯灵,我如何保證原子化的樣式類名稱有一個(gè)比較合理的順序呢?比如你喜歡先寫寬高然后寫定位隙轻,但是你的同事跟你相反埠帕,如何制定一個(gè)規(guī)范呢?tailwindcss提供了一個(gè)prettier插件prettier-plugin-tailwindcss玖绿,可以通過安裝插件并且配置保存后更新即可規(guī)范不同成員寫樣式類的格式化問題
npm install -D prettier prettier-plugin-tailwindcss

新建一個(gè)配置文件.prettierrc.json鍵入{}根據(jù)你們項(xiàng)目的原有配置進(jìn)行配置敛瓷,如果是個(gè)人項(xiàng)目也可以根據(jù)你個(gè)人喜好進(jìn)行配置,然后在vscode中安裝esbenp.prettier-vscode這個(gè)插件斑匪,然后打開你的設(shè)置搜索format呐籽,將Format On PasteFormat On Save都勾選上,就可以在保存完之后自動(dòng)對(duì)你的樣式類的順序進(jìn)行排序,排序的規(guī)則默認(rèn)是根據(jù)css box model從外到內(nèi)的規(guī)則進(jìn)行排序的:

margin - border - padding - content

總結(jié)

只是針對(duì)平時(shí)筆者使用到的部分對(duì)tailwindcss的能力進(jìn)行了一些淺談狡蝶,其實(shí)還有很多能力都沒有說到庶橱,比如v3提供的一些針對(duì)打印頁面的樣式,hover贪惹、active苏章、偽類等的一些設(shè)置,其實(shí)也比較簡(jiǎn)單奏瞬,具體使用的時(shí)候看下官方文檔就可以了枫绅。可能有部分小伙伴也會(huì)吐槽tailwindcss有很多基礎(chǔ)類的名稱需要記憶硼端,其實(shí)也不多并淋,熟能生巧,都是一勞永逸的東西显蝌。如果你也有不錯(cuò)的配置方案或者最佳實(shí)踐也可以在評(píng)論區(qū)告訴我预伺。最后,有用請(qǐng)點(diǎn)贊曼尊,喜歡請(qǐng)關(guān)注酬诀,我是Senar(公號(hào)同名),謝謝各位骆撇!

往期內(nèi)容

前端開發(fā)的基礎(chǔ)生產(chǎn)力素養(yǎng)(后期不定期更新)

記一次在老掉牙的Vue2項(xiàng)目中引入TypeScript和組合式Api和vueuse來改善大家伙的開發(fā)體驗(yàn)的艱辛歷程

各位frontend developer們瞒御,時(shí)機(jī)已經(jīng)成熟,讓我們開始用上pnpm吧

一文讓你徹底會(huì)用對(duì)象存儲(chǔ)OSS的前端直傳神郊,不懂就再看一遍k热埂(bushi)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涌乳,隨后出現(xiàn)的幾起案子蜻懦,更是在濱河造成了極大的恐慌,老刑警劉巖夕晓,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宛乃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蒸辆,警方通過查閱死者的電腦和手機(jī)征炼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躬贡,“玉大人谆奥,你說我怎么就攤上這事》鞑#” “怎么了酸些?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵宰译,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我擂仍,道長(zhǎng)囤屹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任逢渔,我火速辦了婚禮肋坚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肃廓。我一直安慰自己智厌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布盲赊。 她就那樣靜靜地躺著铣鹏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哀蘑。 梳的紋絲不亂的頭發(fā)上诚卸,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音绘迁,去河邊找鬼合溺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛缀台,可吹牛的內(nèi)容都是我干的棠赛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼膛腐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼睛约!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哲身,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤辩涝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勘天,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膀值,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年误辑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歌逢。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巾钉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秘案,到底是詐尸還是另有隱情砰苍,我是刑警寧澤潦匈,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站赚导,受9級(jí)特大地震影響茬缩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吼旧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一凰锡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧圈暗,春花似錦掂为、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寸齐,卻和暖如春欲诺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渺鹦。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工扰法, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人海铆。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓迹恐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親卧斟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子殴边,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容