1
0
mirror of https://github.com/zclzone/vue-naive-admin.git synced 2025-12-26 19:20:21 +08:00

style: 优化主题切换过渡动画

This commit is contained in:
zclzone
2024-06-25 18:17:17 +08:00
parent c230e86767
commit 3c2e120e34
2 changed files with 49 additions and 24 deletions

View File

@@ -12,23 +12,51 @@ import { useAppStore } from '@/store'
const appStore = useAppStore()
const isDark = useDark()
function toggleDark({ clientX, clientY }) {
const maxRadius = Math.hypot(
Math.max(clientX, window.innerWidth - clientX),
Math.max(clientY, window.innerHeight - clientY),
)
const style = document.documentElement.style
style.setProperty('--circle-x', `${clientX}px`)
style.setProperty('--circle-y', `${clientY}px`)
style.setProperty('--circle-r', `${maxRadius}px`)
async function toggleDark({ clientX, clientY }) {
function handler() {
appStore.toggleDark()
useToggle(isDark)()
}
document.startViewTransition
? document.startViewTransition(handler)
: handler()
if (!document.startViewTransition) {
return handler()
}
const clipPath = [
`circle(0px at ${clientX}px ${clientY}px)`,
`circle(${Math.hypot(
Math.max(clientX, window.innerWidth - clientX),
Math.max(clientY, window.innerHeight - clientY),
)}px at ${clientX}px ${clientY}px)`,
]
await document.startViewTransition(handler).ready
document.documentElement.animate(
{ clipPath: isDark.value ? clipPath.reverse() : clipPath },
{
duration: 500,
easing: 'ease-in',
pseudoElement: `::view-transition-${isDark.value ? 'old' : 'new'}(root)`,
},
)
// const maxRadius = Math.hypot(
// Math.max(clientX, window.innerWidth - clientX),
// Math.max(clientY, window.innerHeight - clientY),
// )
// const style = document.documentElement.style
// style.setProperty('--circle-x', `${clientX}px`)
// style.setProperty('--circle-y', `${clientY}px`)
// style.setProperty('--circle-r', `${maxRadius}px`)
// function handler() {
// appStore.toggleDark()
// useToggle(isDark)()
// }
// document.startViewTransition
// ? document.startViewTransition(handler)
// : handler()
}
</script>