ข้ามไปยังเนื้อหา

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
// Card.jsx
import 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>
);
}
Svelte
<!-- 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 เป็นศูนย์

Svelte มี shorthand สำหรับการ toggle class ตาม condition — directive class::

React
function Alert({ message, isError }) {
return (
<div className={`alert ${isError ? 'alert--error' : ''}`}>
{message}
</div>
);
}
Svelte
<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 ธรรมดา

ใน Svelte เกิดอะไรขึ้นกับ CSS class name เช่น .card ที่กำหนดไว้ใน <style> block?
"class:error={isError}" ใน Svelte template หมายความว่าอะไร?
React developer ที่คุ้นเคยกับ "import styles from './Card.module.css'" จะใช้ equivalent ใน Svelte อย่างไร?