精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vuejs高度的改變動畫探索:折疊面板Collapse組件的優秀實現方案

開發 前端
如何才能實現元素高度的改變動畫效果呢?本篇文章將為大家提供一個基于Vue3的非常簡潔的解決方案。

使用過CSS transition屬性的童鞋們應該都清楚,當元素在過渡開始或者結束時的高度為auto時,動畫是不生效的;那么如何才能實現元素高度的改變動畫效果呢?本篇文章將為大家提供一個基于Vue3的非常簡潔的解決方案。

要實現高度的改變動畫,我們需要在動畫進行之前為元素設置準確的高度。

當元素由可見變為隱藏狀態時,我們需要先獲取元素的計算高度,將其設置到style屬性上,然后執行一個觸發瀏覽器渲染引擎重繪的動作,然后再將高度設置為0,這樣高度的改變動畫就會正常進行。

當元素由隱藏變為可見狀態時,我們需要先將高度設置為auto,然后獲取元素的計算高度,再將高度設置為0,然后執行一個觸發瀏覽器渲染引擎重繪的動作,然后再將高度設置為計算高度,這樣高度的改變動畫就會正常進行。

現在,根據以上實現原理分析,我們創建一個高度的改變動畫通用組件CollapseTransition.vue。該組件非常簡單,僅需30多行代碼。我幾乎每行代碼都有注釋,大家應該能看懂吧?

<template>
<transition v-bind="listeners">
<!--visible的值發生改變時,過渡組件的監聽器就會觸發 -->
<div v-show="visible" class="x-collapse-transition">
<slot />
</div>
</transition>
</template>
<script setup>
defineProps({ visible: Boolean })
const listeners = {
// 元素由隱藏變為可見
onEnter (/** @type {HTMLElement} */ el) {
el.style.height = 'auto' // 將高度設為auto,是為了獲取該元素的計算高度
const endHeight = window.getComputedStyle(el).height // 計算高度
el.style.height = '0px' // 將高度再設置為0
el.offsetHeight // 強制重繪,重繪后再改變高度才會產生動畫
el.style.height = endHeight // 設置為計算高度
},
onAfterEnter (/** @type {HTMLElement} */ el) {
el.style.height = null // 過渡進入之后,將高度恢復為null
},
// 元素由可見變為隱藏
onLeave (/** @type {HTMLElement} */ el) {
el.style.height = window.getComputedStyle(el).height // 計算高度
el.offsetHeight // 強制重繪,重繪后再改變高度才會產生動畫
el.style.height = '0px' // 將高度設置為0
},
onAfterLeave (/** @type {HTMLElement} */ el) {
el.style.height = null // 過渡離開之后,將高度恢復為null
}
}
</script>
<style lang="scss">
.x-collapse-transition {
overflow: hidden;
transition: height .22s ease-in-out;
}
</style>

以上就是實現高度的改變動畫的通用組件源碼,童鞋們理解了嗎?是不是非常簡單?現在,我們實現折疊面板組件。使用過element-ui這樣的UI庫的童鞋們應該都知道,折疊面板是由兩個組件折疊面板Collapse和折疊面板項CollapseItem組合而成;

現在,我們先實現CollapseItem.vue組件。為了節省篇幅,我將源碼中的空行全部去掉了,縮進比較規范,自認為可讀性還行;源碼如下,一共30多行,我直接在源碼中添加了注釋,就不過多解釋了。

<template>
<div :class="[cls, { 'is-active': isActive }]">
<div :class="`${cls}_header`" @click="onToggle">
<div :class="`${cls}_title`">
<slot name="title">{{ title }}</slot>
</div>
<i :class="['x-icon-arrow-right', `${cls}_arrow`, { 'is-active': isActive }]"></i>
</div>
<x-collapse-transition :visible="isActive">
<div :class="`${cls}_content`">
<slot />
</div>
</x-collapse-transition>
</div>
</template>
<script setup>
import { computed, inject } from 'vue'
import { COLLAPSE_INJECT_KEY } from '../../constants' // 當它是個字符串常量就行
import { N, S, B } from '../../types' // N: Number, S: String, B: Boolean
import { genKey } from '../../utils' // 生成唯一性的數值key,之前的文章中有源碼
import XCollapseTransition from './CollapseTransition.vue' // 折疊動畫組件
const props = defineProps({
name: [S, N],
title: S,
disabled: B
})
const collapse = inject(COLLAPSE_INJECT_KEY, '') // 注入折疊面板組件提供的一些屬性和方法
const cls = 'x-collapse-item'
const idKey = computed(() => props.name || genKey()) // 如果沒提供name,我們生成一個key
const isActive = computed(() => collapse.includes(idKey.value)) // 是否展開狀態
function onToggle () { // 內容可見時隱藏,隱藏時可見
collapse.updateModel(idKey.value)
}
</script>

