如何使用Tailwind Css进行样式定义

33

我找不到一种在将Tailwind CSS包含到一个系统中并且不想全局应用时适用于自定义构建选项的好方法。

本质上,我想要做到这一点:

.tailwind{
    @import "tailwindcss/base";

    @import "tailwindcss/components";

    @import "tailwindcss/utilities";
}

但是PostCSS导入器不喜欢这样做,因为它会在替换tailwind占位符之前进行导入。所以唯一的方法是将构建分为两个阶段,然后像这样导入已编译的css:

.tailwind{
    @import "tailwindcss.css";
}

它能够工作,但会破坏某些在开发者工具中显示的CSS规则。

有没有更好的方法来限定Tailwind,以防止其干扰其他系统?

9个回答

17
我发现你可以使用postcss-nested来完成这个任务。安装这个插件,将其添加为PostCSS配置文件中的第一个插件,这样应该就能实现:
.tailwind {
    @tailwind base;
    @tailwind components;
    @tailwind utilities;
    @tailwind screens;
}

2
这个解决方案适用于我在一个小的Vue 3应用程序中,该应用程序被插入到一个更大的网站中。只需将 import 'tailwindcss/tailwind.css' 添加到我的 main.js 中。更改 postcss.config.js 以包括 postcss-nested 插件。在我的根 App.vue 中添加 <style lang="scss">#app {@tailwind base; @tailwind components; @tailwind utilities; @tailwind screens;}</style> - Chuck Taylor
4
不幸的是,这已经不再起作用了。Tailwind有一个特定的文件来检测嵌套并输出:“检测到嵌套的@tailwind规则,但不被支持。 考虑使用前缀来限定Tailwind的类”。 - TvE

9

来自官方文档...

prefix选项允许你为所有Tailwind生成的工具类添加自定义前缀。当在现有的CSS上加入Tailwind时可能存在命名冲突时,这将非常有用。

例如,你可以通过设置prefix选项来添加tw-前缀:

// tailwind.config.js
module.exports = {
  prefix: 'tw-',
}

12
很遗憾,这并不起作用。所有导致冲突的重置和默认标题值等都没有前缀。 - Guerrilla
3
我希望您能将该类应用于将拥有Tailwind HTML的页面/部分。全局应用Tailwind CSS会导致许多布局出现问题,因此需要进行作用域限制。像您展示的前缀类可以解决我的具体问题。但Tailwind中的前缀功能不是这样工作的,它只是给类添加前缀。 - Guerrilla
1
你只是遇到了预检查出错的问题吗(像输入框等重置的问题)?也许你可以去这里:https://github.com/tailwindlabs/tailwindcss/blob/2b0b306a77cc0f34cd25054a0d661a18278786bc/src/plugins/css/preflight.css - Lanny Bose
1
...并将预检内容复制粘贴到您的CSS中,而不是使用@import "tailwind/base"?这只是200行不那么有趣的CSS。我知道这很脆弱,但它不太可能成为活跃开发领域。 - Lanny Bose
使用自定义基础是最佳解决方案,并且运行良好。 - Guerrilla
显示剩余3条评论

8

我认为这里的棘手之处实际上是关于预先设置/重置.css文件。你想要防止外部样式影响到你的范围,但又不想用Tailwind样式污染外部系统。

我的当前设定包括以下步骤:

  1. tailwind.config.js 中,我们禁用prefight,在选项important中定义前缀tw-,并添加一个额外的选择器#app。最后一项更改将在输出中添加一个额外的CSS选择器,例如:#app .tw-mb-4
module.exports = {
  important: '#app',
  prefix: "tw-",
  corePlugins: {
    preflight: false,
  },
  1. 在将base.css从node_modules文件夹中找到并复制内容之前,请使用父选择器#app将其粘贴到scss文件中。您可以使用任何在线SCSS编译器进行编译。这将帮助您仅在范围内重置样式。
#app {
  /*content from base.css*/
}
  1. 复制 #2 编译后的样式,粘贴到你的 Tailwind CSS 文件开头

  2. 在 HTML 中,将你的内容包裹在一个 id 名为#app的 div 元素中。

  3. Tailwind 的 important 选项似乎不会在 @layer component 中添加选择器,因此你需要在组件样式中包含它。

