日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-07-15 17:15:39 635觀看
導讀前言大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心。最近看到 ElementPlus 官網上的切換主題方式非常有趣,這是一個過渡的動畫效果。圖片所以在網上查了一番,找到基本的實現

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心。PI028資訊網——每日最新資訊28at.com

最近看到 ElementPlus 官網上的切換主題方式非常有趣,這是一個過渡的動畫效果。PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

所以在網上查了一番,找到基本的實現方法。PI028資訊網——每日最新資訊28at.com

實現

基本效果

首先我們起一個 html 文件,寫一個按鈕,以及簡單的背景顏色切換,來模擬主題的切換。PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

可以看到實現了最簡單的主題切換效果。PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

document.startViewTransition

想要實現過渡效果,需要先用到一個 JavaScript 的原生方法:document.startViewTransition。PI028資訊網——每日最新資訊28at.com

這個方法是用來做動畫過渡效果的。PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

通過調用 API,讓瀏覽器為新舊兩種不同視圖分別捕獲并建立了快照 (即 ::view-transition-old(root)舊快照 和 ::view-transition-new(root) 新快照),而后新舊兩快照在 ::view-transition-image-pair(root) 容器中完成轉場動畫的過渡。動畫結束后則刪除其相關偽元素 (快照和容器)。PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

過渡動畫效果

我們可以應用一下這個 API。PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

現在去切換主題顏色,發現有過渡效果了。PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

圓形擴散過渡動畫

接下來實現圓形過渡的效果,其實這個動畫最終是展示::view-transition-new(root)這個偽元素,所以我們只需要讓這個偽元素有原型擴散的過渡動畫即可!PI028資訊網——每日最新資訊28at.com

那圓形擴散動畫咋做呢?其實很簡單,只需要將偽元素的半徑,從0 -> 100%即可。PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

代碼如下:PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

并且我們需要取消掉 document.startViewTransition默認的動畫效果,不然它會導致我們自定義的動畫效果無效。PI028資訊網——每日最新資訊28at.com

圖片圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

最終得到圓形擴散的效果:PI028資訊網——每日最新資訊28at.com

圖片PI028資訊網——每日最新資訊28at.com

PI028資訊網——每日最新資訊28at.com

完整代碼

<!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>

本文鏈接:http://www.www897cc.com/showinfo-26-100986-0.html餓了么面試官:實現一下 Element-UI 官網的主題切換動畫!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: VueConf 2024 落幕,7大模塊講解 Vue 未來生態變化!

下一篇: 想看源碼但是無從下口怎么辦?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 筠连县| 和田县| 邛崃市| 永昌县| 阿鲁科尔沁旗| 綦江县| 花垣县| 文成县| 德令哈市| 潞西市| 巴林右旗| 边坝县| 会昌县| 大英县| 新疆| 长岭县| 云浮市| 南部县| 宜兰市| 广河县| 汪清县| 浦城县| 双峰县| 合肥市| 周宁县| 四平市| 通州区| 同心县| 泸西县| 射阳县| 城固县| 清远市| 溧阳市| 同心县| 福清市| 兴海县| 清河县| 舞钢市| 米泉市| 祁门县| 济源市|