Chrome 39 CSS3 渐变动画BUG

本来地图网页运行的好好的,突然从上周四(2014/11/27)开始,就开始接到 PM 和 QA 说网页崩溃的报告。

然后我就在本机重现,刚开始以为是有网页上有什么内存泄漏;可是都运行这么长时间了,并且 IE 和 Firefox 都没有出现过此问题,看来应该是和 chrome 有关系了。说归这样说,可是需要证据啊。于是就猜测是不是 Chrome 新自动升级引入的BUG,然后就开始了漫长的排查过程。

找了好几个同事来协助排查,也没有发现页面上有任何内存使用异常的现象;但是就 Chrome 进程内存却会飙升,并且嗖嗖的一会就 600M 以上了。

一开始以为是页面 flash 导致的;于是就把页面引入的 flash 去掉了,可对比后发现才省去 7M 内存(一个 flash 就占 7M,而整个页面内存才占用 20M,看来 flash 作为内存杀手和崩溃杀手,果真名不虚传啊)。然后就满怀惊喜的测试,结果是页面依旧会崩溃,这下又无奈了。

没办法,只能从头再来,一步步的跟踪时间点。刷新了好多次之后,终于发现了一个规律,页面在加载完地图后,开始内存飙升,CPU 满负荷运转。等过个几十秒,CPU正常,然后地图开始陆续加载低图。

这下终于找到了一个突破口,于是找来地图开发的同学,让来协助定位问题所在。可一起研究了半天,除了观察到页面爆卡这个现象之外,原因排查依旧毫无进展。于是又不停地刷新页面,观察规律。每次都是先加载地图低图,然后页面 UI 停止响应,再过一段时间,页面正常,开始加载页面其他地图底图。观察了不知道多少次之后,猜测可能是地图缩放导致的。因为页面地图加载后,会有一次放大,此时页面就会崩溃;在其他同学机器上测试,有的会复现,有的不会复现,好像就是因为有的同学页面会有地图放大操作,而有的没有地图放大操作。

确定了这个原因之后,赶紧写了一个测试代码。CSS如下:

.div {
    height: 600px;
    width: 600px;
    background: red;
}
.transform {
    transform: scale(200);
}
.transition {
    -webkit-transition: -webkit-transform .25s cubic-bezier(0, 0, .25, 1);
    -moz-transition: -moz-transform .25s cubic-bezier(0, 0, .25, 1);
    -o-transition: -o-transform .25s cubic-bezier(0, 0, .25, 1);
    transition: transform .25s cubic-bezier(0, 0, .25, 1)
}

由于是做地图开发的,所以也放入一些地图底图图片,HTML 如下代码:

<div class="div transition" id="d1">
    <img src="http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1685&amp;y=775&amp;z=11">
    <img src="http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1686&amp;y=775&amp;z=11">
    <img src="http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1685&amp;y=776&amp;z=11">
    <img src="http://webrd03.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1686&amp;y=776&amp;z=11">
    <img src="http://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1685&amp;y=774&amp;z=11">
    <img src="http://webrd03.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1687&amp;y=775&amp;z=11">
    <img src="http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1686&amp;y=774&amp;z=11">
    <img src="http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1684&amp;y=776&amp;z=11">
</div>

然后就是写一段代码,模拟地图放大操作,JS代码如下:

setTimeout(function () {
    var d1 = document.getElementById("d1");
    d1.classList.add("transform");
}, 1000);

setTimeout(function () {
    var d1 = document.getElementById("d1");
    d1.classList.remove("transform");
    document.getElementById("d1").classList.remove("transition");
}, 3000);

然后刷新一下页面,果真,页面还真是实实在在的卡爆了,和线上网页卡爆现象一模一样。

找到了原因所在,然后就是怎么解决了。页面开发了这么久,还真不是一时半会说改就能改的。然后费了半天的时间,把地图 JS-API 的版本从 1.2 切换到 1.3,这下就终于搞定了(1.3版本API地图缩放缩放过程与1.2不同,基本不会出现此问题)。等QA测试稳妥后,赶紧上线。这两天快被 PM 给逼疯了,天天在耳边说,赶紧上线赶紧上线。

到最后,独悦乐不如众悦乐,遇到问题就要会和大家分享一下。一方面给 Chromium 提BUG,一方面在此码字,真是醉了。

最后,放上页面完整代码,并附上内存和CPU使用图表,有兴趣的同学可以在本机尝试一下,记住 chrome 的版本号是39.0.2171.71 m:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Chrome transition and transform scale bug</title>
    <style>
        .div {
            height: 600px;
            width: 600px;
            background: red;
        }
        .transform {
            transform: scale(200);
        }
        .transition {
            -webkit-transition: -webkit-transform .25s cubic-bezier(0, 0, .25, 1);
            -moz-transition: -moz-transform .25s cubic-bezier(0, 0, .25, 1);
            -o-transition: -o-transform .25s cubic-bezier(0, 0, .25, 1);
            transition: transform .25s cubic-bezier(0, 0, .25, 1)
        }
    </style>
</head>
<body>
<a href="javascript:" id="a1">点击我,测试页面是否相应?</a>
<div id="a1Test"></div>
<script>
    var clickedTimes = 0;
    document.getElementById("a1").addEventListener("click", function(){
        clickedTimes++;
        document.getElementById("a1Test").innerHTML = "你一共点击了 " + clickedTimes + " 次!";
    }, false);