@layer components {
    #app .page-h1 {
        @apply tw-mt-0 tw-mb-2 tw-text-center tw-leading-8 tw-text-4xl md:tw-text-5xl;
    }
}

6

按照要求,我的回答如下:

我使用了Lanny建议的前缀。

// tailwind.config.js
module.exports = {
  prefix: 'tw-',
}

然后我按照以下方式编写了我的 tailwind css 文件:

    @import "tailwindcss/components";

    @import "tailwindcss/utilities";

然后我手动将想要的任何基础样式复制到我的主css文件中,并手动更改任何冲突的内容。


后者对我非常有用——tailwind布局的简写很好,但我并不总是想覆盖基本标记! - Colin Ricardo
在所有这些解决方案中,这个也对我起作用。关键是tailwind基础样式为一些全局组件提供了样式,所以将其移除可以解决我遇到的问题。 - undefined

6

您可以通过在tailwind配置文件中设置important到您的父类或ID来实现这一点。请参见文档

// tailwind.config.js
module.exports = {
  important: '.tailwind',
}

不幸的是,这似乎只影响了组件实用样式... 基础样式将保持不变。


你的意思是 important: true 吗?这会将 important 添加到所有属性中,但对于作用域尾风没有任何帮助。这只会让情况变得更糟。 - Guerrilla
3
不,important: true 只会在所有样式中添加 !important。但是,将 important 值设置为字符串将添加作用域。例如,important: '.tailwind' 将把 .p-10 { ... } 这样的实用程序转换为 .tailwind .p-10 { ... } - Cyrus Korn
100%正确,良好的知识分享,谢谢兄弟 @CyrusKorn - Amir Rahman

3
根据文档

如果您想完全禁用Preflight - 可能是因为您正在将Tailwind集成到现有项目中或者因为您想提供自己的基本样式 - 您需要在tailwind.config.js文件的corePlugins部分中将preflight设置为false。

这似乎适用于WordPress管理界面,但确实删除了标准化,例如按钮悬停时的cursor: pointer。

1
我所做的是这样的。
module.exports = {
      prefix: 'tw-',
      content: [
        "./src/**/*.{html,ts}",
      ],
      theme: {
        extend: {},
      },
      purge: {
        enabled: true,
        content: ['./src/**/*.{html,ts}']
      },
      plugins: [],
      corePlugins: {
        preflight: false,
      }
    }

这将减小构建大小,因为我已经清除了 CSS,禁用了全局 CSS,因为我使用了预飞检,现在如果您想应用 tailwind 类,请使用

<div class="tw-m-4"></div>

由于我们使用了tw作为前缀


1

0

2023年使用Javascript / Typescript的自定义解决方案

注意:本答案适用于那些确实需要通过CSS选择器来限定Tailwind样式,而不能使用Tailwind配置中的前缀或important特性的人。此外,本答案还涵盖了使用Javascript将CSS导入到应用程序的场景。

基于事实,Vite / Tailwind在构建过程中阻止了对@Luud Janssen方法的支持,会记录下面的文本:

Nested @tailwind rules were detected, but are not supported. Consider using a prefix to scope Tailwind's classes...

我在花了几个小时尝试使用postcss却没有成功后,想出了下一个想法。我没有改变postcss配置文件或vite配置文件中的任何内容。
我的项目是基于Vue3 + Vite构建的,所以基本上我是在入口TS文件(通常是main.ts)中导入根tailwind.css文件。所需的依赖是sass
步骤
1.
请删除这个导入语句,然后转到您应用程序的根组件(通常是App.vue)并从sass库中导入tailwind文件和compileString函数。
import tailwindFile from '@/core/assets/tailwind/tailwind.css?inline';
import { compileString } from 'sass';

Vue建议在组件内部导入静态CSS文件时使用?inline。
2.
之后,在组件的设置脚本中执行:
const tailwindScoped = compileString(`.scope { ${tw} }`).css;

现在,在tailwindScoped变量中,有一个包含作用域tailwind类的字符串,同时也支持清除和自定义类。

3.

最后,我在模板中使用它在style HTML标签中。顺便说一下,Vue禁止使用该标签,所以还有一个解决方法来实现这个:

<component :is="'style'">
  {{ tailwindScoped }}
</component>

我知道这不是最好的方法,而且还会影响性能,但我找不到其他的办法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接