Svelte provides ergonomic helpers to conditionally set classes on elements.
There are two ways to set classes on elements: the `class` attribute, and the `class:` directive.
## class
## Attributes
Since Svelte 5.15, you can pass an object or array to the `class` attribute to conditionally set classes on elements. The logic is as follows:
- Primitive: All truthy values are added, all falsy not
- `Object`: All truthy keys are added to the element class
- `Array`: Objects and primitives are handled according to the two previous descriptions, nested arrays are flattened
Primitive values are treated like any other attribute:
```svelte
<!-- These are equivalent -->
<divclass={isCool?'cool':''}>...</div>
<divclass={{cool:isCool}}>...</div>
<divclass={[isCool&&'cool']}>...</div>
<divclass={large?'large':'small'}>...</div>
```
You can use this to conditionally set many classes at once, including those that have special characters.
> [!NOTE]
> For historical reasons, falsy values (like `false` and `NaN`) are stringified (`class="false"`), though `class={undefined}` (or `null`) cause the attribute to be omitted altogether. In a future version of Svelte, all falsy values will cause `class` to be omitted.
Note that whether we're using the array or object form, we can set multiple classes simultaneously with a single condition, which is particularly useful if you're using things like Tailwind.
Arrays can contain arrays and objects, and clsx will flatten them. This is useful for combining local classes with props, for example:
```svelte
<!--- file: Button.svelte --->
<script>
let { children, ...rest } = $props();
let props = $props();
</script>
<!-- rest contains class, and the value is appropriately stringified -->
Under the hood this is using [`clsx`](https://github.com/lukeed/clsx), so if you need more details on the syntax, you can visit its documentation.
## class:
The `class:` directive is a convenient way to conditionally set classes on elements, as an alternative to using conditional expressions inside `class` attributes:
The user of this component has the same flexibility to use a mixture of objects, arrays and strings:
```svelte
<!-- These are equivalent -->
<divclass={isCool?'cool':''}>...</div>
<divclass:cool={isCool}>...</div>
<!--- file: App.svelte --->
<script>
import Button from './Button.svelte';
let useTailwind = $state(false);
</script>
<Button
onclick={() => useTailwind = true}
class={{ 'bg-blue-700 sm:w-1/2': useTailwind }}
>
Accept the inevitability of Tailwind
</Button>
```
As with other directives, we can use a shorthand when the name of the class coincides with the value:
## The `class:` directive
Prior to Svelte 5.15, the `class:` directive was the most convenient way to set classes on elements conditionally.
```svelte
<divclass:cool>...</div>
<!-- These are equivalent -->
<divclass={{cool,lame:!cool}}>...</div>
<divclass:cool={cool}class:lame={!cool}>...</div>
```
Multiple `class:` directives can be added to a single element:
As with other directives, we can use a shorthand when the name of the class coincides with the value: