日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

Vue中实现菜单下拉、收起的动画效果

發(fā)布時(shí)間:2024/8/26 综合教程 23 生活家
生活随笔 收集整理的這篇文章主要介紹了 Vue中实现菜单下拉、收起的动画效果 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

菜單的下拉和收起動(dòng)畫(huà),看起來(lái)好像比較簡(jiǎn)單,但是搞了半天。

最后可以使用的代碼:

        <transition
          name="default"
          v-on:enter="menuEnter"
          v-on:leave="menuLeave"
          enter-class="default-enter"
          leave-to-class="default-leave-to"
        >
          <ul v-if="hasChildren(node, index)" class="menu-l2">
            <li
              v-for="(subnode, subIndex) in node.children"
              :key="subnode.id"
              @click.prevent="handleChildNodeClick(subnode, subIndex)"
              class="node-l2"
              :class="{ 'node-l2-active' : (subIndex == activeChildNodeIndex)}"
            >{{ subnode.name }}</li>
          </ul>
        </transition>

js,這里是vue中的methods部分

    menuEnter: function(el, done) {
    //這行是關(guān)鍵
      el.offsetWidth;
      el.style.maxHeight =  this.nodes[this.activeParentNodeIndex].children.length * 4 + "rem";
      el.style.transition = "all 0.3s ease-in";
      done();
    },
    menuLeave: function(el) {
      el.offsetWidth;
      el.style.maxHeight = 0;
      el.style.transition = "all 0.3s ease-out";
    }

css:

//transitions
.default-enter-active {
    transition: all 0.3s ease-in;
}

.default-leave-active {
    transition: all 0.3s ease-out;
}

.default-enter,
.default-leave-to {
    max-height: 0;
}

說(shuō)明

這里結(jié)合了js和css,其實(shí)只用js也可以,但是稍微麻煩。

只用css也可以,但是效果會(huì)稍微差一些(后面會(huì)解釋?zhuān)?/p>


這里實(shí)現(xiàn)下拉和收起,利用的css的transition
vue中定義了三個(gè)狀態(tài),對(duì)應(yīng)顯示,分別是(事件/css類(lèi))

before-enter/v-enter:動(dòng)畫(huà)開(kāi)始/初始狀態(tài)
enter/v-enter-active:動(dòng)畫(huà)過(guò)程/中間狀態(tài)
after-enter/v-enter-to:動(dòng)畫(huà)結(jié)束/結(jié)束狀態(tài)

對(duì)于隱藏(leave)也同樣

計(jì)算過(guò)度高度

這里對(duì)于顯示,利用的是max-height屬性,第一個(gè)關(guān)鍵點(diǎn)在于,初始狀態(tài)max-height設(shè)置為0,在中間狀態(tài)設(shè)置為下拉框的實(shí)際大小。這樣才會(huì)出現(xiàn)高度變化的下拉效果。

這也就是為什么使用js hook,而不是直接使用css的原因呢,因?yàn)樽硬藛胃叨葻o(wú)法確切知道,如果對(duì)效果不敏感,可以直接指定一個(gè)較大的max-height,但是為了效果好,還是根據(jù)菜單長(zhǎng)度確定過(guò)度最好。

控制頁(yè)面刷新

第二個(gè)關(guān)鍵點(diǎn)在于 el.offsetWidth;這一句看似無(wú)用的代碼,不加的話,瀏覽器不會(huì)有動(dòng)畫(huà)效果,加上以后,按照網(wǎng)上的說(shuō)法,會(huì)強(qiáng)制觸發(fā)繪制。

其實(shí)在vue的官方文檔有提到

When using JavaScript-only transitions, the done callbacks are required for the enter and leave hooks. Otherwise, the hooks will be called synchronously and the transition will finish immediately.

但是我測(cè)試了一下,調(diào)用done()還是沒(méi)有效果,不清楚原因。

總結(jié)

以上是生活随笔為你收集整理的Vue中实现菜单下拉、收起的动画效果的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。