Clases y estilos
El atributo class
Al igual que con cualquier otro atributo se pueden agregar clases de forma dinámica con JS
App.svelte
<script>
let flipped = $state(false);
</script>
<button
class="card {flipped ? 'flipped' : ''}"
onclick={() => flipped = !flipped}
>
Clic
</button>
<p>State: {flipped}</p>
Agregar o eliminar una clase en función de alguna condición es un patrón tan común en el desarrollo de interfaces de usuario que Svelte permite pasar un objeto o array que clsx convierte en un string
App.svelte
<script>
let flipped = $state(false);
let otherState = $state(false);
</script>
<button
class={["card", { flipped, "other-class": otherState }]}
onclick={() => flipped = !flipped}
>
Clic
</button>
<p>State: {flipped}</p>
Esto significa
- Añadir siempre la clase
card - Añadir la clase
flippedsiempre que flipped sea verdadero (abreviado deflipped: flipped)
La directiva style
- Al igual que con
class, se pueden escribir los atributosstyleinline
App.svelte
<script>
let flipped = $state(false);
</script>
<button
class="card"
style="transform: {flipped ? 'rotateY(0)' : ''}; --bg-1: palegoldenrod; --bg-2: black; --bg-3: goldenrod"
onclick={() => flipped = !flipped}
>
- Cuando se tienen muchos estilos, es mejor utilizar la directiva
style:para tener un mejor orden - La diferencia es pasar de
style=astyle:
App.svelte
<script>
let flipped = $state(false);
</script>
<button
class="card"
style:transform={flipped ? 'rotateY(0)' : ''}
style:--bg-1="palegoldenrod"
style:--bg-2="black"
style:--bg-3="goldenrod"
onclick={() => flipped = !flipped}
>
Clic
</button>
Estilos en componentes
- El componente recibe los valores como si fuesen atributos
- Sin props
Box.svelte
<div class="box"></div>
<style>
.box {
width: 5em;
height: 5em;
border-radius: 0.5em;
margin: 0 0 1em 0;
background-color: var(--color, #ddd);
}
</style>
- Se pasan los valores como si fuese un atributo del elemento
App.svelte
<script>
import Box from './Box.svelte';
</script>
<div class="boxes">
<Box --color="red" />
<Box --color="green" />
<Box --color="blue" />
</div>
Esta función opera envolviendo cada componente en un elemento con display: contents, donde sea necesario, y aplicándole las propiedades personalizadas.
display: contents no afectará el diseño, pero el elemento adicional puede afectar a selectores como .parent > .child.