การกำหนดธีม
คอมโพเนนต์ของ Lily มี class hook ที่คงที่และไม่มี CSS — ธีมจึงเป็นเพียงสไตล์ชีต บทเรียนนี้พาจาก "ลิงก์ไฟล์เดียว" ไปจนถึง "ให้ผู้ใช้สลับธีมขณะรันไทม์และเก็บค่าไว้"
สิ่งที่คุณจะสร้าง
แอปที่ผู้ใช้เปลี่ยนรูปลักษณ์ทั้งหมดได้ — เริ่มจากสไตล์ชีตที่ลิงก์ไว้หนึ่งไฟล์ ไปจนถึงตัวสลับธีมขณะรันไทม์ที่เก็บค่าไว้ — ภายในประมาณ 15 นาที
ก่อนเริ่ม
ทำให้เสร็จก่อน บทเรียนเฟรมเวิร์ก สำหรับสแต็กของคุณก่อน เพื่อให้มีฟอร์ม Lily เล็ก ๆ ไว้ใส่ธีม ทุกอย่างที่นี่ใช้ได้กับทั้งเจ็ดเฟรมเวิร์ก ตัวอย่างโค้ดแสดงเป็น Svelte และ HTML ล้วน
ขั้นที่ 1 — ลิงก์ธีมสำเร็จรูป
themes/ ไดเรกทอรีมีสไตล์ชีตแบบแยกอิสระ 45 ไฟล์ คัดลอกเข้าไปในสินทรัพย์สแตติกของแอปแล้วลิงก์หนึ่งไฟล์:
<link rel="stylesheet" href="/assets/themes/united-kingdom-national-health-service-england-for-patients.css" />
จุดเด่นของชุดนี้:
-
ภาครัฐ — NHS England / Scotland / Wales แต่ละแห่งมีแบบสำหรับผู้ป่วยและสำหรับผู้ปฏิบัติงาน; GOV.UK (
united-kingdom-government-digital-service); USWDS (united-states-web-design-system). - ได้แรงบันดาลใจจากผู้ให้บริการ —
adobe-spectrum,mozilla-protocol. -
ใช้งานทั่วไป —
light,dark,nord,dracula,wireframe,corporate,synthwaveและอีกมากมาย
ตรวจสอบงานของคุณ: โหลดหน้าซ้ำ มาร์กอัปเดิมที่คุณสร้างในบทเรียนเฟรมเวิร์กตอนนี้มีสไตล์ครบ — ปุ่ม ช่องกรอก ป้ายกำกับ วงโฟกัส HTML เพียงบรรทัดเดียวทำให้เกิดทั้งหมดนี้ — คอมโพเนนต์ทุกตัวยังเหมือนเดิม
ขั้นที่ 2 — ปรับแทนที่อะไรก็ได้
ตัวเลือกของธีมถูกห่อด้วย :where(...)ซึ่งมีความจำเพาะเป็นศูนย์ — กฎใดที่คุณเขียนจึงชนะเสมอ ง่าย ๆ เท่านี้:
/* After the theme link: your brand button, everything else themed */
.button {
background: #7c3aed;
border-radius: 9999px;
}
ขั้นที่ 3 — การสลับขณะรันไทม์ด้วย theme-picker
theme-picker ตัวช่วยเป็นปุ่มไอคอน + listbox แบบ headless ที่ดูแลวงจรชีวิตของธีมทั้งหมด: โหลดสไตล์ชีตที่เลือกโดยสลับ <link>
ที่จัดการไว้หนึ่งตัว (ดึงเฉพาะธีมที่ใช้งานอยู่) ตั้งค่า
data-theme="{slug}" บนเอกสาร และเก็บค่าไว้ที่ localStorageได้ตามต้องการ แสดงเป็น Svelte ที่นี่ ส่วนพอร์ตของ React, Vue, Angular, HTML, Nunjucks และ Blazor ตรงกันทีละสัญญา:
<script>
import ThemePicker from "@lilydesignsystem/svelte-theme-picker";
</script>
<ThemePicker
label="Theme"
themesUrl="/assets/themes/"
themes={["light", "dark", "nord", "wireframe"]}
storageKey="my-app-theme"
/>
นั่นคือการเชื่อมต่อทั้งหมด พฤติกรรมแป้นพิมพ์เป็นไปตามรูปแบบ listbox ของ WAI-ARIA APG ตัวควบคุมเองเป็น headless (class hook
.theme-picker) จึงรับธีมใดก็ตามที่ใช้งานอยู่
ตรวจสอบเมื่อ 2026-08-29: ตัวอย่างโค้ดนี้ถูกคอมไพล์เทียบกับ 0.1.1 แพ็กเกจที่เผยแพร่แล้ว ผ่าน
svelte/server.
ขั้นที่ 4 — ตอบสนองต่อธีมใน CSS ของคุณเอง
เพราะตัวช่วยตั้งค่า data-theme ที่รากของเอกสาร สไตล์ของคุณเองจึงแตกกิ่งตามค่านั้นได้:
[data-theme="dark"] .site-logo { filter: invert(1); }
หมายเหตุสำหรับการเรนเดอร์บนเซิร์ฟเวอร์
ตัวช่วยทำการเขียน DOM ทั้งหมดภายในวงจรชีวิต mount/effect ของเฟรมเวิร์ก จึงปลอดภัยสำหรับ SSR โดยโครงสร้าง เพื่อหลีกเลี่ยงการกะพริบในการวาดครั้งแรก ให้เรนเดอร์ <link> และ
data-theme ของธีมเริ่มต้นบนเซิร์ฟเวอร์ (เช่นจากคุกกี้) — รีโพของตัวช่วย Svelte มีตัวอย่างคุกกี้ SvelteKit ที่รันได้ และแคตตาล็อกอื่นบันทึกรูปแบบเดียวกันสำหรับสแต็กของตน
ขั้นต่อไป
- ตัวช่วยการตั้งค่า — รูปแบบเดียวกันสำหรับภาษา ขนาดตัวอักษร การแชร์ และการกรอกวันที่/เวลา
- มีส่วนร่วมกับธีม — แต่ละธีมเป็นสไตล์ชีตแยกอิสระหนึ่งไฟล์ที่มุ่งเป้าไปที่ class hook ดู แนวทางการมีส่วนร่วม.
มีคำถามระหว่างทางไหม? หน้าช่วยเหลือ เต็มไปด้วยคำตอบ — และถ้าขั้นตอนไหนทำให้ชัดเจนกว่านี้ได้ บอกเรา แล้วเรายินดีปรับปรุงบทเรียน