主题切换过渡切割效果

news2024/12/27 13:14:30

主题切换过渡切割效果

  • 效果图
  • 上代码

效果图

请添加图片描述

参考api View Transitions API
View Transitions API 提供了一种机制,可以在更新 DOM 内容的同时,轻松地创建不同 DOM 状态之间的动画过渡。同时还可以在单个步骤中更新 DOM 内容。

在这里插入图片描述

上代码

<!--
 * @Descripttion: 
 * @Author: 苍狼一啸八荒惊
 * @Date: 2024-09-03 14:16:43
 * @LastEditTime: 2024-09-04 14:06:25
 * @LastEditors: 夜空孤狼啸
-->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>主题切换</title>
    <style>
        :root {
            /* 亮色模式下的背景色 */
            --bg-color: #fff;
            --text-color: #232324;
            background-color: var(--bg-color);
        }

        :root.dark {
            /* 暗色模式下的背景色 */
            --text-color: #dbdbdf;
            --bg-color: #000;
        }

        .dark::view-transition-old(root) {
            z-index: 100;
        }

        ::view-transition-new(root),
        ::view-transition-old(root) {
            /* 关闭默认动画,否则影响自定义动画的执行 */
            animation: none;
        }

        body {
            color: var(--text-color);
        }
    </style>
</head>

<body>
    <button id="btn">切换主题</button>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <h1>点击按钮时切换主题</h1>
    <script>
        const btn = document.getElementById('btn')
        // 点击按钮时切换主题
        btn.addEventListener('click', (e) => {
            // 获取到 transition API 实例
            const transition = document.startViewTransition(() => {
                document.documentElement.classList.toggle('dark')
            })

            // 在 transition.ready 的 Promise 完成后,执行自定义动画
            transition.ready.then(() => {
                // 由于我们要从鼠标点击的位置开始做动画,所以我们需要先获取到鼠标的位置
                const { clientX, clientY } = e

                // 计算半径,以鼠标点击的位置为圆心,到四个角的距离中最大的那个作为半径
                const radius = Math.hypot(
                    Math.max(clientX, innerWidth - clientX),
                    Math.max(clientY, innerHeight - clientY)
                )
                const clipPath = [
                    `circle(0% at ${clientX}px ${clientY}px)`,
                    `circle(${radius}px at ${clientX}px ${clientY}px)`
                ]
                const isDark = document.documentElement.classList.contains('dark')
                console.log(isDark)
                // 自定义动画
                document.documentElement.animate(
                    {
                        // 如果要切换到暗色主题,我们在过渡的时候从半径 100% 的圆开始,到 0% 的圆结束
                        clipPath: isDark ? clipPath.reverse() : clipPath
                    },
                    {
                        duration: 500,
                        // 如果要切换到暗色主题,我们应该裁剪 view-transition-old(root) 的内容
                        pseudoElement: isDark
                            ? '::view-transition-old(root)'
                            : '::view-transition-new(root)'
                    }
                )
            })
        })



    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能造福公众:未来一片光明

作者&#xff1a;来自 Elastic Peter Dutton 我们如何衡量人工智能对政府的影响&#xff1f;毫无疑问&#xff0c;人工智能将为运营流程和决策带来的好处已被广泛讨论 —— 从自动化工作流程到节省成本再到减少重复工作。 但对于以服务公众为目标的组织来说&#xff0c;人工智…

黑马头条docker启动minio访问不了,端口一直变化

原先代码为 docker run -p 9000:9000 --name minio -d --restartalways -e "MINIO_ROOT_USERminio" -e "MINIO_ROOT_PASSWORDminio123" -v /home/data:/data -v /home/config:/root/.minio minio/minio server /data 访问结果为&#xff0c;且9000会变为3…

PostgreSQL的repmgr工具介绍

PostgreSQL的repmgr工具介绍 repmgr&#xff08;Replication Manager&#xff09;是一个专为 PostgreSQL 设计的开源工具&#xff0c;用于管理和监控 PostgreSQL 的流复制及实现高可用性。它提供了一组工具和实用程序&#xff0c;简化了 PostgreSQL 复制集群的配置、维护和故障…

glsl着色器学习(九)屏幕像素空间和设置颜色

在上一篇文章中&#xff0c;使用的是裁剪空间进行绘制&#xff0c;这篇文章使用屏幕像素空间的坐标进行绘制。 上一篇的顶点着色器大概是这样子的 回归一下顶点着色的主要任务&#xff1a; 通常情况下&#xff0c;顶点着色器会进行一系列的矩阵变换操作&#xff0c;将输入的顶…

凯伦股份助力胖东来打造一流商超项目

在当下快节奏的城市生活里头&#xff0c;很多线下零售业务都已经被网购平台所冲击或影响&#xff0c;但偏偏河南许昌市的“胖东来”超市&#xff0c;每天的客流量高达数万人&#xff0c;且供不应求&#xff0c;大众赞誉它为“商超行业的顶尖品牌”、“中国超市的标杆”、“河南…

【数学建模】2024数学建模国赛经验分享

文章目录 一、关于我二、我的数模历程三、经验总结&#xff1a; 一、关于我 我的CSDN主页&#xff1a;https://gxdxyl.blog.csdn.net/ 2020年7月&#xff08;大二结束的暑假&#xff09;开始在CSDN写作&#xff1a; 阿里云博客专家&#xff1a; 接触的领域挺多的&#xff…

【Linux】应用层自定义协议与序列化

