开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

TailwindCSS 技巧

我的整个职业生涯都在涉足CSS。在早期,它相对简单,因为我们的浏览器相当有限。但是这些年来,CSS变得越来越强大,允许样式仅针对标签具有特定的标签属性,仅适用于特定的屏幕尺寸,甚至使用诸如flexbox和grid之类的东西执行复杂的布局。我不时花一点时间来理解这些东西……但因为我不使用CSSa吨,很难跟上。

因此,在过去的十年里,我倾向于使用CSS框架,通常是Bootstrap。每隔几年,就会有一个新的主要版本被删除,我不得不学习新的结构和组件,并努力获得东西以我想要的方式查看。更糟糕的是,当我使用这些框架时,注入自定义CSS通常意味着了解框架已经如何设置组件样式,这样我就可以确保不会发生冲突。

在过去的几年里,我一直在关注TailwindCSS。我一直有点怀疑,因为它的声明式、实用程序优先的方法看起来很像在您的HTML中做CSS,老实说,感觉不对。我通常赞同语义HTML的想法,它提倡将样式与标记分开。直接使用模仿与每个标签关联的CSS指令的样式感觉像是一种邪恶的混合,与语义相去甚远HTML。

然后是炒作。Tailwind的原作者和项目负责人是一个大肆炒作的人,炒作往往会让我失望。这是我的错,而不是他们的错,但在这个行业工作了20多年,我我发现我越来越倾向于打折炒作的产品和项目,因为我看到它们来来去去如此频繁;炒作的数量与项目的长期可行性之间通常存在间接关系。我也经常观察到炒作是用户转移合理批评的一种方式,用户群越激烈,兴趣越小因此,我正在与他们合作。很明显,YMMV,但这绝对是阻止我真正调查Tailwind的原因。

然而,最近,在帮助PHP基金会时,我自愿设置他们的静态网站,并且该团队要求使用TailwindCSS,所以我投入其中。

然后我发现…我有点喜欢它。

这是“我以后会用谷歌搜索这个”的帖子之一。

工作原理

我不会介绍如何开始使用Tailwind;他们的文档为您做了很好的工作。但是,我将快速概述事情是如何工作的,这样您就可以看到(a)我来自哪里,以及(b)您将在什么时候做你从Tailwind开始。

我一直学习使用CSS的方法是先编写HTML,然后编写CSS以按照您希望的方式设置HTML的样式。

<div class="box">
  <h2>Title</h2>
  <p>Some content</p>
</div>

<style>
.box {
  margin: 0.5rem;
  background-color: #333333;
  border: #000000
  padding: 0.5rem;
}

.box h2 {
  background-color: #dedede;
  padding: 0.5rem;
  color: #111111;
  font-size: 2rem;
  min-width: max-content;
}

.box p {
  padding: 0.5rem;
  font-size: 1.2rem;
  min-width: max-content;
}
</style>

Tailwind相反提供了大量的“实用”类,几乎针对每个CSS指令。然后将这些HTML类添加到元素中以设置它们的样式:

<div class="m-2 p-2 bg-neutral-600 border-black">
  <h2 class="min-w-full p-2 bg-neutral-300 text-4xl text-neutral-800">Title</h2>
  <p class="min-w-full p-2 text-xl">Some content</p>
</div>

在后台,您运行TailwindCLI工具,它会分析您的HTML来为您生成CSS。您甚至可以让它监视您感兴趣的文件(模板、JS脚本等)的文件系统更改。,它会自动重新生成CSS。

技巧1:图层

开箱即用,Tailwind会执行CSS重置,删除所有样式。这很棒,因为这意味着您所做的任何更改,您都可以准确预测会发生什么。这也是一种痛苦在屁股上,因为一切都没有样式:你的标题看起来就像你的段落,你的列表看起来就像你的段落,而且没有办法分辨一个段落在哪里结束,另一个段落在哪里开始。

因此,您要做的第一件事就是定义基本样式。Tailwind对在哪里以及如何执行此操作有一个非常具体的建议:在“基本”层中。

打开您的站点CSS文件,您将在开始时看到这些指令:

@tailwind base;
@tailwind components;
@tailwind utilities;

这些中的每一个都是一个Tailwind“层”。Tailwind定义这些以允许根据它们的正常使用方式对项目进行分组,并且在这些层中定义样式允许(a)使用其他实用程序类覆盖它们的能力,以及(b)如果它们从未在您的应用程序中使用过,则能够从CSS文件中剥离它们。

“基础”层应该用于您的基础样式,即CSS重置通常涉及的那些,例如段落、标题、链接、列表等。

在您的声明中,您可以使用一个名为@apply的指令。这允许您使用与在HTML标记中使用的相同的实用程序“类”,这意味着您最终使用创建设计时到处都使用相同的语言。举个例子:

@layer base {
    html {
        @apply font-serif;
    }

    p {
        @apply mb-4 leading-relaxed tracking-wide;
    }

    a {
        @apply underline decoration-1 decoration-dotted transition duration-300;
    }

    a:hover {
        @apply font-semibold decoration-solid;
    }

    h1, h2, h3, h4, h5, h6 {
        @apply font-sans;
    }

    h1 {
        @apply font-bold text-8xl mb-2;
    }

    /* and so on */
}

