作者GitHub:github.com/gitboyzcf 有兴趣可关注!!
前言
View Transitions API
View Transitions API 是原生JavaScript提供一种能让Dom更加丝滑的API
示例 👇
兼容版本
VueUse
Vue的工具函数合集 vueuse.org/
正题
效果
安装
bash
npm install @vueuse/core
or
pnpm install @vueuse/core
or
yarn add @vueuse/core
代码
以下代码放入自己项目对应文件中即可
css
::view-transition-old(root),
::view-transition-new(root) {
animation: none;
mix-blend-mode: normal;
}
/* 进入dark模式和退出dark模式时,两个图像的位置顺序正好相反 */
::view-transition-old(root) {
z-index: 1;
}
::view-transition-new(root) {
z-index: 2147483646;
}
/* 根据自己选择器修改 */
[data-bs-theme="dark"]::view-transition-old(root) {
z-index: 2147483646;
}
[data-bs-theme="dark"]::view-transition-new(root) {
z-index: 1;
}
javascript
import { useDark, useToggle } from '@vueuse/core'
const isDark = useDark({
selector: 'html',
attribute: 'data-bs-theme',
valueDark: 'dark',
valueLight: 'light'
})
const toggleDark = useToggle(isDark);
const toggleTheme = (event) => {
const x = event.clientX;
const y = event.clientY;
const endRadius = Math.hypot(
Math.max(x, innerWidth - x),
Math.max(y, innerHeight - y)
);
// 兼容性处理
if (!document.startViewTransition) {
toggleDark();
return;
}
const transition = document.startViewTransition(async () => {
toggleDark();
});
transition.ready.then(() => {
const clipPath = [
`circle(0px at ${x}px ${y}px)`,
`circle(${endRadius}px at ${x}px ${y}px)`,
];
console.log(isDark.value);
document.documentElement.animate(
{
clipPath: isDark.value ? [...clipPath].reverse() : clipPath,
},
{
duration: 400,
easing: "ease-in",
pseudoElement: isDark.value
? "::view-transition-old(root)"
: "::view-transition-new(root)",
}
);
});
};
示例
到这里就结束了,后续还会更新 前端 系列相关,还请持续关注! 感谢阅读,若有错误可以在下方评论区留言哦!!!
推荐文章👇