Scoped Styles
ใน React คุณต้อง opt in เพื่อ scope style — CSS Modules, styled-components, Emotion, Tailwind หรือ mechanism อื่น ๆ ใน Svelte การ scope เป็น default ทุก <style> block จะถูก scope อัตโนมัติไปยัง component ของตัวเองตอน compile time คุณเขียน class name ธรรมดาเช่น .card และไม่สามารถรั่วออกไปหรือ conflict กับ component อื่นได้
แนวทางของ React: CSS Modules
หัวข้อที่มีชื่อว่า “แนวทางของ React: CSS Modules”// Card.jsximport styles from './Card.module.css';// .card in Card.module.css becomes .card_abc123 at build time
export default function Card({ title, body }) { return ( <article className={styles.card}> <h2 className={styles.title}>{title}</h2> <p>{body}</p> </article> );}<!-- Card.svelte --><script> let { title, body } = $props();</script>
<article class="card"> <h2 class="title">{title}</h2> <p>{body}</p></article>
<style> /* These class names are scoped to Card.svelte automatically */ .card { border: 1px solid #e2e2e2; border-radius: 8px; padding: 1rem; } .title { margin: 0 0 0.5rem; font-size: 1.25rem; color: #FF3E00; }</style>ภายใต้ hood Svelte compile <style> block โดยเพิ่ม unique attribute (เช่น data-v-abc123) ลงในทุก element และ qualify แต่ละ selector: .card[data-v-abc123] ผลลัพธ์ที่ compile ออกมาปลอดภัยจาก collision เหมือน CSS Modules — แต่คุณเขียน boilerplate เป็นศูนย์
Directive class:
หัวข้อที่มีชื่อว่า “Directive class:”Svelte มี shorthand สำหรับการ toggle class ตาม condition — directive class::
function Alert({ message, isError }) { return ( <div className={`alert ${isError ? 'alert--error' : ''}`}> {message} </div> );}<script> let { message, isError } = $props();</script>
<!-- class:error is added when isError is truthy --><div class="alert" class:error={isError}> {message}</div>
<style> .alert { padding: 0.75rem 1rem; border-radius: 6px; background: #f0f0f0; } .error { background: #fee2e2; color: #b91c1c; border: 1px solid #f87171; }</style>Directive class:name={condition} ทำให้ template ของคุณสะอาด — ไม่มี template literal ไม่ต้องใช้ library clsx/classnames สำหรับ case ธรรมดา