随着项目的成熟,您可能会注意到您正在使用并在各处重复使用某些样式,并且它们越来越难以记住并始终如一地输入。对我来说,这些是按钮和表单输入之类的东西。像这样的样式去进入你的“组件”层:

@layer components {
    .btn {
        @apply rounded p-2 bg-action-bg border-action-border text-site-bg hover:bg-action-active active:bg-action-active active:text-site-bg transition duration-300
    }

    .text-input {
        @apply w-full mb-4 border-site-bg p-2 rounded bg-site-fg text-site-bg;
    }

    .label {
        @apply block mb-2 font-semibold;
    }

    .textarea {
        @apply w-full mb-4 border-site-bg p-2 rounded-lg bg-site-fg text-site-bg;
    }
}

添加这些允许我使用更简洁的类:

<label class="label" for="email">Email address</label>
<input class="text-input" name="email" type="email" />

仅限类!

“组件”层仅允许类定义!文档顺便提到了这一点,但我的直接假设是我可以在组件层中使用任何CSS选择器。我发现指定元素类型(例如labelinput[type="text"],input[type="email"])不起作用;没有生成样式。一旦我切换到只创建CSS类定义,一切正常。

我相信有人会指出我错了和/或详细说明如何正确地做;在那之前,这是有效的。

仅限类!

“组件”层仅允许类定义!文档顺便提到了这一点,但我的直接假设是我可以在组件层中使用任何CSS选择器。我发现指定元素类型(例如labelinput[type="text"],input[type="email"])不起作用;没有生成样式。一旦我切换到只创建CSS类定义,一切正常。

我相信有人会指出我错了和/或详细说明如何正确地做;在那之前,这是有效的。

但是,有时,使用图层不起作用。

什么时候?

通常,在生成内容时。我遇到的两次问题:

  • 我有通过cronjob或webhook生成的内容,并且HTML不在运行Tailwind时我可以依赖的任何源文件中。
  • 我还有其他内容生成于-the-fly通过JavaScript,这些只生成常规的HTML标签。

对于这些,您在所有层之外创建声明。这样做可确保Tailwind始终在生成的CSS中包含定义,无论它是否找到任何标记和他们在一起。

幸运的是,即使有这些,您也可以继续使用@apply。而且,更好的是,您可以使用任何您想要的CSS选择器,这让您可以根据需要进行指定。

技巧#2使用预处理器

我经常有想要包含的第3方CSS,PrismJS和FontAwesome是典型示例。使用普通CSS甚至预处理器,我可以使用@import将它们包含在内,但Tailwind不会不知道如何自行执行此操作(老实说,不应该这样做)。此外,最小化CSS是获得小幅性能提升的好方法,因为它确保浏览器可以获取更小的文件大小。

幸运的是,您也可以将Tailwind与预处理器一起使用,文档详细介绍了各种预处理器的配置。

我最终选择了PostCSS,因为它几乎没有依赖项,而且设置起来很简单。但是,在这样做的过程中,我不能再只使用TailwindCLI来查看我的CSS,并且需要设置额外的工具.

结果并不难实现。我在本地安装了PostCSS,并在全局安装了PostCSSCLI工具。我还安装了postcss-import插件、autoprefixer和cssnano。我的postcss.config.js最终是这样的:

module.exports = {
  plugins: {
    'postcss-import': {},
    tailwindcss: {},
    autoprefixer: {},
    ...(process.env.IS_PROD ? { cssnano: {} } : {})
  }
}

从那里,我安装了chokidar-cli,并将以下脚本定义添加到我的package.json

"scripts": {
  "dev:css": "postcss css/site.css -o dist/css/site.css",
  "watch": "npx chokidar \"./css/*.css\" \"../templates/**/*.phtml\" \"../src/**/*.phtml\" -c \"npm run dev:css\""
}

这允许我在主动更新标记和样式表以生成我的CSS时运行npmrunwatch

结果

结果对我来说非常惊人。

  • 我能够将我的CSS减少50%。
  • 我能够将我的JS从大约10k减少到不到1k,因为我能够删除jQuery和BootstrapJS
  • 我还减少了模板的整体大小,这让我感到惊讶,因为我生成了更多的HTML类;另一方面是我能够减少我实际使用的标记量(更多内容见下文)。

优缺点

我将从缺点开始,因为老实说,我可以接受它们,尤其是当我考虑到优点时。

缺点

首先,有So。许多。类。在。每一个。元素。

我的意思是,这并不少见:

<a class="block border-t border-mwop-light border-dotted px-2 py-4 no-underline text-sm font-semibold text-mwop-light transition duration-300 hover:bg-mwop-fg hover:text-mwop-bg" href="<?= $this->url('blog') ?>">Blog</a>

是的,它完美地描述了链接在正常和悬停状态下的行为方式,但是天啊。

其次,我仍然需要一个样式表,因为Tailwind有一个非常全面的重置,可以从EVERYTHING.Every中删除所有基本样式。东西。