一、应用层 我们程序员写的一个一个解决实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在应用层。在应用层中的协议也是最多的。 1.1 再次认识协议 协议是一种约定&#xff0c;是通信双方约定的一种数据结构。在之前写的UDP服务器和TCP服务器中&#xff0c;…

C++和Python混合编程——C++调用Python入门

大纲 代码结构初始化 Python 解释器获取 GIL为什么需要 GIL&#xff1f;GIL 的影响 导入 Python 模块并执行代码释放 GIL终止 Python 解释器 完整代码编译执行结果项目地址 在《C和Python混合编程——Python调用C入门》一文中&#xff0c;我们熟悉了Python调用C编译的动态库的方…

UE5 C++ 读取图片插件(一)

原来UE可以使用 static,之前不知道&#xff0c;一用就报错。 static TSharedPtr<IImageWrapper> GetImageWrapperByExtention(const FString InImagePath); //智能指针&#xff0c;方便追寻引用C,加载ImageWrapperstatic UTexture2D* LoadTexture2D(const FString& …

算法-滑动窗口技巧

文章目录 基础理论介绍长度最小的子数组无重复字符的最长字串解法1 : 哈希表计数逐步缩进解法2 : 哈希表更新下标跳跃缩进 最小覆盖字串替换子串获得平衡字符串K个不同整数的子数组 基础理论介绍 1. 滑动窗口简介 : 滑动窗口其实就是维持了一段区间(l边界与r边界), 并且对于这…

C++:构造函数、析构函数

目录 一、类的默认成员函数 二、构造函数 构造函数的特点 三、析构函数 析构函数的特点 一、类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数&#xff0c;一个类&#xff0c;我们不写的情况下编译器会默认生成…

Unity(2022.3.41LTS) - 动画融合术

目录 一、动画融合的概念 二、动画融合的类型 三、动画融合的实现方法 1.简介 2.创建新的图层 3.创建遮罩 4.遮罩配置 5.预览效果 6.使用代码灵活控制 7.全部代码 四、动画融合的优化和注意事项 一、动画融合的概念 在 Unity 中&#xff0c;动画融合是一种强大的技…

安装 Let‘s Encrypt certbot 生成多个域名免费 https 证书实录(linux pip 方式)

本文记录了我在华为云 EulerOS linux 云主机使用 python pip 方式安装配置 Let’s Encrypt certbot, 并为我的网站的多个域名生成免费 https 证书的整个过程, 包括 python 环境配置, 下载 certbot 及 certbot-nginx, 一次性生成多个域名的证书及注意事项, 以及最后配置 certbot…

5G农业大数据中心顶层设计

1. 政策背景与规划 国家政策大力推动大数据发展和应用&#xff0c;特别是农业农村信息化发展规划&#xff0c;强调数字化在农业现代化中的关键作用。《数字农业农村发展规划&#xff08;2019-2025年&#xff09;》明确了农业农村数字化的重要性。 2. 国际农业大数据现状 美国…

超图iServer 11i在Java中调用REST接口点线面增删改查方法

一、引入iServer的Jar包 需要到iServer安装目录/webapps/iserver/WEB-INF/lib下寻找以下几个jar包&#xff0c;把它引入到项目里&#xff1a; iserver-all-*.jar service-model-*.jar rest-sdk-*.jar然后再引入几个maven依赖包&#xff1a; <dependency><groupId&g…

MyBaits 二级缓存原理

优质博文&#xff1a;IT-BLOG-CN 一级缓存原理 默认关闭&#xff0c;一般不建议使用。为什么不建议使用我们要清楚。 先给不建议使用的原因&#xff1a; MyBatis的二级缓存是和命名空间绑定的&#xff0c;所以通常情况下每一个Mapper映射文件都拥有自己的二级缓存&#xff0c;…

关于谷歌账号的三个“错误的”问题:谷歌有客服吗?登录不了的账号如何注销?登录不了的账号绑定的手机还能注册新账号吗?

这段时间GG账号服务收到很多朋友的反馈&#xff0c;其中有一些具有典型的问题&#xff0c;而且是错误的问题——主要是对谷歌账号或者谷歌账号使用的误解&#xff0c;从而浪费了时间&#xff0c;或者走了弯路&#xff0c;或者反复试错给账号带来了更大的风险。 今天就来给大家…

Spring 框架下 Redis 数据结构的全面解析

Hello , 大家好 , 这个专栏给大家带来的是 Redis 系列 ! 本篇文章给大家带来的是如何通过 Spring 来操作 Redis 中的常见数据结构 , 以及如何通过代码执行 Redis 中的原生命令 . 本专栏旨在为初学者提供一个全面的 Redis 学习路径&#xff0c;从基础概念到实际应用&#xff0c;…

【C++题解】1088 - 求两个数M和N的最大公约数

问题四&#xff1a;1088 - 求两个数M和N的最大公约数 类型&#xff1a;需要找规律的循环。 题目描述&#xff1a; 求两个正整整数 M 和 N 的最大公约数(M&#xff0c;N都在长整型范围内&#xff09; 输入&#xff1a; 输入一行&#xff0c;包括两个正整数。 输出&#xff…

Antv a-table 表格行/列合并,在合并后的td中使用插槽slot

【需求】 这次的表格需要实现行列合并&#xff0c;并且要在合并后的 td 中使用子组件或弹出弹窗&#xff0c;难点在于&#xff1a; 1. 根据提供的data&#xff0c;自行判断是否合并项的 getRowspan方法 2. customCell 、scopedSlots 冲突导致的子组件无法展示 &#xff08…