• home > webfront > style > css >

    TailwindCSS弃坑血泪史

    Author:zhoulujun Date:

    ​Tailwind 适合的是新生代的公司,比较适合项目工程较大(页面多)、有标准化设计(色卡、字体、sizing、layout)、重复率高、页面结构较简单的项目。总结就是写起来爽,读起来累,维护痛苦

    Tailwind适合什么场景

    Tailwind 适合的是新生代的公司,还没有自己的设计体系,要从零开始做一套自己的。这时候 Tailwind 的优势就出来了:你还没有自己的组件对吧?那你要用更小颗粒度的东西先搭出来通用组件吧?这个更小颗粒度的东西到底是什么呢?就是 HTML 元素和 CSS 样式了。

    所以 Tailwind 比较适合项目工程较大(页面多)、有标准化设计(色卡、字体、sizing、layout)、重复率高、页面结构较简单的项目

    img_v3_02g0_6ee7a8aa-bb75-4b16-a1ac-0d219fbc103g.jpg

    那我为什么建议弃坑呢?


    className太长

    tailwindcss 的初印象给人的感受并不是很好,冗长的 class 名一看就感觉代码会很糟心。

    一条属性一句代码,必然会导致某些元素 class 名会非常长冗长。

    当然,你会说,有n种方法可以避免,因为深度审视这个痛点,它并不存在!

    class 名提

    下面有一段代码,我们写了一大堆 className

    <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'

    当然,我们也可以直接封装逻辑更复杂的组件

    @apply聚合

    在技术手段上,我们可以继续在 css 中运用 tailwindcss。通过这种方式将许多 css 样式聚合成一个 class 名。tailwind 支持一种 @apply 语法来干这个事情,代码如下

    .btn {
      @apply rounded-md border border-solid border-transparent py-2 px-4 text-sm font-medium bg-gray-100
        cursor-pointer transition
    }

    但是这种方式和直接使用 css有啥区别?

    twMerge, clsx, cva

    className 的书写顺序并不能决定元素样式的优先级,它们的优先级跟 css 的声明顺序有关系,所存在大量的默认样式覆盖再覆盖的问题

    tailwindcss 专门提供了一个方法来处理这个问题,这个方法就是 twMerge

    twMerge('px-2 py-1 bg-red hover:bg-dark-red', 'p-3 bg-[#B91C1C]');
    // 返回结果:'hover:bg-dark-red p-3 bg-[#B91C1C]'

    所以日常组件会这样子

    export default function Button(props) {
      const {className, primary, danger, sm, lg, success, ...other} = props
      const base = 'rounded-xl border border-transparent font-medium cursor-pointer transition'
    
      // type
      const normal = 'bg-gray-100 hover:bg-gra
    
      // size
      const md = 'text-sm py-2 px-4'
      
      const cls = twMerge(clsx(base, normal, md, {
        // type
        ['bg-blue-500 text-white hover:bg-blue-600']: primary,
        ['bg-red-500 text-white hover:bg-red-600']: danger,
        ['bg-green-500 text-white hover:bg-green-600']: success,
    
        // size
        ['text-xs py-1.5 px-3']: sm,
        ['text-lg py-2 px-6']: lg,
      }))
    
      return (
        <button className={cls} {...other}>{props.children}</button>
      )
    }

    但是,这个不费脑么?《 BEM/OOCSS/SMACSS/ITCSS、CSS Modules、CSS-in-JS》哪里不爽了?

    Bootstrap 画一个按钮:

    <button type="button" class="btn btn-primary">Primary</button>

    Tailwind:

    <button class="w-1/2 flex items-center justify-center rounded-md border border-gray-300" type="button">Add to bag</button>

    一大行看起来更加恶心,如果太多又要手动定义,最后又类似css了,那还不如一开始就用css

    tailwindCSS垃圾Tailwindcss 垃圾

    更加验证的是,所谓的语义化

    比如outline-black、outline-white、border-black……这类本身就不是啥语义化,比如暗黑模式,颜色就是反的,你样式名该不该。

    主题色改变了,语义化怎么办?


    但是,外包可以class= 写三四行,平时项目忙的时候,你哪有那么多时间来做CodeReview?

    v2-3b2815b8502aceac0c00aae7ffbd2579_720w.webp

    写起来爽,读起来累,维护痛苦


    转载本站文章《TailwindCSS弃坑血泪史》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/style/cssBase/2024_1025_9301.html