如何使用 Tailwind CSS 创建多个主题?

Posted

技术标签:

【中文标题】如何使用 Tailwind CSS 创建多个主题?【英文标题】:How to create multiple themes using Tailwind CSS? 【发布时间】:2021-11-08 01:15:41 【问题描述】:

查看 Tailwind CSS,您似乎需要在类中指定特定颜色,如下所示:

<div class="bg-yellow-200 dark:bg-gray-800"></div>

但是,如果我想提供 10 种不同的主题供用户在我的网络应用程序中选择怎么办?就像我可能有 halloweensummerwinterparty 等主题。

我知道使用常规 CSS 很容易做到这一点:

[data-theme="halloween"] 
    --color-bg: #000;
    --color-body: #757981;


<body data-theme="halloween"></div>

然后使用 javascript,我可以更改 data-theme 属性,然后主题就会改变。

但是我怎么能用 Tailwind CSS 做到这一点呢?我在文档中找不到任何关于此的内容。

【问题讨论】:

您尝试过文档吗? tailwindcss.com/docs/theme @Quentin 我看到它只讨论如何配置默认主题而不是如何添加更多主题。 不幸的是,它似乎并不像在配置中添加主题那么简单。似乎this answer 可能会为您指明正确的方向。它建议使用插件为使用定义主题的 CSS 变量的类名添加前缀。 【参考方案1】:

我确实找到了使用 CSS 变量的解决方案。

在您的 css 文件中,您可以像这样为每个主题定义样式

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

@layer base 
    [data-theme="default"] 
        --color-esther: 34, 39, 46;
        --color-maximus: 45, 51, 59;
        --color-linx: 55, 62, 71;
    

    [data-theme="neon"] 
        --color-esther: 20, 61, 42;
        --color-maximus: 13, 82, 66;
        --color-linx: 20, 82, 11;
    


然后在您的tailwind.config.js 文件中,您可以像这样定义它们

const colors = require("tailwindcss/colors");

function withOpacity(cssVariable) 
    return ( opacityValue ) => 
        return `rgba(var($cssVariable), $opacityValue)`
    


module.exports = 
    //...

    theme: 
        colors: 
            'esther':       withOpacity('--color-esther'),
            'maximus':      withOpacity('--color-maximus'),
            'linx':         withOpacity('--color-linx'),
        ,
    ,

在您的 html 中,您可以像这样使用这些类:

<html lang="en" data-theme="default">
    <body class="bg-esther text-optimus cursor-default">

    </body>
</html>

【讨论】:

这似乎是一个很棒的解决方案,但按照你的步骤我得到--color-esther is not defined imgur.com/a/FnkeB3p @Justin 请提供完整的代码示例,以便我查看一下,看看有什么问题 @MartinZeltin 在基础层添加属性选择器有什么意义?通常它只用于标签选择器【参考方案2】:

只是偶然发现了这个问题,因为我正在做几年前我已经做过的事情,但现在已经不记得了。如果有人再次来到这里,也许这个答案可能会有所帮助。

在我们的例子中,我们正在构建一个应用于 3 个不同网站但明显改变颜色和字体的主题,这似乎与问题作者的情况相同。

为此,可以使用tailwind presets。我有一个tailwind.preset.js,它基本上是带有所有基本颜色、间距等的默认顺风配置。对于每个主题,设置了一个单独的tailwind.&lt;theme-name&gt;.js,其中包含更改并以预设为基础。

例如tailwind.theme-one.js:

module.exports = 
  presets: [
    require('./tailwind.preset.js')
  ],
  theme: 
    colors: 
      # color changes go here
    
  

我们设置了一个 gulp 工作流程,基本上只为每个主题配置呈现一次主 scss 文件。在集成上,然后正在加载所需的主题文件。

【讨论】:

以上是关于如何使用 Tailwind CSS 创建多个主题?的主要内容,如果未能解决你的问题,请参考以下文章

Tailwind/CSS 使用自定义字体

如何从 Tailwind 中拆分生成的 CSS 代码?

Tailwind:配置配置文件后如何访问默认内容?

如何使用 Tailwind CSS 创建类似于 Quora 的居中 3 列布局

使用 Tailwind CSS 创建网格

使用 Tailwind 时如何使用 Webpack 缩小 CSS