首页 > 其他分享 >饿了么面试官:实现一下 Element-UI 官网的主题切换动画!

饿了么面试官:实现一下 Element-UI 官网的主题切换动画!

时间:2024-12-03 23:34:16浏览次数:6  
标签:动画 面试官 快照 transition Element UI document root view


· 实现

基本效果

首先我们起一个 html 文件,写一个按钮,以及简单的背景颜色切换,来模拟主题的切换

可以看到实现了最简单的主题切换效果


document.startViewTransition

想要实现过渡效果,需要先用到一个 JavaScript 的原生方法:document.startViewTransition

这个方法是用来做动画过渡效果的

通过调用 API,让浏览器为新旧两种不同视图分别捕获并建立了快照 (即 ::view-transition-old(root)旧快照 和 ::view-transition-new(root) 新快照),而后新旧两快照在 ::view-transition-image-pair(root) 容器中完成转场动画的过渡。动画结束后则删除其相关伪元素 (快照和容器)

过渡动画效果 

我们可以应用一下这个 API

现在去切换主题颜色,发现有过渡效果了~

圆形扩散过渡动画 

接下来实现圆形过渡的效果,其实这个动画最终是展示::view-transition-new(root)这个伪元素,所以我们只需要让这个伪元素有原型扩散的过渡动画即可~

那圆形扩散动画咋做呢?其实很简单,只需要将伪元素的半径,从0 -> 100%即可

代码如下 

并且我们需要取消掉 document.startViewTransition默认的动画效果,不然它会导致我们自定义的动画效果无效~

最终得到圆形扩散的效果

· 完整代码 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      :root {
        /* 默认亮主题 */
        --bg-color: #fff;
        background-color: var(--bg-color);
      }
      :root.dark {
        /* 暗主题 */
        --bg-color: #000;
      }
      ::view-transition-new(root),
      ::view-transition-old(root) {
        /* 关闭默认动画 */
        animation: none;
      }
    </style>
  </head>
  <body>
    <button id="themeButton">切换主题</button>
    <script>
      const themeButton = document.getElementById("themeButton");
      themeButton.addEventListener("click", (e) => {
        // 执行切换主题的操作
        const transition = document.startViewTransition(() => {
          // 动画过渡切换主题色
          document.documentElement.classList.toggle("dark");
        });

        // document.startViewTransition 的 ready 返回一个 Promise
        transition.ready.then(() => {
          // 获取鼠标的坐标
          const { clientX, clientY } = e;

          // 计算最大半径
          const radius = Math.hypot(
            Math.max(clientX, innerWidth - clientX),
            Math.max(clientY, innerHeight - clientY)
          );

          // 圆形动画扩散开始
          document.documentElement.animate(
            {
              clipPath: [
                `circle(0% at ${clientX}px ${clientY}px)`,
                `circle(${radius}px at ${clientX}px ${clientY}px)`,
              ],
            },
            // 设置时间,已经目标伪元素
            {
              duration: 300,
              pseudoElement: "::view-transition-new(root)",
            }
          );
        });
      });
    </script>
  </body>
</html>

 

 

 

 

标签:动画,面试官,快照,transition,Element,UI,document,root,view
From: https://blog.csdn.net/YN2000609/article/details/144217908

相关文章

  • Element Plus组件v-loading在el-dialog组件上使用无效
    前情公司有经常需要做一些后台管理页面,我们选择了ElementPlus,它是基于Vue3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个Vue3UI框架|ElementPlus,对于请求服务数据交互提供一个loading加载中效果是一个提高用户体验的好方法。......
  • [Vue3] 实现 Ollama WebUI
    家好呀,最近我在研究LLM,即本地大语言模型。其中我主要使用的软件是Ollama。Ollama可以方便的下载及运行LLMOllama提供了一套RESTApi,并且已经有了ollama-js这个库,可以方便的调用接口,所以我们可以自己写一套WebUI。那么为什么不用别人写好的呢?我找了些开源项目,但大多是python编......
  • 【数据库系列】Liquibase 与 Flyway 的详细对比
    在现代软件开发中,数据库版本控制是一个至关重要的环节。为了解决数据库迁移和变更管理的问题,开发者们通常会使用工具,如Liquibase和Flyway。本文将对这两个流行的数据库迁移工具进行详细比较,从基础概念、原理、优缺点到使用场景和示例,帮助开发者选择适合自身项目的工具。......
  • #渗透测试#SRC漏洞挖掘#红蓝攻防#黑客工具之Burp Suite进阶-自定义UI组件教程
    免责声明本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 如需获取工具,评论区留言即可!!!目录一、BurpSuite自定义UI......
  • AdonisUI试用笔记
    源码网址:https://github.com/benruehl/adonis-ui?tab=readme-ov-file官方文档:https://benruehl.github.io/adonis-ui/docs/getting-started/introduction/安装Install-PackageAdonisUIInstall-PackageAdonisUI.ClassicTheme资源引用<Applicationxmlns:adonisUi="clr-na......
  • iNKORE.UI.WPF.Modern试用笔记
    源码地址:https://github.com/iNKORE-Public/UI.WPF.Modern官方文档:https://docs.inkore.net/en-us/ui-wpf-modern/onboarding/目前官方的文档不是很齐全,貌似有不少的控件的内容还是空的,还在补充中。开发库本身同时支持.NETFRAMEWORK和.NETCORE。但.NETCORE版本估计用到了特......
  • Coqui TTS合成语音
    工具介绍CoquiTTS是一个用于语音转文本的高性能深度学习模型库。提供1100种语言的预训练模型,提供训练新模型和微调已有模型的工具,提供数据集分析工具。XTTS-v2版本支持16种语言:English(en),Spanish(es),French(fr),German(de),Italian(it),Portuguese(pt),Polish(......
  • Matlab2023a安装arduino硬件支持包记录
    安装硬件支持包参考教程:账号自行免费注册即可https://blog.csdn.net/Wakatipu1734/article/details/127118473下载好的文件如下 接着复制archives到指定目录,期中教程有一个问题:在下载好安装包后打开应该是install_supportsoftware(参考readme中详细步骤),而不是上述教程......
  • java毕业设计- 基于springboot+layui的医院综合管理毕业设计系统带数据库文件
    文章目录前言医院综合管理系统介绍医院综合管理系统界面医院综合管理系统实现介绍系统介绍技术实现细节总结系统数据库介绍毕设系统核心框架介绍核心代码参考数据库参考为什么选择我更多毕设系统作品演示视频可看这里数据库+源码获取前言......
  • layui:页面布局
    (栅格系统与后台布局)如你所愿,在layui2.0的版本中,我们加入了强劲的栅格系统和后台布局方案,这意味着你终于可以着手采用layui排版你的响应式网站和后台系统了。layui的栅格系统采用业界比较常见的12等分规则,内置移动设备、平板、桌面中等和大型屏幕的多终端适配处理,最低能......