這是CollapseItem.vue組件的樣式。

@import './common/var.scss';
.x-collapse-item {
font-size: 13px;
background-color: #fff;
color: $--color-text-primary;
border-bottom: 1px solid $--border-color-lighter;
&:first-child {
border-top: 1px solid $--border-color-lighter;
}
&_header {
display: flex;
align-items: center;
justify-content: space-between;
height: 48px;
cursor: pointer;
}
&_content {
line-height: 1.8;
padding-bottom: 25px;
}
&_arrow {
margin-right: 8px;
transition: transform .2s;
&.is-active {
transform: rotate(90deg);
}
}
}

現在,我們實現Collapse.vue組件。該組件仍然只有30多行,大家理解起來應該很輕松,我就直接在源碼里添加注釋作為講解了。

<template>
<div class="x-collapse">
<slot />
</div>
</template>
<script setup>
import { provide, reactive, ref, watch } from 'vue'
import { COLLAPSE_INJECT_KEY } from '../../constants' // 一個字符串常量
import { S, B, A } from '../../types' // 參看CollapseItem組件
const props = defineProps({
modelValue: [S, A], // Vue3使用modelValue取代了Vue2中的value
accordion: B // 是否手風琴模式,手風琴模式只能有1個面板項是展開狀態
})
const emit = defineEmits(['update:modelValue', 'change'])
function emitValue (v) {
emit('update:modelValue', v) // 與props.modelValue結合實現雙向數據綁定
emit('change', v)
}
const model = ref(props.modelValue)
watch(() => props.modelValue, v => model.value = v)
provide(COLLAPSE_INJECT_KEY, { // 提供2個方法用于注入子組件,給子組件調用
includes (v) { // 根據面板的key,判斷是否包含該面板項
return props.accordion ? model.value === v : (model.value || []).includes(v)
},
updateModel (v) { // 更新面板項的內容折疊和展開狀態
const { value } = model
if (props.accordion) {
model.value = value === v ? null : v
emitValue(model.value)
} else {
if (!value) model.value = []
const index = model.value.indexOf(v)
index > -1 ? model.value.splice(index, 1) : model.value.push(v)
emitValue(model.value)
}
}
})
</script>

以上就是折疊面板組件的實現。包括折疊動畫組件,一共僅需不到150行代碼,是不是非常簡單?

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-07-12 06:05:27

NutUI折疊面板組件開發

2024-06-17 12:25:49

2023-02-20 09:48:00

CSS浮動布局

2010-01-22 18:14:49

VB.NET菜單組件

2020-02-04 09:31:43

Vue JS開發工具

2021-12-15 09:51:42

Web開發數據

2013-04-07 14:37:59

iOS開發可折疊tableVie

2023-05-10 10:46:51

技術CIO

2020-10-13 09:15:36

Web開發技術

2020-02-17 09:00:00

Angular甘特圖方案前端

2016-01-06 14:43:21

2022-03-15 23:55:33

混合云云計算遠程辦公

2023-08-18 10:22:24

2021-04-16 05:54:05

CSS 文字動畫技巧

2020-04-27 15:14:10

人工智能技術安全

2010-06-13 16:17:26

MySQL改變字符集

2023-10-27 14:25:26

組件庫無限可能性

2022-03-13 10:48:52

容器Docker容器管理軟件

2019-10-10 09:00:30

云端云遷移云計算

2022-04-20 12:08:17

容器安全漏洞網絡安全
點贊
收藏

51CTO技術棧公眾號

