当前位置: 首页> 文旅> 美景 > 代理公司注册有什么猫腻_中国商标网查询入口_百度账号人工客服电话_官方网站营销

代理公司注册有什么猫腻_中国商标网查询入口_百度账号人工客服电话_官方网站营销

时间:2025/7/21 4:36:59来源:https://blog.csdn.net/qq_36117388/article/details/144374946 浏览次数:0次
代理公司注册有什么猫腻_中国商标网查询入口_百度账号人工客服电话_官方网站营销

前言

在 Next.js 中要实现暗黑模式,需要用到一个库:next-themes,它可以帮助我们很轻易地实现暗黑模式切换。

具体步骤

  1. 安装 next-themes 依赖:
pnpm add next-themes
  1. 新增 /components/ThemeProvider/index.tsx 文件:
'use client';import { ThemeProvider as NextThemesProvider } from 'next-themes';
import * as React from 'react';export default function ThemeProvider({ children, ...props }: React.ComponentProps<typeof NextThemesProvider>) {return <NextThemesProvider {...props}>{children}</NextThemesProvider>;
}
  1. /app/layout.tsx 文件中注入 ThemeProvider :
import { ThemeProvider } from "@/components/theme-provider"export default function RootLayout({ children }: RootLayoutProps) {return (<><html lang="en" suppressHydrationWarning><head /><body><ThemeProviderattribute="class"defaultTheme="system"enableSystemdisableTransitionOnChange>{children}</ThemeProvider></body></html></>)
}
  1. 新增 /components/ThemeModeButton/index.tsx 主题切换组件:
'use client';import { Moon, Sun } from 'lucide-react';
import { useTheme } from 'next-themes';import { Button } from '@/components/ui/button';export default function ThemeModeButton() {const { theme, setTheme } = useTheme();return (<Button variant="ghost" size="icon" onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}><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">Toggle theme</span></Button>);
}

过渡动画

  1. 如果你想加入过渡动画,可以把代码改成这样:
'use client';import { Moon, Sun } from 'lucide-react';
import { useTheme } from 'next-themes';import { Button } from '@/components/ui/button';export default function ThemeModeButton() {const { theme, setTheme } = useTheme();// 判断是否支持 startViewTransition APIconst enableTransitions = () =>'startViewTransition' in document && window.matchMedia('(prefers-reduced-motion: no-preference)').matches;// 切换动画async function toggleDark({ clientX: x, clientY: y }: MouseEvent) {const isDark = theme === 'dark';if (!enableTransitions()) {setTheme(theme === 'light' ? 'dark' : 'light');return;}const clipPath = [`circle(0px at ${x}px ${y}px)`,`circle(${Math.hypot(Math.max(x, innerWidth - x), Math.max(y, innerHeight - y))}px at ${x}px ${y}px)`,];await document.startViewTransition(async () => {setTheme(theme === 'light' ? 'dark' : 'light');}).ready;document.documentElement.animate({ clipPath: !isDark ? clipPath.reverse() : clipPath },{duration: 300,easing: 'ease-in',pseudoElement: `::view-transition-${!isDark ? 'old' : 'new'}(root)`,},);}return (<Button variant="ghost" size="icon" onClick={toggleDark}><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">Toggle theme</span></Button>);
}
  1. /app/glocals.css 文件中加入过渡样式:
::view-transition-old(root),
::view-transition-new(root) {animation: none;mix-blend-mode: normal;
}::view-transition-old(root),
.dark::view-transition-new(root) {z-index: 1;
}::view-transition-new(root),
.dark::view-transition-old(root) {z-index: 9999;
}

使用方法

在需要的位置引入组件:

import ThemeModeButton from '@/components/ThemeModeButton';<ThemeModeButton />

最终效果

在这里插入图片描述

关键字:代理公司注册有什么猫腻_中国商标网查询入口_百度账号人工客服电话_官方网站营销

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: