EP35 - ex7. List with Transitions

閱讀時間約 15 分鐘
帶有過渡效果的列表,實用範例有些都帶有動畫效果
很值得練習啊!前端的精華都濃縮在一起~
動畫動畫動畫耶!~~~

App.vue

<!--
FLIP list transitions with the built-in <TransitionGroup>.
https://aerotwist.com/blog/flip-your-animations/
-->

<script setup>
import { shuffle as _shuffle } from 'lodash-es'
import { ref } from 'vue'

const getInitialItems = () => [1, 2, 3, 4, 5]
const items = ref(getInitialItems())
let id = items.value.length + 1

function insert() {
const i = Math.round(Math.random() * items.value.length)
items.value.splice(i, 0, id++)
}

function reset() {
items.value = getInitialItems()
id = items.value.length + 1
}

function shuffle() {
items.value = _shuffle(items.value)
}

function remove(item) {
const i = items.value.indexOf(item)
if (i > -1) {
items.value.splice(i, 1)
}
}
</script>

<template>
<button @click="insert">Insert at random index</button>
<button @click="reset">Reset</button>
<button @click="shuffle">Shuffle</button>

<TransitionGroup tag="ul" name="fade" class="container">
<li v-for="item in items" class="item" :key="item">
{{ item }}
<button @click="remove(item)">x</button>
</li>
</TransitionGroup>
</template>

<style>
.container {
position: relative;
padding: 0;
list-style-type: none;
}

.item {
width: 100%;
height: 30px;
background-color: #f3f3f3;
border: 1px solid #666;
box-sizing: border-box;
}

/* 1. declare transition */
.fade-move,
.fade-enter-active,
.fade-leave-active {
transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1);
}

/* 2. declare enter from and leave to state */
.fade-enter-from,
.fade-leave-to {
opacity: 0;
transform: scaleY(0.01) translate(30px, 0);
}

/* 3. ensure leaving items are taken out of layout flow so that moving
animations can be calculated correctly. */
.fade-leave-active {
position: absolute;
}
</style>

這是一個段範例代碼演示如何使用內建的 <TransitionGroup> 來實現 FLIP 列表過渡效果

<script setup>

import { shuffle as _shuffle } from 'lodash-es'
import { ref } from 'vue'

這行代碼從 lodash-es 庫中引入 shuffle 函數並重命名為 _shuffle,同時從 vue 庫中引入 ref 函數。

const getInitialItems = () => [1, 2, 3, 4, 5]
const items = ref(getInitialItems())
let id = items.value.length + 1

這裡定義了一個函數 getInitialItems,返回一個初始數組 [1, 2, 3, 4, 5]items 是一個響應式變量,用這個初始數組來初始化。id 是一個變量,用來跟踪新的項目的 ID,初始值為 items 的長度加 1。

function insert() {
const i = Math.round(Math.random() * items.value.length)
items.value.splice(i, 0, id++)
}

這個 insert 函數會在 items 的隨機位置插入一個新的項目,並使用 id 作為這個新項目的值,插入後 id 自增。

function reset() {
items.value = getInitialItems()
id = items.value.length + 1
}

這個 reset 函數會重置 items 為初始值,並重新設置 id

function shuffle() {
items.value = _shuffle(items.value)
}

這個 shuffle 函數會隨機打亂 items 的順序,使用的是 _shuffle 函數。

function remove(item) {
const i = items.value.indexOf(item)
if (i > -1) {
items.value.splice(i, 1)
}
}

這個 remove 函數會從 items 中移除指定的 item,如果找到該項目就使用 splice 方法移除它。

<template>

<button @click="insert">Insert at random index</button>
<button @click="reset">Reset</button>
<button @click="shuffle">Shuffle</button>

<TransitionGroup tag="ul" name="fade" class="container">
<li v-for="item in items" class="item" :key="item">
{{ item }}
<button @click="remove(item)">x</button>
</li>
</TransitionGroup>

在這個模板部分,有三個按鈕,分別用來插入新項目、重置和隨機打亂項目。使用 @click 綁定這些按鈕的點擊事件來調用相應的函數。

<TransitionGroup> 是一個 Vue 組件,用來給列表項目添加過渡效果。tag="ul" 指定這個組件渲染為一個 ul 標籤,name="fade" 是過渡效果的名稱,class="container" 設置了這個組件的 CSS 類。

<li v-for="item in items" 用來遍歷 items,每個項目渲染為一個 li,並設置了 key 屬性以幫助 Vue 跟踪這些項目。每個項目還有一個按鈕用來移除它。

<style>

<style>
.container {
position: relative;
padding: 0;
list-style-type: none;
}

.item {
width: 100%;
height: 30px;
background-color: #f3f3f3;
border: 1px solid #666;
box-sizing: border-box;
}

/* 1. declare transition */
.fade-move,
.fade-enter-active,
.fade-leave-active {
transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1);
}

/* 2. declare enter from and leave to state */
.fade-enter-from,
.fade-leave-to {
opacity: 0;
transform: scaleY(0.01) translate(30px, 0);
}

/* 3. ensure leaving items are taken out of layout flow so that moving
animations can be calculated correctly. */
.fade-leave-active {
position: absolute;
}
</style>

.container 類用來設置 ul 元素的樣式,設置 positionrelative,取消內邊距,並取消列表樣式。

.item 類用來設置 li 元素的樣式,設置寬度為 100%、高度為 30px、背景顏色、邊框和 box-sizing

.fade-move, .fade-enter-active,.fade-leave-active樣式用來設置過渡效果,transition 屬性設置了所有屬性的過渡時間為 0.5 秒,使用了 cubic-bezier 緩動函數。

.fade-enter-from, .fade-leave-to這段樣式設置了進入和離開時的狀態,設置透明度為 0,並縮放和移動元素。

.fade-leave-active這段樣式確保離開的項目從佈局流中移出,以便計算移動動畫。

什麼是Transition Group?

官方文件

在使用 Vue 的 <TransitionGroup><Transition> 組件來實現過渡效果時,CSS 樣式的宣告需要針對過渡效果的不同階段進行設置。這些階段的 CSS 類名遵循一定的命名規則。以下是如何知道哪些要宣告在 style 中,以及這些類名的用途:

過渡效果的名稱

當你在 <TransitionGroup><Transition> 組件中設置 name 屬性時,這個名稱會被用作 CSS 類名的前綴。例如,name="fade" 將會對應到 fade-enter-activefade-enter-from 等 CSS 類名。

CSS 類名結構

Vue 使用特定的類名來表示過渡的不同階段:

  1. 進入過渡 (Enter Transition)
    • -enter-active:進入過渡的激活狀態,定義過渡效果。
    • -enter-from:進入過渡的起始狀態,元素在這個狀態開始過渡。
    • -enter-to:進入過渡的結束狀態,當過渡完成後元素會在這個狀態。
  2. 離開過渡 (Leave Transition)
    • -leave-active:離開過渡的激活狀態,定義過渡效果。
    • -leave-from:離開過渡的起始狀態,元素在這個狀態開始過渡。
    • -leave-to:離開過渡的結束狀態,當過渡完成後元素會在這個狀態。
  3. 移動過渡 (Move Transition)
    • -move:在 <TransitionGroup> 中移動元素時的狀態。

如何設置這些類名

你需要在 <style> 標籤中定義這些類名的樣式,來控制過渡效果。以下是一些範例:

<style>
/* 1. 宣告過渡效果 */
.fade-enter-active,
.fade-leave-active {
transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1);
}

/* 2. 宣告進入的起始和終止狀態 */
.fade-enter-from {
opacity: 0;
transform: scaleY(0.01) translate(30px, 0);
}
.fade-enter-to {
opacity: 1;
transform: scaleY(1) translate(0, 0);
}

/* 3. 宣告離開的起始和終止狀態 */
.fade-leave-from {
opacity: 1;
transform: scaleY(1) translate(0, 0);
}
.fade-leave-to {
opacity: 0;
transform: scaleY(0.01) translate(30px, 0);
}

/* 4. 確保離開的項目從佈局流中移出 */
.fade-leave-active {
position: absolute;
}
</style>
很方便的動畫效果,感覺做一些簡單的小遊戲應該也是可以?
有機會練習一下各種動畫效果,看看他的極限好了www
會移動真好玩 www~~
動畫效果 List with Transitions

動畫效果 List with Transitions


avatar-img
2會員
70內容數
分享生活趣事~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
卡關的人生 的其他內容
透過 Vue 3,可以輕鬆實現模態對話框。在 App.vue 中,使用按鈕來顯示模態視窗,並利用 Teleport 將其渲染到 body 中。在 Modal.vue 中,透過插槽提供自定義標題、主體和頁腳,並使用 Transition 組件添加顯示和隱藏的過渡效果。
引入 PolyGraph 子組件,並使用 ref 和 reactive 來管理標籤及其對應值。AxisLabel.vue 負責顯示每個統計數據標籤,並根據數據計算其在圖形中位置。PolyGraph.vue 則負責繪製多邊形和圓形,並透過 valueToPoint 函數將統計數據轉換為 SVG 坐標。
Tree View 是一種適合於建立父子組件關係的結構,能夠展示多層級的數據,特別適合遞回渲染。這個組件允許用戶雙擊項目將其轉換為文件夾,並通過 TreeItem 組件遞歸渲染子項目。
在 Vue 3 中使用計算屬性來實現表格的排序和篩選功能。通過創建一個可重用的表格組件(DemoGrid),可以輕鬆管理和顯示外部數據。
這段代碼示範了如何從 GitHub 的 API 抓取最新的 Vue.js 提交數據並顯示在網頁上。這是後端 API 串接的一個範例,展示了如何動態地獲取和顯示數據。
看官方文件好累,終於要來看實用範例摟!這篇要做一個Markdown編輯器,真的假的?!
透過 Vue 3,可以輕鬆實現模態對話框。在 App.vue 中,使用按鈕來顯示模態視窗,並利用 Teleport 將其渲染到 body 中。在 Modal.vue 中,透過插槽提供自定義標題、主體和頁腳,並使用 Transition 組件添加顯示和隱藏的過渡效果。
引入 PolyGraph 子組件,並使用 ref 和 reactive 來管理標籤及其對應值。AxisLabel.vue 負責顯示每個統計數據標籤,並根據數據計算其在圖形中位置。PolyGraph.vue 則負責繪製多邊形和圓形,並透過 valueToPoint 函數將統計數據轉換為 SVG 坐標。
Tree View 是一種適合於建立父子組件關係的結構,能夠展示多層級的數據,特別適合遞回渲染。這個組件允許用戶雙擊項目將其轉換為文件夾,並通過 TreeItem 組件遞歸渲染子項目。
在 Vue 3 中使用計算屬性來實現表格的排序和篩選功能。通過創建一個可重用的表格組件(DemoGrid),可以輕鬆管理和顯示外部數據。
這段代碼示範了如何從 GitHub 的 API 抓取最新的 Vue.js 提交數據並顯示在網頁上。這是後端 API 串接的一個範例,展示了如何動態地獲取和顯示數據。
看官方文件好累,終於要來看實用範例摟!這篇要做一個Markdown編輯器,真的假的?!
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
先學習 HTML, CSS, JavaScript 基礎觀念, 再透過實作專案,慢慢熟悉不同的語法使用方式。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
先學習 HTML, CSS, JavaScript 基礎觀念, 再透過實作專案,慢慢熟悉不同的語法使用方式。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找