概述

css不能在display:none和display:block之间进行动画,并且也不能在height:0和height:auto之间进行动画。这里我研究了一下在display:none和display:block之间进行动画的解决方案,记录下来供以后开发时参考,相信对其他人也有用。

参考资料:

CSS3 Animation and Display None

解决transition动画与display冲突的几种方法

机制

我的理解是这样的:由于display:none会引起页面的重绘事件,所以它是一个异步的延时事件,所以浏览器其实会先解析animate的代码,然后再执行display:none。

这样就引发了一个问题:如果我们要设置类似淡入淡出的效果怎么办?就是让元素在消失/出现的同时产生动画怎么办?这里我研究了2个解决方案。

利用绝对定位和visiblity

不利用display:none,而是利用它的替代方式:

opacity: 0;
visibility: hidden;

但是这样会占据空间。如果不想占据空间的话,只能使用绝对定位,把元素独立出去。这个时候会有一个层叠问题,所以需要搭配z-index控制层叠关系使它出现或者消失。

示例如下:

//自身css效果
.animate {
position: absolute;
top: 0;
left: 0; transition: 1s;
opacity: 0;
visibility: hidden;
z-index: 0;
} //出现时的效果
.cur {
opacity: 1;
visibility: visible;
z-index: 10;
}

利用timeout

jquery里面也有淡入淡出的方法,它是怎么实现的呢?通过查资料可以知道,它是通过deferred对象通过延时display: none来实现的。好处是能够适用于出现时占据空间,消失时又不占据空间的情况。实例如下:

//css
.div {
display: none;
}
.div-animate1 {
display: block;
visibility: hidden;
opacity: 0;
transform: translate3d(100px, 0, 0);
transition: 1s;
}
.div-animate2 {
visibility: visible;
opacity: 1;
transform: translate3d(0, 0, 0);
} //js
function divAnimate1($div, divClass1, divClass2) {
$div.addClass(divClass1); setTimeout(function(){
$div.addClass(divClass2);
});
}
function divAnimate2($div, divClass1, divClass2) {
$div.removeClass(divClass2); setTimeout(function(){
$div.removeClass(divClass1);
}, 1000); //1s是动画时间。
}

其它

我还试过用transitionend事件,window.requestanimationframe来实现,但是都或多或少的有副作用。

另外总结一下:

  1. 如果消失前后都需要占据空间,则用visiblity。
  2. 如果消失前后都不需要占据空间,则用绝对定位和visiblity。
  3. 如果消失前需要占据空间但是消失后不需要占据空间,则用timeout和visiblity。

最新文章

  1. 【转】五种常见的 PHP 设计模式
  2. Norflash控制器的Verilog建模之三(測試)
  3. Oracle常见错误
  4. iBatis 中 Like 的写法实现模糊查询
  5. C# App.config 自定义 配置节 报错“配置系统未能初始化” 解决方法
  6. Oracle学习.Windows 命令行 启动ORACLE服务与实例
  7. Android应用开发提高篇(2)-----文本朗读TTS(TextToSpeech)
  8. Spring EL中的类操作符
  9. 关于JS的DOM操作——重要实例的操作
  10. Android Studio打开SDK更新对话框
  11. shell基础:数值运算与运算符
  12. 40.SEO----前端该懂的seo技巧
  13. django models数据库操作
  14. 假期训练五(poj-1077bfs+康拓展开,hdu-2577dp)
  15. js insertBefore
  16. Linux操作系统上ADSL拨号上网的方法详解
  17. 未能从程序集 C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Data.Entity.Build.Tasks.dll 加载任务“EntityClean”
  18. 7)Linux程序设计入门--网络编程
  19. ConcurrentHashMap弱一致性
  20. SWFupload在IE9以上中的bug

热门文章

  1. 数据库中多对多关系的处理 User---Role
  2. 迭代器模块 itertools
  3. python 路径处理
  4. gdbserver
  5. 动画之一:视图动画 View Animation
  6. (转)C# Windows服务 弹出消息提醒框
  7. Pains and Sickness 学习笔记
  8. 199. Binary Tree Right Side View 从右侧看的节点数
  9. [leetcode]42. Trapping Rain Water雨水积水问题
  10. Django 跨域请求 解决 axios 未完待续