Classes and Styles

Class Directive

你可以根據一個值來添加或移除一個元素的 class。

現在這個方式已經不推薦了,建議使用 Class Attributes

<script>
    let active = true;

    function toggle() {
        active = !active;
    }
</script>

<button type="button" class="button {active ? 'active' : ''}" on:click={toggle}>
    I'm a button
</button>

<style>
    button .active {
        background-color: #ff0;
    }
</style>

你也可以將其拆開成兩個屬性:

<button type="button" class="button" class:active on:click={toggle}> I'm a button </button>

如果變數的名稱與 class 的名稱相同,你可以使用 class:active 來簡化:

<button type="button" class="button" class:active on:click={toggle}> I'm a button </button>

Class Attributes

Svelte 在 5.16 加入了 Class Attributes 這個新功能, 你可以在 class 中使用 Object 或是 Array,然後根據條件動態調整 Class Name。

如果你有多個 Class Name 需要根據條件動態調整。 過去使用 Class Directive 可以這樣寫。

<button
    type="button"
    class="button"
    class:active
    class:bg-green-500={active}
    class:deactive={!active}
    class:bg-gray-200={!active}
    on:click={toggle}
>
    I'm a button
</button>

上面的寫法可以改為使用 Class Attributes 來精簡。

<button
    type="button"
    class={{
        button: true,
        "active bg-green-500": active,
        "deactive bg-gray-200": !active,
    }}
    on:click={toggle}
>
    I'm a button
</button>

上面的寫法是使用 Object,如果要使用 Array 也可以。

<button
    type="button"
    class={[true && "button", active && "active bg-green-500", !active && "deactive bg-gray-200"]}
    on:click={toggle}
>
    I'm a button
</button>

我個人認為 Object 寫法較為好懂。

Style Directive

同樣的方式也可以使用在 style 上:

<script>
    let isRed = true;
</script>

<div style="color: {isRed ? 'red' : ''}">This will be red</div>

<div style:color={isRed ? "red" : ""}>This will be red too</div>

Component Styles

你可以傳入一個 CSS 變數來設定元件的樣式:

<!-- App.svelte -->
<Box --color="red" />
<!-- Box.svelte -->
<div class="box" />

<style>
    .box {
        width: 5em;
        height: 5em;
        border-radius: 0.5em;
        margin: 0 0 1em 0;
        /* 這裡接收外部傳入 Box component 的 CSS 變數 --color */
        background-color: var(--color, #ccc);
    }
</style>