10

我想让这样的事情成为可能:

<div 
   class="overflow-scroll h-screen antialiased ..."
   class:whiteTheme="bg-gray-100 text-gray-800 ..."
   class:darkTheme="bg-blue-900 ..."
>
...
</div>

因此,将始终应用一组类。一组仅当whiteTheme为真,另一组仅当darkTheme为真。

我知道我可以定义一个whiteTheme和一个darkThemecss 类并让它像那样工作

<div 
   class="overflow-scroll h-screen antialiased ..."
   class:whiteTheme
   class:darkTheme
>

但关键是我想单独设计每个元素(尤其是在我的应用程序的开始阶段)。并且必须为不同类中的每个元素定义我的类集......对我来说违背了使用 Tailwind.css 和试验特定元素的目的(无需在 css 定义和元素定义之间来回跳转)。

我可以选择的另一种方式是:

<div 
   class="overflow-scroll h-screen antialiased ... {whiteTheme?'bg-gray-100 text-gray-800 ...':'bg-blue-900 ...'}">

这还不错,但我希望通过在单独的属性中定义事物来提高可读性和可维护性......

所以我想知道是否有办法让它按照我想要的方式工作......例如,我可以轻松地扩展 Svelte 编译器吗?

最好的约翰内斯

4

5 回答 5

11

您对您的一项建议很接近,但它与您想要的相反: class:something={condition}

当条件满足时,这将应用something类。

所以在你的情况下你必须做

class:bg-gray-100={whiteTheme}
class:text-gray-800={whiteTheme}

作为替代方案,您可以这样做

<script>
 $: whiteThemeClasses = whiteTheme ? "gray text..." : "";
 ...
...class=" fixedclasses {whiteThemeClasses} {blackThemeClasses}
于 2020-01-28T10:05:13.490 回答
6

您可以将 light 和 dark 的类列表放入字符串变量中,并根据存储中变量 darkTheme 的真实性在具有三元组的变量之间切换,以便它在更改时更新所有组件。

它允许您为浅色和深色主题单独设置每个组件的样式,大大提高了可读性,因为空格分隔的字符串类似于我们过去使用 css 看到的内容,并且您可以将类列表放在顶部每个组件保持可见性/易于访问。

<script>
    let light = 'bg-gray-100 text-gray-800 shadow-xl';
    let dark = 'bg-blue-900 text-white';
    
    import { darkTheme } from './store.js';
</script>

<div class="overflow-scroll h-screen p-3 {$darkTheme? dark : light}" >
...
</div>

编辑:

**这仅适用于 Tailwind 用户,不适用于您仍在尝试有条件地应用多个类的情况。

Tailwind 2 现在通过黑暗课程为我们解决了这个问题。

首先,您需要在文件中手动切换暗模式tailwind.config.js

然后您可以有条件地将暗类应用到单个顶级容器,并且嵌套在其中的所有组件都可以使用暗:类名称,它将应用暗主题。无需传递状态或将带有暗变量的商店导入每个组件。

这是一个使用固定样式表的REPL,因为 Tailwind 2 CDN 不darkMode作为类发布。

于 2020-02-02T09:04:20.557 回答
2

好的,经过更多挖掘后,我决定采用以下模式:

<div 
   class="overflow-scroll 
          h-screen 
          antialiased 
          ... 
          bg-gray-100 
          text-gray-800
          ...
          dark:bg-blue-900
          dark:text-yellow-200
          ..."
>
...
</div>
  • 这对于所有“静态”样式都非常有用。对于像active/selected元素这样的动态事物,我使用样式来解决:
import { darkTheme } from '../stores.js';
...
<div
    class:selected
    class:$darkTheme
...
<style>
.selected {
    // all common styles
    @apply cursor-default;

    // all light styles
    @apply text-blue-600;
    @apply border-blue-600;
}

.selected.\$darkTheme {
    // all dark styles
    @apply text-yellow-700;
    @apply border-yellow-700;
}
</style>

我认为使用样式的较小组件也不错。但是我仍然会发现在 Svelte 中定义自定义任务的可能性很有趣......或者改变了语法,比如class:true/false={my classes ...}

一些附加说明:

于 2020-02-07T01:31:29.367 回答
0

这样做:

className={`block text-sm font-medium leading-5 ${
            dark ? 'text-gray-800' : 'text-gray-300'
          }`}

这只是条件类格式化的一个示例,您可以使用条件和属性样式变量对其进行修改

于 2020-12-22T08:03:38.957 回答
0

你可以这样做:

<h1 class="text-black dark:text-white">Hello world!</h1>

只需在此处遵循本教程!

于 2020-08-25T21:46:20.250 回答