关于transition动画下,如果有fixed元素,渲染的奇葩问题
之前我们机票页面有生成一个低价日历,然后我们有一个需求就是滚动到那个月份,对应显示这个月,然后这个区域是fixed定位的,然后奇怪的事情发生了,就是低价日历的动画执行完后,修改页面的html却没有正常更新。(因为那个区域显示有点问题,我截图的地方也是fixed元素) 
然后大家可以看到以上截图,改变了dom后页面没有重新渲染(可以这里用词有误,反正是没有渲染正常。)
然后我就找了小钗(http://www.cnblogs.com/yexiaochai/)一起帮我看问题,然后看了一个下午,当天只能得出一个结论就是:动画可能影响了fixed元素的渲染。
昨天和今天,我一直找真正导致bug的原因,因为我们业务代码几千行,所以不好定位,所以我只好用最笨的方法,一点点删代码,然后最后把不可能影响到的代码和样式统统删掉,直至确认出是日历组件本身的问题。

幸好我认识框架组的同事之前拿了源码。好为了快速进入,舍弃前戏部分,我就不说定位过程了,最后得出的结论就是 的确是动画影响了,下面我们看看组件动画做了写什么事情:
然后这里我还不确定animate方法里做了神马事情,所以我再进去animate的源码里看
然后这个animate函数调用了anim函数,几个参数大家都属性吧,分别是修改的属性(可多个)、过渡时间、过渡效果、动画结束回调函数、延时执行时间。
方便初学者理解,我加了几行注释
cssValues打个断点输出,看下图,其实就是把东西转变成css3的transtion来达到这个过渡效果。
然后我再分别写了几个测试的小例子:
懒得写可以直戳以下几个链接:
1、在页面出来前display:none;的例子
2、在动画结束后append,fixed元素的例子
3、在页面出来前display:!none;的例子
4、去掉回调里重置transform的例子
5、addClass模拟animate函数的例子
分别写了5个例子(看每个例子前必强清除缓存),下面我尽简单直接说一下分别什么不一样。
例子1,就是如果父级一开始是display:none; 那么子级的fixed的元素修改渲染必然有问题(至少我测试下来是这样):
例子2,如果动画结束后append fixed元素,那个这个元素能正常渲染:
例子3,如果父级本来不是display:none;那么本来存在的子级fixed元素能正常渲染,动画过程中加入的fixed元素不能正常渲染。
例子4,如果我把执行动画结束后的transform重置去掉,那么无论是否display,和动画期间加入的fixed元素修改后都能正常渲染。
例子5,如果我用addClass,来模拟animate的效果,setTimeout10秒后重置transform,在清除前无论是否display:none,动画过程加入的元素都能修改、正常渲染,但是10秒transform强制设置为none后,渲染均有问题。
单个版本代码如下,供自行修改尝试。
<meta name="viewport"
content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<style>
* {
margin: 0;
padding: 0;
}
html, body {
width: 100%;
height: 100%;
}
.transilate_wrap {
width: 100%;
height: 100%;
display: block;
background: #add8e6;
position: absolute;
top: 0px;
left: 0px;
} .fixed1 {
width: 100%;
height: 30px;
display: inline-block;
background: red;
position: fixed;
} .append_fixed {
width: 100%;
height: 40px;
top: 50px;
position: fixed;
background: green;
}
.append_fixed2 {
width: 100%;
height: 40px;
top: 120px;
position: fixed;
background: green;
}
</style>
</head>
<body> <div class="transilate_wrap" style="position: absolute; z-index: 3001; top: 0px; right: 0px; left: 0px;display: none;">
<div class="fixed1">
before animate fixed
</div>
</div>
</body> <script src="./zepto.ctrip.js"></script>
<script>
var $el = $('.transilate_wrap'); $el.css({
'-webkit-transform': 'translate(100%, 0)',
transform: 'translate(100%, 0)'
}).show().animate({
'-webkit-transform': 'translate(0, 0)',
transform: 'translate(0, 0)'
}, 1500, 'ease-in-out', function () {
$el.css({
'-webkit-transform': '',
transform: ''
});
}); setTimeout(function () {
$el.append('<h1 class="append_fixed">during animate</h1>');
}, 100); /* setTimeout(function () {
$el.append('<h1 class="append_fixed2">after animate</h1>');
}, 1600);*/ </script>
最后引发这个奇葩问题,我还是得不到最终解析,忘有知道的大神请告知一下,感谢感谢!
关于transition动画下,如果有fixed元素,渲染的奇葩问题的更多相关文章
- ios下,微信小程序scrollview组件中的fixed元素抖得和帕金森病人一样
问题现象 这个问题是最近在优化小程序代码时发现的. 在ios环境下,微信小程序的scrollview组件包裹着一个position:fixed的view. 当在scrollview组件上滑动时,这个v ...
- 当fixed元素相互嵌套时chrome下父元素会影响子元素的层叠关系
问题:fixed元素被另一个fixed元素包含的时候在chrome下fixed子元素的定位会受到父元素的影响. demo(http://jsbin.com/qumah/1): <!DOCTYPE ...
- 移动端 transition动画函数的封装(仿Zepto)以及 requestAnimationFrame动画函数封装(仿jQuery)
移动端 css3 transition 动画 ,requestAnimationFrame 动画 对于性能的要求,h5优先考虑: 移动端 单页有时候 制作只用到简单的css3动画即可,我们封装一下, ...
- css3 Transition动画执行时有可能会出现闪烁的bug
css3 Transition动画执行时有可能会出现闪烁的bug,一般出现在开始的时候. 解决方法: 1.-webkit-backface-visibility: hidden; 2.-webkit- ...
- 解决IOS下不支持fixed的问题
我们公司有一个页面底部用到了fixed样式,每当弹出键盘的时候,IOS下fixed就会走样(据我所知android没有该问题). 为此之前我经过产品的同意做了简单的处理(方法1). 方法一: focu ...
- 解决transition动画与display冲突的几种方法
如demo(如果没有显示,请查看源地址http://jsfiddle.net/ihardcoder/HNduT/2/)所示,基本的效果是在点击“Translate”按钮后,蓝色区域透明度变为0,然后隐 ...
- Swift: 是用Custom Segue还是用Transition动画
用一个很简单的场景做为例子:在storyboard上,你有用UINavigationController串起来两个UIViewController.这两个controller之间要互相跳转,A-> ...
- 当fixed元素相互嵌套时,父元素会影响子元素的层叠关系,最好不要嵌套使用fixed
问题:fixed元素被另一个fixed元素包含的时候在chrome下fixed子元素的定位会受到父元素的影响. 解释:层叠关系是受层叠上下文影响的.文档中的层叠上下文由满足以下任意一个条件的元素形成: ...
- ios中fixed元素在滚动布局中的延时渲染问题
在之前做的一个demo中,有个视图是内滚动的,里边有个bar用了fixed,不是fixed在最外层视图的顶部和底部,在微信/safari/chrome/其他浏览器app上都没出现问题. 然后今天,我把 ...
随机推荐
- java json和对象互转
开发过程中遇到一些对象转string和string转对象的问题,浪费了很久,现在用的熟练些了,总结如下: 1.字符串尽量定义成json可解析的,如{"name":"a&q ...
- maven项目重构目录
刚从svn下载下来的项目需要重新构建目录,package 包显示不正确, 是的,删除箭头指向的那个文件夹.
- Android学习笔记_28_手势识别
一.准备手势库: 使用SDK自带例子GestureBuilder建立手势库(位置:android-sdk-windows\samples\android-10\GestureBuilder).使用Ge ...
- Android学习笔记_4_单元测试
在实际开发中,开发android软件的过程需要不断地进行测试.而使用Junit测试框架,侧是正规Android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 1. ...
- js读取跨域webapi传送回来的cookie 要点
1.webapi 返回cookie时,httpOnly=false 2.webapi 接收Origins 不能为* 3.js端 请求时,withCredentials必须: true //`wit ...
- c语言描述的二叉树的基本操作(层序遍历,递归,非递归遍历)
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define ...
- SpringBoot非官方教程 | 第二十篇: 处理表单提交
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot-form/ 本文出自方志朋的博客 这篇文件主要介 ...
- 使用缓存时出现java.io.NotSerializableException:xxx.xxx.xxx.Bean解决办法
解决方案: 开发过程中如果想缓存某个JavaBean,请确保它所引用的对象都implents Serializable,如果某个对象不需要被cache,可以加上transient关键字,否则Ehc ...
- c# 任务超时执行组件
最近整理下各类框架,学习一下欠缺的东西.因为前一年开发过java服务端,知道java有很多开源框架,但是毕竟起来也很累. 现在转回头从新审视c#,很基础,没有开源框架,因为以前它不开源,所以少,不用比 ...
- Sass 基础(四)
当你想设置属性值的时候你可以使用字符串插入进来,另一个使用的用法是构建一个选择器. @mixin generate-sizes($class,$small,$medium,$big){ .#{$cla ...