用 Vue 动画来实现登录/注册框的展示与折叠

这是在做项目时遇到的一个问题,在这里对其产生的原因、解决办法以及搜索资料获得的信息进行汇总与总结。

1.需求

想通过改变上下两个div的高度来实现登录/注册框的展示与折叠。

2. 用 v-show 实现

            <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">创建账号</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. 登录和注册框会同时出现然后另一个消失,太过僵硬。

原因
v-show的本质是利用布尔值来操控 display:none;display:block; 的,display的值改变会引起HTML画布的重绘,所以是不会有动画效果的。

3. 通过改变 height 来实现

由于登录与注册框需要来回切换,所以将 v-show 改成绑定的一个 class ,通过标志位来切换显示哪一个。

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

将登录与注册框的高度都设置为0,通过 class="show" 来进行切换。

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

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

效果
能够较为丝滑的展开、折叠登录与注册框。

4. 参考与扩展

在搜索过程中主要参考了以下博客:
Vue | 显示切换(v-if与v-show,display,visibility与opacity)_MGsniper的博客
&符号该怎么用?_Milk595的博客-CSDN博客
在看博客的同时明白了一些知识点,在这里做些笔记。

4.1 显示切换(v-if与v-show,display,visibility与opacity)

  • v-show:实际就是根据绑定的布尔数据,对元素进行动态添加或取消“display:none”进行显示切换的。
    当节点的属性为display:none时,其自身与后代节点不再生成盒模型以占位,但html节点并没有真的被删除。
    当祖先节点为display:none时,后代节点均受影响,且重写子节点display属性无效。
  • v-if:与v-show不同的是,v-if是根据条件渲染元素,一旦不满足条件,元素则会直接被删除。
  • 动态绑定visibility,通过修改“visibility”属性实现显示切换。
    visibility:visibility属性不影响元素占位。hidden可让元素生成不可见盒,元素虽不可见,但仍生成盒模型,保持占位,布局不塌陷。
    子元素默认继承父元素visibility属性,但子元素若重写属性,则不受父级影响。
  • opacity属性仅改变元素的透明度,不影响元素的占位。
    opacity属性不可继承,但祖先元素的opacity会影响后代。后代元素的opacity取最小值显示。若祖先元素opacity为0,后代为1,则0生效。若祖先为1,后代为0.5,则0.5生效。
    opacity属性不影响事件触发。

4.2 & 符号

这是less、sass语法,& 表示嵌套的上一级选择器。

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

.border.top 是串联选择器,作用在同一标签。
.border .color 是后代选择器,作用在不同标签上。

4.3 实现display:block“过渡动画”

vue 数字动画递增_一行代码实现display"过渡动画"原理_weixin_39707478的博客-CSDN博客
大致是通过访问特殊api来清空队列,让 display:block; 快速渲染,然后动画就可以根据 block 来进行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容