免费国产在线观看| 免费在线观看国产精品| 亚洲mmav| 亚洲欧洲三级电影| 国产女人水真多18毛片18精品| 国产一级二级毛片| 国产毛片一区二区三区| 6080yy午夜一二三区久久| 国产www免费| shkd中文字幕久久在线观看| 国产一区不卡视频| 欧洲美女免费图片一区| 国产精品丝袜一区二区| 国产日产精品一区二区三区四区的观看方式| 欧美日韩一区国产| 99爱视频在线| 激情在线视频播放| 国产精品色噜噜| 精品在线不卡| 国产成人三级在线播放| 日韩精品国产欧美| 欧美极品少妇与黑人| 波多野结衣欲乱| 美女网站一区| 亚洲韩国青草视频| 成人性生交免费看| 性欧美1819sex性高清| 亚洲成在人线免费| 亚洲国产精品女人| yw193.com尤物在线| av一区二区三区在线| 91免费在线视频| 中文字幕第31页| 午夜亚洲视频| 97超级碰碰碰久久久| 一区二区三区免费高清视频| 日韩欧美网址| 亚洲午夜精品久久久久久性色 | 91香蕉视频污在线观看| 国产精东传媒成人av电影| 欧美日韩一区二区三区在线看| 欧美日韩在线一| 调教一区二区| 亚洲六月丁香色婷婷综合久久 | 91手机在线播放| 国产原创中文av| 麻豆精品在线看| 国产精品久久综合av爱欲tv| 日韩手机在线视频| 国产亚洲福利| 青青a在线精品免费观看| 国产在线视频二区| 亚洲性图久久| 韩国日本不卡在线| 亚洲欧美在线视频免费| 激情欧美亚洲| 国外成人在线直播| 久久久久久久久久影院| 在线视频亚洲| 日本不卡视频在线播放| 亚洲欧美偷拍视频| 日韩成人dvd| 国产精品人人做人人爽| 亚洲视频一区在线播放| 激情偷乱视频一区二区三区| 91久久精品国产91久久| 国产三级小视频| 国产成人精品综合在线观看| 国产精品日韩欧美一区二区三区| 成人h动漫精品一区二区无码 | 亚洲影院在线| 国产精品96久久久久久又黄又硬 | 亚洲欧美电影| 欧美亚洲国产一区二区三区va | 六月丁香在线视频| 日本午夜精品视频在线观看 | 国产一级片黄色| 97人人做人人爽香蕉精品| 欧美日韩久久久| 亚洲女人在线观看| 精品国产乱子伦一区二区| 精品小视频在线| 成人在线观看免费高清| 国产精品国内免费一区二区三区| 欧美成人免费视频| 国产原创视频在线| 蜜臀va亚洲va欧美va天堂| 成人激情视频免费在线| 人妻一区二区三区四区| 久久久精品影视| 男女啪啪的视频| 97人人爽人人澡人人精品| 色噜噜狠狠色综合欧洲selulu| 欧美午夜aaaaaa免费视频| 国产午夜亚洲精品一级在线| 日韩av在线电影网| 亚洲aaa视频| 亚洲国内自拍| 成人国产精品免费视频| 天堂av在线资源| 日韩一区在线看| 丰满人妻中伦妇伦精品app| 亚洲欧美一级| 亚洲毛茸茸少妇高潮呻吟| 美国一级片在线观看| 亚洲免费精品| 亚洲一区二区三区在线免费观看| 四虎在线观看| 中文字幕在线不卡国产视频| 怡红院av亚洲一区二区三区h| 久久婷婷五月综合色丁香| 精品国产免费人成电影在线观看四季| 极品人妻videosss人妻| 黄色成人在线网站| 成人福利网站在线观看11| 男女污视频在线观看| 亚洲国产你懂的| 色网站在线视频| 日本欧美视频| 亲子乱一区二区三区电影| 免费看av毛片| 亚洲另类一区二区| 黄大色黄女片18第一次| 精品中文一区| 8090成年在线看片午夜| 亚洲a视频在线观看| 国产精品国产三级国产专播品爱网| 日本在线xxx| 试看120秒一区二区三区| 中文字幕亚洲情99在线| 丁香社区五月天| 97aⅴ精品视频一二三区| 欧美乱大交xxxxx潮喷l头像| 欧美不卡在线观看| 久久精品视频va| 国产精品尤物视频| 久久久久久久久久久黄色| 国产精品网站免费| 成人另类视频| 午夜精品久久久久久99热软件| 国产ts变态重口人妖hd| 国产精品精品国产色婷婷| 国产理论在线播放| 神马电影久久| 国产精品第七影院| 国产香蕉在线| 欧美色综合久久| 能直接看的av| 精品一区二区三区日韩| 亚洲精品永久www嫩草| 成人性片免费| 日韩中文在线中文网在线观看| 特级西西444www高清大视频| 国产欧美一区二区在线观看| 久久精品午夜福利| 精品av一区二区| 国产精品亚洲网站| 蜜桃视频网站在线观看| 56国语精品自产拍在线观看| 麻豆天美蜜桃91| 国产a区久久久| 成人黄色av片| 国产一区不卡| 91精品国产综合久久香蕉922| 顶级网黄在线播放| 欧美成人猛片aaaaaaa| 日本污视频在线观看| 97成人超碰视| 日韩一级理论片| 国产精品成人a在线观看| 91入口在线观看| 在线观看爽视频| 成人爽a毛片一区二区| 精品人伦一区二区三区蜜桃网站| 短视频在线观看| 蜜臀av一区二区| 精品人妻人人做人人爽| 思热99re视热频这里只精品| 国产精品日日摸夜夜添夜夜av| 麻豆影视在线观看_| 日韩精品综合一本久道在线视频| 日本中文字幕免费| 久久久99精品免费观看不卡| 亚洲一区二区在线视频观看| 国产真实久久| 日本一区二区免费看| 婷婷成人av| 性欧美亚洲xxxx乳在线观看| 国产区视频在线播放| 欧美一区二区私人影院日本| 国产成人自拍视频在线| 亚洲国产精品v| 中国xxxx性xxxx产国| 日韩av不卡一区二区| 成人高清dvd| 国产在线观看91一区二区三区| 成人免费激情视频| 91久久国产综合久久91猫猫| 久久精品国产欧美激情| 天堂中文在线视频| 欧美一二三四区在线| 国产精品久久久久久久久久久久久久久久久| 国产精品久久久久天堂| 国产 中文 字幕 日韩 在线| 老司机精品视频导航| 黄色网页免费在线观看| 国产精品成久久久久| 欧美自拍资源在线| 都市激情亚洲| 成人天堂噜噜噜| 香蕉成人影院| 91精品成人久久| 亚洲国产精品精华素| 尤物精品国产第一福利三区| 欧美性xxxx图片| 蜜桃视频在线观看一区二区| 日本手机在线视频| 99久久99热这里只有精品| 激情小说综合网| 国产精品高清一区二区| 国产精品久久久久久av福利| 高清精品在线| 久久99国产精品自在自在app| 成人免费在线观看| 日韩精品有码在线观看| 亚洲老妇色熟女老太| 91.com视频| 一区精品在线观看| 日本黄色一区二区| 久久久久99精品成人片我成大片| 亚洲一二三四在线| 欧美偷拍第一页| 中文字幕中文字幕在线一区 | 日韩a级大片| 国产精品区一区二区三在线播放| 国产精一区二区| 国产一区二区香蕉| 成人毛片免费| 国产精品视频999| 国产精品一区二区免费福利视频| 欧美一级成年大片在线观看| 182在线播放| 欧美极品第一页| av在线不卡免费| 久久久久久综合网天天| 美女航空一级毛片在线播放| 色综合久久悠悠| 日韩三级免费| 午夜精品一区二区三区在线视| 福利小视频在线| 992tv成人免费视频| av手机免费在线观看| 欧美精品福利在线| f2c人成在线观看免费视频| 久久久噜噜噜久久久| 成人爽a毛片免费啪啪动漫| 国内揄拍国内精品| 中文字幕在线中文字幕在线中三区| 45www国产精品网站| 日日夜夜天天综合| 国产日本欧美视频| 欧美大片91| 狠狠久久综合婷婷不卡| 偷拍精品福利视频导航| 日本高清一区| 99成人在线视频| 欧美中文字幕在线观看视频| 亚洲视频成人| 污网站免费在线| 丰满少妇久久久久久久| 欧美性xxxx图片| 国产精品第五页| 久久免费在线观看视频| 粉嫩av一区二区三区免费野| 波多野结衣在线观看视频| 欧美理论电影在线| 丰满肉嫩西川结衣av| 亚洲男人第一网站| 日本在线视频网| 国模叶桐国产精品一区| 成人黄色免费短视频| 成人中文字幕在线观看| 久草精品视频| 伊人久久大香线蕉av一区| 狠狠88综合久久久久综合网| 无码精品国产一区二区三区免费| 精品一区中文字幕| 亚洲熟女乱综合一区二区三区| 国产欧美日韩卡一| 美女毛片在线观看| 91精品福利视频| www.黄色av| 亚洲一区二区久久久| 手机在线免费观看av| 国产成人亚洲综合青青| 亚洲国产欧美国产第一区| 欧美不卡三区| 欧美日韩岛国| www.色偷偷.com| 成人短视频下载| 美女三级黄色片| 日韩欧美综合在线视频| 国产99999| 一区二区三区国产在线观看| 国内高清免费在线视频| 国产欧美精品一区二区三区介绍| 老司机aⅴ在线精品导航| 制服诱惑一区| 日韩电影一区二区三区四区| 一级少妇精品久久久久久久| 国产精品久久久久久久久搜平片| 国产精品久久久久久99| 日韩一级完整毛片| 天堂аⅴ在线地址8| 日韩美女视频中文字幕| 成人av综合网| 成人在线视频一区二区三区| 久色婷婷小香蕉久久| 尤物视频最新网址| 午夜视频一区在线观看| 国产免费一区二区三区最新不卡| 亚洲美女性视频| 黄视频免费在线看| 高清视频一区| 中文字幕乱码亚洲无线精品一区| 性欧美极品xxxx欧美一区二区| jiyouzz国产精品久久| 免费中文字幕视频| 日韩一二三区不卡| 国产丝袜在线| 91久久久国产精品| 99久久精品费精品国产| 午夜激情在线观看视频| www久久久久| 特级西西444www大精品视频免费看| 精品国产免费一区二区三区四区| 伊人精品影院| 99在线国产| 欧美日韩午夜| 日韩精品国产一区| 亚洲第一主播视频| 亚洲乱色熟女一区二区三区| 久久国产精品久久久久久| 成人在线视频www| 一级一片免费播放| 国产一区二区三区四区在线观看| 99热这里只有精品4| 91精品国产欧美一区二区18| 制服丝袜在线播放| 97人人模人人爽人人少妇| 欧美日韩国产精品一区二区亚洲| 亚洲丝袜在线观看| 亚洲在线成人精品| 三级网站免费观看| 欧美亚洲另类制服自拍| 免费成人网www| 国产精品拍拍拍| 1区2区3区国产精品| 国产福利免费视频| 性色av一区二区三区红粉影视| 免费福利视频一区| 久章草在线视频| 国产精品你懂的在线| 国产精品久久久久久免费免熟| 日韩一区二区av| av一级亚洲| 黄色一级大片在线观看| 欧美激情在线一区二区三区| 国产露脸国语对白在线| 久久久亚洲欧洲日产国码aⅴ| 青青草原在线亚洲| www.涩涩涩| 亚洲最色的网站| 青青草视频在线观看| 国产欧美一区二区三区视频| 午夜久久黄色| 中文字幕丰满孑伦无码专区| 欧美日韩成人高清| 神马午夜伦理不卡| 热re99久久精品国产99热| 国产一区二区在线看| 久久狠狠高潮亚洲精品| 深夜福利亚洲导航| 高潮按摩久久久久久av免费| 国产精品无码av无码| 亚洲精品日产精品乱码不卡| 五月婷婷六月激情| 成人免费视频网| 在线亚洲国产精品网站| 91香蕉国产视频| 日韩av一卡二卡| 国产精品久久久久久久久久久久久久久| 亚洲中文字幕无码av永久| 国产精品入口麻豆原神| 免费国产羞羞网站视频| 国产精品久久久久77777| 亚洲精选一区| 暗呦丨小u女国产精品| 亚洲欧美色图片| 福利欧美精品在线|