最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用vue3實(shí)現(xiàn)element-plus的主題切換效果

 更新時(shí)間:2024年12月02日 10:39:29   作者:szx的開(kāi)發(fā)筆記  
Vue3 Element Plus是一個(gè)基于Vue 3框架的UI組件庫(kù),它是由Element UI團(tuán)隊(duì)開(kāi)發(fā)的升級(jí)版本,Element Plus延續(xù)了Element UI簡(jiǎn)潔、高效的風(fēng)格,并引入了一些新的設(shè)計(jì)語(yǔ)言和技術(shù),如響應(yīng)式API和更好的性能優(yōu)化,本文給大家介紹了如何使用vue3實(shí)現(xiàn)element-plus的主題切換效果

先看實(shí)現(xiàn)效果

實(shí)現(xiàn)過(guò)程

前提需要引入好 element-plus,并導(dǎo)入element的黑色主題CSS

示例,再 main.js 中引入

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import 'element-plus/theme-chalk/dark/css-vars.css' // 黑色主題

app.use(ElementPlus, {
  locale: locale,
  size: Cookies.get('size') || 'default'
})

接著編寫下面的基礎(chǔ)代碼

<template>
  <div>
    <el-switch v-model='value1' class='switch' @change='changeSwitch'>
      <template #active-action>
        <el-icon>
          <Moon />
        </el-icon>
      </template>
      <template #inactive-action>
        <el-icon>
          <Sunny />
        </el-icon>
      </template>
    </el-switch>
  </div>
</template>

<script setup>
let value1 = ref(false)

function changeSwitch() {
  document.documentElement.classList.toggle('dark')
}
</script>
<style scoped lang='scss'>
.switch {
  position: absolute;
  left: 200px;
  top: 200px;
}
</style>

現(xiàn)在當(dāng)切換 switch 時(shí),背景顏色會(huì)直接進(jìn)行黑白切換

從動(dòng)畫(huà)可以看到,現(xiàn)在是沒(méi)有任何過(guò)渡效果的

我們可以使用 document.startViewTransition 很簡(jiǎn)單的就可以加上過(guò)渡效果,document.startViewTransition 接收一個(gè)函數(shù)參數(shù),再函數(shù)內(nèi)部寫上操作DOM的邏輯代碼即可實(shí)現(xiàn)一個(gè)默認(rèn)的過(guò)度效果

function changeSwitch() {
  document.startViewTransition(() => {
    document.documentElement.classList.toggle('dark')
  })
}

現(xiàn)在就有了一個(gè)默認(rèn)的過(guò)渡效果

為什么使用了 document.startViewTransition 就會(huì)有一個(gè)動(dòng)畫(huà)效果呢

MDN文檔:Document:startViewTransition() 方法 - Web API | MDN

通過(guò)調(diào)用 API,讓瀏覽器為新舊兩種不同視圖分別捕獲并建立了快照 (即 ::view-transition-old(root)舊快照 和 ::view-transition-new(root) 新快照),而后新舊兩快照在 ::view-transition-image-pair(root) 容器中完成轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的過(guò)渡。動(dòng)畫(huà)結(jié)束后則刪除其相關(guān)偽元素 (快照和容器)。

我們也可以控制默認(rèn)的動(dòng)畫(huà)時(shí)長(zhǎng)

::view-transition-old(root), /* 舊視圖*/
::view-transition-new(root) { /* 新視圖*/
  animation-duration: 2s;
}

了解了這些,現(xiàn)在想點(diǎn)擊按鈕,實(shí)現(xiàn)一個(gè)擴(kuò)散圓來(lái)實(shí)現(xiàn)主題切換效果,只需要根據(jù)按鈕位置,計(jì)算圓的半徑,然后設(shè)置 ::view-transition-new(root) 這個(gè)偽元素的動(dòng)畫(huà)效果,讓圓從 0% 到 100%即可

完整代碼

<template>
  <div>
    <el-switch v-model='isDark' class='switch' ref='switchRef' @change='changeSwitch'>
      <template #active-action>
        <el-icon>
          <Moon />
        </el-icon>
      </template>
      <template #inactive-action>
        <el-icon>
          <Sunny />
        </el-icon>
      </template>
    </el-switch>
  </div>
