为你的 Astro 应用添加暗黑模式。
暗黑模式
创建内联主题脚本
src/pages/index.astro
---import '../styles/globals.css'---<script is:inline>const getThemePreference = () => {if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {return localStorage.getItem('theme');}return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';};const isDark = getThemePreference() === 'dark';document.documentElement.classList[isDark ? 'add' : 'remove']('dark');if (typeof localStorage !== 'undefined') {const observer = new MutationObserver(() => {const isDark = document.documentElement.classList.contains('dark');localStorage.setItem('theme', isDark ? 'dark' : 'light');});observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });}</script><html lang="en"><body><h1>Astro</h1></body></html>
添加模式切换
src/components/ModeToggle.tsx
import * as React from "react"import { Moon, Sun } from "lucide-react"import { Button } from "@/components/ui/button"import {DropdownMenu,DropdownMenuContent,DropdownMenuItem,DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"export function ModeToggle() {const [theme, setThemeState] = React.useState<"theme-light" | "dark" | "system">("theme-light")React.useEffect(() => {const isDarkMode = document.documentElement.classList.contains("dark")setThemeState(isDarkMode ? "dark" : "theme-light")}, [])React.useEffect(() => {const isDark =theme === "dark" ||(theme === "system" &&window.matchMedia("(prefers-color-scheme: dark)").matches)document.documentElement.classList[isDark ? "add" : "remove"]("dark")}, [theme])return (<DropdownMenu><DropdownMenuTrigger asChild><Button variant="outline" size="icon"><Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" /><Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" /><span className="sr-only">切换主题</span></Button></DropdownMenuTrigger><DropdownMenuContent align="end"><DropdownMenuItem onClick={() => setThemeState("theme-light")}>光明模式</DropdownMenuItem><DropdownMenuItem onClick={() => setThemeState("dark")}>暗黑模式</DropdownMenuItem><DropdownMenuItem onClick={() => setThemeState("system")}>系统模式</DropdownMenuItem></DropdownMenuContent></DropdownMenu>)}
显示模式切换
在你的站点上添加一个模式切换按钮,以在光明模式和暗黑模式之间切换。
src/pages/index.astro
---import '../styles/globals.css'import { ModeToggle } from '@/components/ModeToggle';---<!-- 内联脚本 --><html lang="en"><body><h1>Astro</h1><ModeToggle client:load /></body></html>
