css实现层次显示的菜单动画

需求

一个下拉菜单每一条都从左到右显示,从右到左隐藏,后边比前边有一定的延迟。

思路

其实所有菜单项都在执行一个左右移动的动画,所以只需要写两个@keyframe

@keyframes show {
    0% {
        transform: translateX(-256px);
    }
    100% {
        transform: translateX(0);
    }
}
@keyframes hide {
    0% {
        transform: translateX(-256px);
    }
    100% {
        transform: translateX(0);
    }
}

在菜单展开的时候,添加类名onShow,执行show动画,隐藏时候添加类名onHIde,执行hide动画;

每项菜单添加动画延迟animation-delay,形成层次感。另外收起时应该最后一条先收回,animation-delay也要反向赋值了;

为什么这里要写两个动画而不使用animation-direction:alternate反向执行动画呢,这是因为后边需要使用到animation-fill-mode: both保持动画最后一帧。

结果

HTML
        <div
            class="nav_button"
            @click.stop="showNav=!showNav"
        ></div>
        <div
            class="nav_list"
            // 初始化showNav为null,否则刚进入页面就会执行一次动画
            v-if="showNav!=null"
        >
            <div
                class="nav_item"
                :class="{'active':curIndex == index,'onShow':showNav,'onHide':!showNav}"
                :style="{
                    'animation-delay':((showNav?index:(navList.length-index))+1)*0.5/navList.length+'s',
                    'animation-duration':'0.2s'
                    // 这里可以如果想固定时间的话
                    // 'animation-duration':1/navList.length 's'
                }"
                v-for="(item,index) in product.menuList"
                :key="index"
                @click="changeProduct(item,index)"
            >
                <span>{{item.name}}</span>
            </div>
        </div>
CSS
    .onShow {
        transform: translateX(0);
        animation-name: show;
        animation-timing-function: linear;
        animation-fill-mode: both;
    }
    .onHide {
        transform: translateX(-256px);
        animation-name: hide;
        animation-timing-function: linear;
        animation-fill-mode: both;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. transform 通过transform转换,我们能够对元素进行移动(translate)、旋转(rota...
    nimw阅读 475评论 0 0
  • 过渡:就相当于在点击或者滑动等等动作时,css进行样式改变的动画。一个元素,它的属性从一个值变化到另一个值。 tr...
    Sallyscript阅读 421评论 0 0
  • 在CSS3中,有一个新的属性可以用来做一些简单的动画效果,这就是animation,中文意思就是动画。 一、首先我...
    大春春阅读 3,368评论 1 9
  • 说到动画,其实很多人心中都会有一种抵触的情绪 总是认为动画并不是项目内需要的。并且动画也不一定是项目内必须的东西,...
    KlivitamJ阅读 533评论 0 0
  • CSS动画 CSS动画允许大多数HTML元素的动画,而无需使用JavaScript或Flash! 动画浏览器支持 ...
    web全栈阅读 497评论 0 0