苗条:指定多个条件类属性

时间:2020-01-28 02:57:22

标签: svelte tailwind-css svelte-3

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

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

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

我知道我可以定义一个whiteTheme和一个darkTheme css类,并使它像那样工作

<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编译器吗?

最佳 约翰内斯

5 个答案:

答案 0 :(得分:3)

您与您的一项提案很接近,但与您想要的相反: class:something={condition}

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

因此,您必须这样做

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

您也可以选择

<script>
 $: whiteThemeClasses = whiteTheme ? "gray text..." : "";
 ...
...class=" fixedclasses {whiteThemeClasses} {blackThemeClasses}

答案 1 :(得分:2)

您可以将亮色和暗色的类列表放入字符串变量中,并根据商店中变量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>

这是工作中的example in the REPL

答案 2 :(得分:0)

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

<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 ...}

一些附加说明:

答案 3 :(得分:0)

您可以执行以下操作:

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

只需遵循本教程here

答案 4 :(得分:0)

这样做:

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

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