</script>
<div class="div transition" id="d1">
    <img src="http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1685&amp;y=775&amp;z=11">
    <img src="http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1686&amp;y=775&amp;z=11">
    <img src="http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1685&amp;y=776&amp;z=11">
    <img src="http://webrd03.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1686&amp;y=776&amp;z=11">
    <img src="http://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1685&amp;y=774&amp;z=11">
    <img src="http://webrd03.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1687&amp;y=775&amp;z=11">
    <img src="http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1686&amp;y=774&amp;z=11">
    <img src="http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&amp;size=1&amp;scale=1&amp;style=7&amp;x=1684&amp;y=776&amp;z=11">
</div>
<script>
setTimeout(function () {
    var d1 = document.getElementById("d1");
    d1.classList.add("transform");

}, 1000);

setTimeout(function () {
    var d1 = document.getElementById("d1");
    d1.classList.remove("transform");
    document.getElementById("d1").classList.remove("transition");
}, 3000);
</script>
</body>
</html>

CPU和内存占用情况:

时间: 2024-12-24 23:41:24

Chrome 39 CSS3 渐变动画BUG的相关文章

深入css3帧动画实现ps时间轴动画效果steps()(前端网备份)

在应用 CSS3 渐变/动画时,有个控制时间的属性 <timing-function> .它的取值中除了常用到的 三次贝塞尔曲线 以外,还有个让人比较困惑的 steps() 函数. steps() 第一个参数 number 为指定的间隔数(必须是正整数),即把动画分为 n 步阶段性展示,第二个参数默认为 end,设置最后一步的状态,start 为结束时的状态,end 为开始时的状态. <!DOCTYPE html> <html> <head> <met

css3 Transition动画执行时有可能会出现闪烁的bug

css3 Transition动画执行时有可能会出现闪烁的bug,一般出现在开始的时候. 解决方法: 1.-webkit-backface-visibility: hidden; 2.-webkit-transform-style: preserve-3d; 需要应用在动画元素上. 第二种方法在低端android上会出现性能问题.所以推荐第一种方法

css3实现文字渐变动画效果

利用css3这个属性(背景剪裁): background-clip: border-box || padding-box || context-box || no-clip || text 本次用到的就是: -webkit-background-clip:text; 栗子: 1. <style> .masked{ text-align: center; background-image: -webkit-linear-gradient(left, #147B96, #E6D205 25%, #

纯CSS3冒泡动画按钮实现教程

这款CSS3动画按钮非常的有创意,鼠标在滑过按钮时并不像其他按钮那样仅仅改变按钮的背景颜色,而是出现很酷的冒泡动画.这么惊艳的CSS3动画按钮,这篇文章主要将按钮实现的过程和代码分享给大家,希望能给在学习CSS3的同学带来实质性的帮助.可以下来看看在线演示效果: 在线演示        源码下载 接下来我们来讲解一下这款CSS3气泡动画的按钮实现过程,主要由HTML代码和CSS代码组成. HTML代码: <div id="buttonContainer"> <a hr

CSS3与动画有关的属性transition、animation、transform对比

最近应公司需求,需要用css3做动画,终于把以前一直傻傻分不清楚的三个属性理解了. 索性在这里进行一个简单的对比,加深自己的记忆. 浏览器兼容性 CSS3 transform 属性 Internet Explorer 10.Firefox.Opera 支持 transform 属性. Internet Explorer 9 支持替代的 -ms-transform 属性(仅适用于 2D 转换). Safari 和 Chrome 支持替代的 -webkit-transform 属性(3D 和 2D

测试css3的动画效果在display:none的时候不耗费性能

1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Test TS Serializer</title> 6 <style> 7 .loadings { 8 width: 120px; 9 height: 120px; 10 /* background: #FFFFFF; */ 11 border-radius: 3

css3 animation动画技巧

一,css3 animation动画前言 随着现在浏览器对css3的兼容性越来越好,使用css3动画来制作动画的例子也越来越广泛,也随着而来带来了许多的问题值得我们能思考.css3动画如何让物体运动更顺畅,css3动画如何做弧线动画,css3动画是否有动画库,css3帧动画如何快速简单……   为了解决这些折磨人的问题,我们今天来分析一下: 首先介绍css3 Animation动画库: http://daneden.github.io/animate.css/ 基本涵盖了我们常见的基础css3动

8款超酷而实用的CSS3按钮动画

1.CSS3分享按钮动画特效 这是一款基于CSS3的社会化分享按钮,按钮非常简单,提供了分享到twitter.facebook.youtube等大型社交网站.每一个分享按钮都有个大社交网站的Logo图标,并且在鼠标滑过这些按钮时,利用CSS3的动画特性出现滑动的动画效果. 在线演示 源码下载 2.HTML5/CSS3悬浮按钮特效 Canvas彩球飞舞效果 这次要分享一个非常具有动画色彩的CSS3按钮,按钮的外观比较一般,但它有两个特别的地方:一.按钮悬浮,整个按钮看上去像是悬浮在半空中一样,很立

jQuery+CSS3过渡动画模态窗口特效

在线预览   源码下载 jQuery+CSS3过渡动画模态窗口特效是一款基于Codrops的ModalWindowEffects来制作,通过jQuery插件的方式来统一管理各种打开模态窗口的效果.适用浏览器:360.FireFox.Chrome.Opera.傲游.搜狗.世界之窗. 不支持Safari.IE8及以下浏览器. 加入前端爱好者QQ群(123235875) 点击加群,共同交流进度!