</template>

<script setup>
import { ref } from 'vue'

let isDark = ref(false)
let switchRef = ref(null)


function changeSwitch() {
  // 創(chuàng)建一個(gè)視圖過(guò)渡動(dòng)畫(huà),用于在切換深色模式時(shí)優(yōu)化用戶體驗(yàn)
  const transition = document.startViewTransition(() => {
    // 切換HTML文檔的dark類,以激活或停用深色模式
    document.documentElement.classList.toggle('dark')
  })

  // 當(dāng)視圖過(guò)渡動(dòng)畫(huà)準(zhǔn)備就緒時(shí)執(zhí)行以下代碼
  transition.ready.then(() => {
    // 獲取switch組件的DOM元素,用于計(jì)算過(guò)渡動(dòng)畫(huà)的起點(diǎn)
    const switchElement = switchRef.value?.$el
    // 計(jì)算switch組件中心點(diǎn)的坐標(biāo)
    const rect = switchElement.getBoundingClientRect()
    const x = rect.left + rect.width / 2
    const y = rect.top + rect.height / 2
    // 計(jì)算過(guò)渡動(dòng)畫(huà)結(jié)束時(shí)的圓半徑,確保覆蓋整個(gè)視口
    const endRadius = Math.hypot(
      Math.max(x, innerWidth - x),
      Math.max(y, innerHeight - y),
    )
    // 創(chuàng)建clipPath數(shù)組,定義了過(guò)渡動(dòng)畫(huà)的起始和結(jié)束形狀
    const clipPath = [
      `circle(0 at ${x}px ${y}px)`,
      `circle(${endRadius}px at ${x}px ${y}px)`,
    ]
    // 在HTML文檔的根元素上啟動(dòng)一個(gè)動(dòng)畫(huà),根據(jù)當(dāng)前是否為深色模式來(lái)決定動(dòng)畫(huà)的方向
    document.documentElement.animate(
      {
        clipPath: isDark.value ? clipPath.reverse() : clipPath,
      },
      {
        duration: 400, // 動(dòng)畫(huà)持續(xù)時(shí)間
        pseudoElement: isDark.value
          ? '::view-transition-old(root)'
          : '::view-transition-new(root)', // 根據(jù)深色模式狀態(tài)選擇偽元素
      },
    )
  })
}
</script>

<style>
::view-transition-new(root),
::view-transition-old(root) {
  /* 關(guān)閉默認(rèn)動(dòng)畫(huà),否則影響自定義動(dòng)畫(huà)的執(zhí)行 */
  animation: none !important;
}

/*黑暗模式下,讓舊節(jié)點(diǎn)的層級(jí)變高,否則會(huì)導(dǎo)致動(dòng)畫(huà)出不來(lái)*/
.dark::view-transition-old(root) {
  z-index: 100;
}
</style>

<style scoped>
.switch {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}
</style>

circle 表示畫(huà)一個(gè)圓形,更多圖像可參考:clip-path - CSS:層疊樣式表 | MDN