刚开始时,当您通过浏览器查看时,您无法将一种类型的内容与另一种类型的内容区分开来。它们混合在一起。

所以我有一个定义我的基本样式的样式表,这样段落、标题和列表项之类的东西至少有一些默认的布局和样式。最后,这是一个净“meh”;我假设无论如何我都应该有基本样式,并且至少我确切地知道事物最初是如何设计的,而不是必须补偿不同浏览器如何定义基本样式。只是有点令人不安首先。

第三,我发现自己到处都在重复某些组合。这真的让喜欢坚持DRY原则的我感到厌烦,因为这种重复会导致以后断开连接我在一个地方进行了更改,而忘记了我使用过该组合的无数其他地方。另一方面,这正是组件层的意义所在,一旦我决定喜欢特定的元素样式,我就会发现,我会创建一个使用@apply重新创建它的组件样式,这将允许我在其他任何地方重复使用该样式。但是,你知道......这也带走了Tailwind的基本核心原则,即不惜一切代价避免这种情况。

第四,我觉得你必须有可用的模板来构建你的CSS有点疯狂。我已经做了一段时间的多阶段Docker构建,并且通常构建资产在一个阶段,复制到最终的生产容器中。以前,这可以用最小的方式完成(只复制资产目录到中间容器),但现在我必须复制树中的一堆其他项目到确保CSS构建。这很好,但感觉像是一种反模式。当我需要重新生成它们时,我可能会构建并提交资产,但随后我需要担心不小心将开发构建与生产构建进行对比,我想尽可能避免这种情况。

优点

去掉缺点,我会转向我喜欢的。

首先,更改原型要容易得多,尤其是在我学习了各种实用程序类和大小调整的助记符之后。我会考虑我希望元素看起来像什么,开始输入、保存、刷新页面,然后立即查看结果。

其次,我立即感到惊讶的是,我的生产构建最终减少了大约50%的CSS。Tailwind进行了一些智能优化以仅包含您实际使用的类,这大大减少了CSS大小。

第三,由于实用程序类,我能够将多种屏幕尺寸的样式混合在一起,这意味着我能够摆脱我使用的大部分JS。我最终只需要JS来切换移动导航以及用于显示搜索结果,而用普通Javascript编写这些都是微不足道的。我能够完全摆脱jQuery以及BootstrapJS。

这引出了我的第四点:我的资产构建链中的依赖项要少得多,现在有安全漏洞的依赖项为零。以前,我使用Gulp构建我的CSS和JS,并使用SASS作为预编译器处理器;这是一个荒谬的依赖项,我总是将多个项目安装为Dependabot标记为具有安全漏洞的子依赖项。我能够完全放弃Gulp。我的CSS是使用PostCSS和Tailwind构建的;我的JS太小,不需要专门的构建工具,因此我可以使用非常简单的Makefile来创建我的生产资产。

第五,当我能够转向更好语义HTML结构时,我感到惊喜。Bootstrap本质上是“div汤”,利用div的不同组合来实现布局;使用Tailwind,我能够恢复到语义HTML以实现相同的效果。是的,我有一些非常长的HTML元素类声明,但实际的HTML结构是最小的。我估计我减少了整体HTML结构减少了约30%。

第六,我(通常——参见上面关于添加基本样式和创建组件以减少重复的评论)不再需要在样式表中查找样式来了解元素的外观。类声明用作速记。因此,迭代要容易得多。

第七,我发现我正在学习、应用和理解CSS,尤其是像flexbox和定位这样复杂的东西,比我过去做得更好,主要是因为我直接在结构上应用它。

这引出了我的第八点也是最后一点:即使使用像Bootstrap这样的CSS框架,我也一直在努力获得体面的响应式设计。我很清楚人们在各种设备上查看我的网站(哎呀,我从我自己每天几次从台式机到平板电脑再到手机);可读性的响应式设计在当今世界绝对至关重要。虽然Bootstrap具有响应式断点,但我总是难以理解它们是如何应用的以及何时应用的,并且经常出错。Tailwind的文档在详细说明断点是什么方面做得非常出色,并且,更重要的是,提供了有关如何将不同的断点与CSS类结合起来以实现您的设计的示例。我网站的某些部分在Bootstrap下从未完全响应,因此我可以通过Tailwind轻松完成工作。甚至更多重要:如果你愿意,定义你自己的断点是非常容易的——尽管我真的认为我永远不需要这样做。

离别笔记

最后,我发现自己对这个变化非常满意。

在这个过程中我也意识到:使用像Bootstrap这样的CSS框架......我留下了很多非常非语义的标记,尽管我明确地更喜欢语义HTML。我能够重新创建我以前拥有的样式……然后奇迹般地开始改进和完善它们——由于需要与Bootstrap.Being中预先设想的组件作斗争,我以前基本上没有做过能够完全摆脱这些结构意味着可以更自由地试验和尝试其他布局和设计选项,因为我没有被特定的设计框架所束缚。

那么,向Tailwind致敬。干得好!

未经允许不得转载:我爱分享网 » TailwindCSS 技巧

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