如何确定 Tailwind Css 的范围

Gue*_*lla 7 tailwind-css

当将 Tailwind CSS 包含在我不希望它全局应用且与自定义构建选项一起工作的系统中时,我找不到一种很好的方法来确定它的范围。

基本上我想这样做:

.tailwind{
    @import "tailwindcss/base";

    @import "tailwindcss/components";

    @import "tailwindcss/utilities";
}
Run Code Online (Sandbox Code Playgroud)

但是 PostCSS 导入器不喜欢这样,因为它在替换顺风占位符之前导入。因此,使其工作的唯一方法是将构建分为 2 个阶段,然后导入已编译的 css,如:

.tailwind{
    @import "tailwindcss.css";
}
Run Code Online (Sandbox Code Playgroud)

它有效,但它破坏了开发工具中显示的一些 css 规则。

有没有更好的方法来确定顺风的范围以阻止它干扰其他系统?

Lan*_*ose 9

从文档中...

前缀选项允许您向所有 Tailwind 生成的实用程序类添加自定义前缀。当将 Tailwind 分层在可能存在命名冲突的现有 CSS 之上时,这非常有用。

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

// tailwind.config.js
module.exports = {
  prefix: 'tw-',
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是这不起作用。所有导致冲突的重置和默认标题值等都没有前缀 (13认同)
  • 我想将该类应用于将具有 tailwind html 的页面/部分。将 tailwind css 全局应用到现有系统会导致许多布局被破坏,因此需要对其进行范围界定。像你这样的前缀类解决了我遇到的具体问题。Tailwind 中的前缀功能并不是这样工作的,它只是为类添加前缀。 (3认同)

Cyr*_*orn 8

您可以通过important在 tailwind 配置中设置您的父类或 id 来实现此目的。请参阅文档

// tailwind.config.js
module.exports = {
  important: '.tailwind',
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎只影响组件实用程序样式......基本样式将不受影响。

  • 不,“important: true”只会将“!important”添加到所有样式中。不过,将“important”值设置为字符串会增加范围。例如,“important: '.tailwind'”会将“.p-10 { ... }”等实用程序转换为“.tailwind .p-10 { ... }”。 (3认同)

KuN*_*KuN 8

我认为这里棘手的部分实际上是关于 preflight/reset.css。您想要阻止外部样式进入您的范围,但也不希望您的顺风样式污染外部系统。

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

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

  2. 构建 html,以便将内容包装在 id 为 的 div 中#app

  3. Tailwind 的important选项似乎没有添加选择器@layer component,因此您必须将其包含在组件样式中。

#app {
  /*content from base.css*/
}
Run Code Online (Sandbox Code Playgroud)


Gue*_*lla 6

按照要求在这里留下我的答案:

我按照兰尼的建议使用了前缀

// tailwind.config.js
module.exports = {
  prefix: 'tw-',
}
Run Code Online (Sandbox Code Playgroud)

然后制作我的顺风 css 文件,如下所示:

    @import "tailwindcss/components";

    @import "tailwindcss/utilities";
Run Code Online (Sandbox Code Playgroud)

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


Luu*_*sen 6

我发现您可以为此使用postcss-nested。安装插件,将它作为第一个插件添加到你的 PostCSS 配置文件中,这应该可以工作:

.tailwind {
    @tailwind base;
    @tailwind components;
    @tailwind utilities;
    @tailwind screens;
}
Run Code Online (Sandbox Code Playgroud)

  • 可悲的是,这不再有效。Tailwind 有一个特定的文件来检测嵌套并吐出:“已检测到嵌套 @tailwind 规则,但不支持。考虑使用前缀来确定 Tailwind 类的范围” (4认同)
  • 这个解决方案在一个小型 Vue 3 应用程序中对我有用,该应用程序被插入到一个更大的网站中。只需将“import 'tailwindcss/tailwind.css'”添加到我的“main.js”中,更改“postcss.config.js”以包含“postcss-nested”插件。添加了 `<style lang="scss">#app {@tailwind base; @tailwind组件;@tailwind实用程序;@tailwind screen;}</style>` 进入我的根目录 `App.vue` (2认同)