以上就是使用vue3實(shí)現(xiàn)element-plus的主題切換效果的詳細(xì)內(nèi)容,更多關(guān)于vue3 element-plus主題切換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在vue-cli腳手架中配置一個(gè)vue-router前端路由

    在vue-cli腳手架中配置一個(gè)vue-router前端路由

    這篇文章主要給大家介紹了在vue-cli腳手架中配置一個(gè)vue-router前端路由的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • Vue2與Vue3中diff算法的區(qū)別及說(shuō)明

    Vue2與Vue3中diff算法的區(qū)別及說(shuō)明

    Vue3通過(guò)雙端Diff算法、靜態(tài)標(biāo)記、動(dòng)態(tài)追蹤、Fragment支持、事件緩存和BlockTree等優(yōu)化,顯著提升了性能,特別是在處理大規(guī)模靜態(tài)內(nèi)容時(shí)
    2025-10-10
  • Vue2中無(wú)法監(jiān)聽(tīng)數(shù)組和對(duì)象的某些變化問(wèn)題

    Vue2中無(wú)法監(jiān)聽(tīng)數(shù)組和對(duì)象的某些變化問(wèn)題

    這篇文章主要介紹了Vue2中無(wú)法監(jiān)聽(tīng)數(shù)組和對(duì)象的某些變化問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue中的循環(huán)遍歷與key值原理解讀

    Vue中的循環(huán)遍歷與key值原理解讀

    這篇文章主要介紹了Vue中的循環(huán)遍歷與key值原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue組件實(shí)現(xiàn)評(píng)論區(qū)功能

    Vue組件實(shí)現(xiàn)評(píng)論區(qū)功能

    這篇文章主要為大家詳細(xì)介紹了Vue組件實(shí)現(xiàn)評(píng)論區(qū)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • uniapp多地區(qū)、多平臺(tái)、多環(huán)境打包具體代碼與配置說(shuō)明

    uniapp多地區(qū)、多平臺(tái)、多環(huán)境打包具體代碼與配置說(shuō)明

    在移動(dòng)開(kāi)發(fā)領(lǐng)域,跨平臺(tái)解決方案一直是開(kāi)發(fā)者追求的目標(biāo),Uniapp憑借其獨(dú)特的架構(gòu)設(shè)計(jì),實(shí)現(xiàn)了iOS、Android、H5、微信小程序等8個(gè)平臺(tái)的代碼復(fù)用,這篇文章主要介紹了uniapp多地區(qū)、多平臺(tái)、多環(huán)境打包具體代碼與配置說(shuō)明的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • vue執(zhí)行配置選項(xiàng)npm?run?serve的本質(zhì)圖文詳解

    vue執(zhí)行配置選項(xiàng)npm?run?serve的本質(zhì)圖文詳解

    本地開(kāi)發(fā)一般通過(guò)執(zhí)行npm run serve命令來(lái)啟動(dòng)項(xiàng)目,那這行命令到底存在什么魔法?下面這篇文章主要給大家介紹了關(guān)于vue執(zhí)行配置選項(xiàng)npm?run?serve的本質(zhì)的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 使用Vue和Firebase實(shí)現(xiàn)后臺(tái)數(shù)據(jù)存儲(chǔ)的示例代碼

    使用Vue和Firebase實(shí)現(xiàn)后臺(tái)數(shù)據(jù)存儲(chǔ)的示例代碼

    在現(xiàn)代 web 應(yīng)用開(kāi)發(fā)中,前端和后端的無(wú)縫協(xié)作至關(guān)重要,借助 Firebase 等云計(jì)算解決方案,前端開(kāi)發(fā)者可以輕松實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)與實(shí)時(shí)更新,本文將為大家詳細(xì)介紹如何利用 Vue 3 的 Composition API 和 Firebase 實(shí)現(xiàn)后臺(tái)數(shù)據(jù)存儲(chǔ),需要的朋友可以參考下
    2024-10-10
  • Vue3通過(guò)ref操作Dom元素及hooks的使用方法

    Vue3通過(guò)ref操作Dom元素及hooks的使用方法

    這篇文章主要介紹了Vue3通過(guò)ref操作Dom元素及hooks的使用方法,需要的朋友可以參考下
    2023-01-01
  • 對(duì)vue.js中this.$emit的深入理解

    對(duì)vue.js中this.$emit的深入理解

    下面小編就為大家分享一篇對(duì)vue.js中this.$emit的深入理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02

最新評(píng)論

广水市| 大理市| 谢通门县| 怀安县| 长岭县| 遵义市| 眉山市| 册亨县| 普兰店市| 哈尔滨市| 肇东市| 綦江县| 白水县| 那坡县| 房产| 通河县| 阿克陶县| 桦川县| 佛坪县| 韩城市| 富蕴县| 简阳市| 綦江县| 五常市| 连城县| 东乡县| 思南县| 新平| 肥乡县| 酒泉市| 长子县| 什邡市| 惠东县| 林甸县| 阿坝县| 西华县| 井冈山市| 会泽县| 衡阳市| 富阳市| 简阳市|