成人免费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-07-15 09:08:51

2024-01-29 10:08:11

零拷貝Zero-copyCPU 拷貝

2024-02-27 15:23:48

RedLock算法Redis

2023-09-12 14:56:13

MyBatis緩存機制

2021-07-28 10:08:19

類加載代碼塊面試

2025-03-10 07:05:07

2023-02-18 13:34:14

Nacos健康檢查機制

2022-06-06 15:33:20

線程Java釋放鎖

2022-06-07 12:03:33

Java內存模型

2023-12-29 13:45:00

2023-02-08 08:32:41

輪詢鎖

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技術棧公眾號

主站蜘蛛池模板: 日本高清视频在线播放 | 中文字幕第一页在线 | 亚洲欧美一区二区三区国产精品 | 91精品国产777在线观看 | 一级在线毛片 | 中文字幕一区在线观看视频 | 91视视频在线观看入口直接观看 | 亚洲精品久久久9婷婷中文字幕 | 久久欧美高清二区三区 | a视频在线观看 | 国产日韩欧美91 | 欧美中文字幕在线观看 | 亚洲毛片网站 | 久久99精品久久久久久噜噜 | 国产精品欧美一区二区三区不卡 | 在线播放亚洲 | 精品国产欧美 | 成人高清视频在线观看 | 欧美日韩一二三区 | 日韩成人在线看 | 欧美黄视频 | 91精品国产乱码久久久久久久久 | 一区二区三区中文字幕 | 在线看成人av | 国产免费一区二区 | 成人国产在线视频 | 91精品在线播放 | 亚洲成人日韩 | 国产精品久久久久久久久免费 | 一级在线 | 日本一卡精品视频免费 | 99re视频| 国产羞羞视频在线观看 | 天天综合网天天综合 | 亚洲精品视频免费看 | 在线观看www | 操到爽| 国产精品一区二区在线 | 成人av在线播放 | 99精品欧美一区二区三区综合在线 | 午夜精品一区二区三区在线观看 |