css animation 动画如何保留动画结束后的状态 animation-fill-mode: forwards

css animation 动画如何保留动画结束后的状态 animation-fill-mode: forwards

一、问题描述

在做一个弹窗动画提示的时候遇到了一个问题:

在动画结束的时候,移除元素时会有闪一下的问题,像这样,有残留的痕迹。

我的动画结尾是这样的:

css 复制代码
  from {
    -webkit-transform: translate3d(0, 0, 0) translateX(-50%);
    transform: translate3d(0, 0, 0) translateX(-50%);
  }

  to {
    visibility: hidden;
    opacity: 0;
    -webkit-transform: translate3d(0, -100%, 0) translateX(-50%);
    transform: translate3d(0, -100%, 0) translateX(-50%);
  }

可以看到结尾的时候已经是 hidden 的状态了,按理说应该不会再显示原来的状态。

二、原因和解决

其实这是里少了一个定义动画的属性,定义动画结束之后是保留动画后的状态,还是回到原来的状态,默认是恢复到原来的状态。

像上面这个例子,在动画结束的时候就立即恢复到原来可见的状态,js 来不及移除。用 js 卡点删除元素是无法实现很丝滑的效果的。

css 复制代码
.slideOutUpPopMessage {
  -webkit-animation-name: slideOutUpPopMessage;
  animation-name: slideOutUpPopMessage;
  animation-fill-mode: forwards;
}

需要在动画的 class 上添加这样一个属性: animation-fill-mode ,意思是结束之后保留哪个状态。

forwars 就是保留动画结束后的状态,比如上面例子结束之后元素处于 hidden 的状态,这样即使没有用 js 移除这个元素,它也是不可见的。

这样在之后任意时间移除它就可以了。

三、完整 css

使用的时候:

  1. 元素提前放入 .animated .animated-fase
  2. 在显示的时候添加 .slideInDownPopMessage
  3. 元素显示之后删除 .slideInDownPopMessage
  4. 元素正常显示 n 秒,n 秒过后添加 .slideOutUpPopMessage
  5. 在元素消失之后再用 js 移除当前元素即可。
css 复制代码
.animated{
  animation-duration: .51s;
}

.animated-fast{
  animation-duration: .15s;
}


@-webkit-keyframes slideInDownPopMessage {
  from {
    -webkit-transform: translate3d(0, -100%, 0) translateX(-50%);
    transform: translate3d(0, -100%, 0) translateX(-50%);
    visibility: visible;
    opacity: 0;
  }

  to {
    -webkit-transform: translate3d(0, 0, 0) translateX(-50%);
    transform: translate3d(0, 0, 0) translateX(-50%);
    visibility: visible;
    opacity: 1;
  }
}

@keyframes slideInDownPopMessage {
  from {
    -webkit-transform: translate3d(0, -100%, 0) translateX(-50%);
    transform: translate3d(0, -100%, 0) translateX(-50%);
    visibility: visible;
    opacity: 0;
  }

  to {
    -webkit-transform: translate3d(0, 0, 0) translateX(-50%);
    transform: translate3d(0, 0, 0) translateX(-50%);
    visibility: visible;
    opacity: 1;
  }
}

.slideInDownPopMessage {
  -webkit-animation-name: slideInDownPopMessage;
  animation-name: slideInDownPopMessage;
}


@-webkit-keyframes slideOutUpPopMessage {
  from {
    -webkit-transform: translate3d(0, 0, 0) translateX(-50%);
    transform: translate3d(0, 0, 0) translateX(-50%);
  }

  to {
    visibility: hidden;
    opacity: 0;
    -webkit-transform: translate3d(0, -100%, 0) translateX(-50%);
    transform: translate3d(0, -100%, 0) translateX(-50%);
  }
}

@keyframes slideOutUpPopMessage {
  from {
    -webkit-transform: translate3d(0, 0, 0) translateX(-50%);
    transform: translate3d(0, 0, 0) translateX(-50%);
  }

  to {
    visibility: hidden;
    opacity: 0;
    -webkit-transform: translate3d(0, -100%, 0) translateX(-50%);
    transform: translate3d(0, -100%, 0) translateX(-50%);
  }
}

.slideOutUpPopMessage {
  -webkit-animation-name: slideOutUpPopMessage;
  animation-name: slideOutUpPopMessage;
  animation-fill-mode: forwards;
}
相关推荐
brzhang4 小时前
我操,终于有人把 AI 大佬们 PUA 程序员的套路给讲明白了!
前端·后端·架构
止观止5 小时前
React虚拟DOM的进化之路
前端·react.js·前端框架·reactjs·react
goms5 小时前
前端项目集成lint-staged
前端·vue·lint-staged
谢尔登5 小时前
【React Natve】NetworkError 和 TouchableOpacity 组件
前端·react.js·前端框架
Lin Hsüeh-ch'in5 小时前
如何彻底禁用 Chrome 自动更新
前端·chrome
augenstern4167 小时前
HTML面试题
前端·html
张可7 小时前
一个KMP/CMP项目的组织结构和集成方式
android·前端·kotlin
G等你下课8 小时前
React 路由懒加载入门:提升首屏性能的第一步
前端·react.js·前端框架
蓝婷儿9 小时前
每天一个前端小知识 Day 27 - WebGL / WebGPU 数据可视化引擎设计与实践
前端·信息可视化·webgl
然我9 小时前
面试官:如何判断元素是否出现过?我:三种哈希方法任你选
前端·javascript·算法