javascript - 内容loading加载后高度变化CSS3 transition体验优化?
高洛峰
高洛峰 2017-04-10 16:00:35
[JavaScript讨论组]

下面是张大神张鑫旭的文章.提出个问题.




    
    
    Demo
    


    

...

代码中这一段。

setTimeout(function() {
        if (time) element.style.transition = "height "+ time +"ms";
        element.style.height = targetHeight;
    }, 15);

为什么要setimeout. 去掉就没效果了.. 张大神解释说是需要

触发动画效果需要触发重绘,setTimeout就有这个作用

小弟依然没太明白. 求解释......

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
PHP中文网

一方面,CSS样式修改是渲染中的一种高成本操作,所以浏览器一般会缓存渲染树的更新。但有的情况则不会缓存,比如:

  1. 调整窗口大小和修改页面默认字体

  2. client/offset/scroll(比如访问 node.clientWidth 属性)

  3. getComputedStyle() currentStyle

另一方面,setTimeout 是要等执行线程空闲的时候才会触发的。

以上是原理。下面看问题:

假设没有 setTimeout,效果成了:

    // 立即重排
    var height = window.getComputedStyle(element).height;
    // 缓存之
    element.style.height = "auto";
    // 立即重排
    var targetHeight = window.getComputedStyle(element).height;
    // 下面开始重点:
    // 缓存之
    element.style.height = height;
    // 缓存之
    if (time) element.style.transition = "height "+ time +"ms";
    // 缓存之
    element.style.height = targetHeight;
    // 渲染

结果就是,根本不会渲染高度为 height,而是直接渲染成 targetHeight。我们想要的结果是从 heighttargetHeight 的过渡。

那有了 setTimeout,效果就是酱紫的了:

    // 缓存之
    element.style.height = height;
    // 空闲了才干
    setTimeout(function() {
        if (time) element.style.transition = "height "+ time +"ms";
        element.style.height = targetHeight;
    }, 15);
    // 立即重排

喏喏,浏览器得先重排高度为 height 才闲下来,而一闲下来才要求重排到 targetHeight,这才会产生过渡效果。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号