成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

餓了么面試官:實現一下 Element-UI 官網的主題切換動畫!

開發 前端
通過調用 API,讓瀏覽器為新舊兩種不同視圖分別捕獲并建立了快照 (即 ::view-transition-old(root)舊快照 和 ::view-transition-new(root) 新快照),而后新舊兩快照在 ::view-transition-image-pair(root) 容器中完成轉場動畫的過渡。

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心。

最近看到 ElementPlus 官網上的切換主題方式非常有趣,這是一個過渡的動畫效果。

圖片圖片

所以在網上查了一番,找到基本的實現方法。

實現

基本效果

首先我們起一個 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>
責任編輯:武曉燕 來源: 前端之神
相關推薦

2024-11-27 08:53:06

2024-01-29 10:08:11

零拷貝Zero-copyCPU 拷貝

2021-07-28 10:08:19

類加載代碼塊面試

2024-02-27 15:23:48

RedLock算法Redis

2023-09-12 14:56:13

MyBatis緩存機制

2023-02-18 13:34:14

Nacos健康檢查機制

2022-06-06 15:33:20

線程Java釋放鎖

2025-03-10 07:05:07

2022-06-07 12:03:33

Java內存模型

2023-02-08 08:32:41

輪詢鎖

2023-12-29 13:45:00

2021-08-28 09:06:11

Dubbo架構服務

2021-11-08 15:59:01

MyBatis關聯開發

2024-02-21 16:42:00

2020-07-30 07:58:36

加密算法

2023-11-29 08:00:53

JavaTreeMap底層

2021-09-28 13:42:55

Chrome Devwebsocket網絡協議

2023-01-30 15:39:40

GETHTTP

2021-06-02 11:25:18

線程池Java代碼

2023-03-08 07:46:53

面試官優化結構體
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线看黄 | 精品99在线 | 色综合成人网 | 欧美性网| 精品一区二区免费视频 | 五月婷婷在线播放 | 成人精品一区二区 | 国产精品美女久久久久aⅴ国产馆 | 亚洲国产一区二区在线 | 电影午夜精品一区二区三区 | 日韩二 | 成人一区二区三区在线 | 欧美一区免费 | 黄色亚洲网站 | 中文字幕一区二区视频 | 亚洲一区二区三区四区五区中文 | 一区二区高清不卡 | 97精品久久 | 一区二区在线不卡 | 亚洲欧美综合网 | 丁香五月网久久综合 | 中国91av | www.久草.com| 婷婷综合色 | 成人国产一区二区三区精品麻豆 | 美日韩视频| 男女视频在线免费观看 | 久久免费精品 | 欧洲av在线 | 久久33 | 亚洲国产18| 极品在线 | 久久精品一区 | 欧美一区二区成人 | 殴美成人在线视频 | 国产在线视频一区 | 欧美日韩一区在线 | 久久国产精品视频 | 欧美乱码精品一区二区三区 | 日日夜夜精品免费视频 | 欧美一级特黄aaa大片在线观看 |