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

2020-07-15  本文已影响0人  变异宝宝

需求

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

思路

其实所有菜单项都在执行一个左右移动的动画,所以只需要写两个@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;
    }
上一篇下一篇

猜你喜欢

热点阅读