用 Vue 動畫來實(shí)現(xiàn)登錄/注冊框的展示與折疊

這是在做項(xiàng)目時遇到的一個問題,在這里對其產(chǎn)生的原因凑保、解決辦法以及搜索資料獲得的信息進(jìn)行匯總與總結(jié)冈爹。

1.需求

想通過改變上下兩個div的高度來實(shí)現(xiàn)登錄/注冊框的展示與折疊。

2. 用 v-show 實(shí)現(xiàn)

            <transition name="slide">
              <div v-bind:class="{ show: isShowRegister }" class="register">
                <input type="text" v-model="register.username" placeholder="用戶名">
                <input type="password" v-model="register.password" @keyup.enter="onRegister" placeholder="密碼">
                <p v-bind:class="{ error: register.isError }"> {{ register.notice }}</p>
                <div class="button" @click="onRegister">創(chuàng)建賬號</div>
              </div>
            </transition>
            <h3 @click="showLogin">登錄</h3>
            <transition name="slide">
              <div v-bind:class="{ show: isShowLogin }" class="login">
                <input type="text" v-model="login.username" placeholder="輸入用戶名">
                <input type="password" v-model="login.password" @keyup.enter="onLogin" placeholder="密碼">
                <p v-bind:class="{ error: login.isError }"> {{ login.notice }}</p>
                <div class="button" @click="onLogin"> 登錄</div>
              </div>
            </transition>

CSS部分

    .login, .register {
        padding: 0px 20px;
        border-top: 1px solid #eee;
        // height: 0;
        overflow: hidden;
        transition: height .4s;

        .slide-enter-active {
            animation: slide-in .5s;
        }

        .slide-leave-active {
            animation: slide-in .5s reverse;
        }

        @keyframes slide-in {
            0% {
                height: 0px;
            }
            100% {
                height: 200px;
            }
        }
      ...
      }

效果

  1. 讓 css 動畫效果失效
  2. 登錄和注冊框會同時出現(xiàn)然后另一個消失欧引,太過僵硬频伤。

原因
v-show的本質(zhì)是利用布爾值來操控 display:none;display:block; 的,display的值改變會引起HTML畫布的重繪芝此,所以是不會有動畫效果的憋肖。

3. 通過改變 height 來實(shí)現(xiàn)

由于登錄與注冊框需要來回切換因痛,所以將 v-show 改成綁定的一個 class ,通過標(biāo)志位來切換顯示哪一個岸更。

<div v-bind:class="{ show: isShowRegister }" class="register">
<div v-bind:class="{ show: isShowLogin }" class="login">

將登錄與注冊框的高度都設(shè)置為0鸵膏,通過 class="show" 來進(jìn)行切換。

    .login,
    .register {
      padding: 0px 20px;
      border-top: 1px solid #eee;
      height: 0;
      overflow: hidden;
      transition: height .4s;

      &.show {
        height: 193px;
      }
      ...
      }

效果
能夠較為絲滑的展開怎炊、折疊登錄與注冊框拒担。

4. 參考與擴(kuò)展

在搜索過程中主要參考了以下博客:
Vue | 顯示切換(v-if與v-show,display,visibility與opacity)_MGsniper的博客
&符號該怎么用彻采?_Milk595的博客-CSDN博客
在看博客的同時明白了一些知識點(diǎn)响谓,在這里做些筆記陕赃。

4.1 顯示切換(v-if與v-show,display,visibility與opacity)

  • v-show:實(shí)際就是根據(jù)綁定的布爾數(shù)據(jù),對元素進(jìn)行動態(tài)添加或取消“display:none”進(jìn)行顯示切換的瓜挽。
    當(dāng)節(jié)點(diǎn)的屬性為display:none時盹廷,其自身與后代節(jié)點(diǎn)不再生成盒模型以占位,但html節(jié)點(diǎn)并沒有真的被刪除久橙。
    當(dāng)祖先節(jié)點(diǎn)為display:none時俄占,后代節(jié)點(diǎn)均受影響,且重寫子節(jié)點(diǎn)display屬性無效剥汤。
  • v-if:與v-show不同的是颠放,v-if是根據(jù)條件渲染元素,一旦不滿足條件吭敢,元素則會直接被刪除碰凶。
  • 動態(tài)綁定visibility,通過修改“visibility”屬性實(shí)現(xiàn)顯示切換鹿驼。
    visibility:visibility屬性不影響元素占位欲低。hidden可讓元素生成不可見盒,元素雖不可見畜晰,但仍生成盒模型砾莱,保持占位,布局不塌陷凄鼻。
    子元素默認(rèn)繼承父元素visibility屬性腊瑟,但子元素若重寫屬性,則不受父級影響块蚌。
  • opacity屬性僅改變元素的透明度闰非,不影響元素的占位。
    opacity屬性不可繼承峭范,但祖先元素的opacity會影響后代财松。后代元素的opacity取最小值顯示。若祖先元素opacity為0,后代為1辆毡,則0生效菜秦。若祖先為1,后代為0.5舶掖,則0.5生效球昨。
    opacity屬性不影響事件觸發(fā)。

4.2 & 符號

這是less访锻、sass語法褪尝,& 表示嵌套的上一級選擇器闹获。

.border {
    &.top{
    margin: 5px;
        }
    }
    .color{
    border-color: green;
        }
    }
}

.border.top 是串聯(lián)選擇器期犬,作用在同一標(biāo)簽。
.border .color 是后代選擇器避诽,作用在不同標(biāo)簽上龟虎。

4.3 實(shí)現(xiàn)display:block“過渡動畫”

vue 數(shù)字動畫遞增_一行代碼實(shí)現(xiàn)display"過渡動畫"原理_weixin_39707478的博客-CSDN博客
大致是通過訪問特殊api來清空隊(duì)列,讓 display:block; 快速渲染沙庐,然后動畫就可以根據(jù) block 來進(jìn)行鲤妥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拱雏,隨后出現(xiàn)的幾起案子棉安,更是在濱河造成了極大的恐慌,老刑警劉巖铸抑,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贡耽,死亡現(xiàn)場離奇詭異,居然都是意外死亡鹊汛,警方通過查閱死者的電腦和手機(jī)蒲赂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刁憋,“玉大人滥嘴,你說我怎么就攤上這事≈脸埽” “怎么了若皱?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尘颓。 經(jīng)常有香客問我走触,道長,這世上最難降的妖魔是什么泥耀? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任饺汹,我火速辦了婚禮,結(jié)果婚禮上痰催,老公的妹妹穿的比我還像新娘兜辞。我一直安慰自己迎瞧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布逸吵。 她就那樣靜靜地躺著凶硅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扫皱。 梳的紋絲不亂的頭發(fā)上足绅,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音韩脑,去河邊找鬼氢妈。 笑死,一個胖子當(dāng)著我的面吹牛段多,可吹牛的內(nèi)容都是我干的首量。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼进苍,長吁一口氣:“原來是場噩夢啊……” “哼加缘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起觉啊,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拣宏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杠人,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勋乾,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年搜吧,在試婚紗的時候發(fā)現(xiàn)自己被綠了市俊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡滤奈,死狀恐怖摆昧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜒程,我是刑警寧澤绅你,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站昭躺,受9級特大地震影響忌锯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜领炫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一偶垮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦似舵、人聲如沸脚猾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽龙助。三九已至,卻和暖如春蛛芥,著一層夾襖步出監(jiān)牢的瞬間提鸟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工仅淑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留称勋,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓漓糙,卻偏偏與公主長得像铣缠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昆禽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容