css动画滑动不流畅怎么办

css动画滑动不流畅的解决办法:1、将图片缩放中动画元素改成transform,避免使用height,width,margin或padding等;2、开启浏览器GPU硬件加速。

css动画滑动不流畅怎么办

本教程操作环境:Windows10系统、CSS3版、DELL G3电脑

css动画滑动不流畅怎么办?

CSS3 动画卡顿解决方案

前端时间用 animation 实现 H5 页面中首页动画过渡,很简单的一个效果,首页加载一个客服头像,先放大,停留 700ms 后再缩小至顶部。代码如下

nbsp;html>                首页加载动画                        .welcome-main{                display: none;                                padding-bottom: 40px;                        }            .top-info{                                width: 100%;                                position: absolute;                                left: 0;                                top: 93px;                        }            .wec-img{                width: 175px;                                height: 175px;                                position: relative;                                padding: 23px;                                box-sizing: border-box;                                margin: 0 auto;                         }            .wec-img:before{                                content: '';                                position: absolute;                                left: 0;                                top: 0;                                width: 100%;                                height: 100%;                                background: url("./images/kf-welcome-loading.png");                                background-size: 100%;                         }            .wec-img .img-con{                width: 100%;                                height: 100%;                                border-radius: 50%;                                /*box-sizing: border-box;*/                background: url("./images/kf_1.jpg");                                background-size: 100%;                                padding: 1px;                        }            .wec-img .img-con img{                width: 100%;                                height: 100%;                                border-radius: 50%;                        }            .loaded .wec-img{                -webkit-transform-origin: center top;                        }                           .loading.welcome-main{                display: block;            }            .loading .wec-img{                -webkit-animation:fadeIn .3s  ease both;            }            .loading .wec-img:before{                -webkit-animation:rotate .6s .2s linear both;                        }            .loaded .top-info{                -webkit-animation:mainpadding 1s 0s ease both;                        }            .loaded .wec-img{                -webkit-animation:imgSmall 1s 0s ease both;            }            @-webkit-keyframes mainpadding{                0%{-webkit-transform:translateY(0)                }                100%{-webkit-transform:translateY(-87px)                     }            }                        @-webkit-keyframes imgSmall{                0%{                    width: 175px;                                        height: 175px;                                        padding: 23px;                                }                100%{                                        width: 60px;                                        height: 60px;                                        padding: 0;                                }            }                        @-webkit-keyframes fadeIn{                0%{opacity:0;-webkit-transform:scale(.3)}                100%{opacity:1;-webkit-transform:scale(1)}            }                        @-webkit-keyframes rotate{                0%{opacity:0;-webkit-transform:rotate(0deg);}                50%{opacity:1;-webkit-transform:rotate(180deg);}                100%{opacity:0;-webkit-transform:rotate(360deg);}            }                                          
                
                    

@@##@@

                
            
             $('.welcome-main').addClass('loading'); setTimeout(function(){ $('.hi.fst').removeClass('loading'); $('.welcome-main').addClass('loaded'); },700);             

登录后复制

在 chrome 上测试 ok,但在提测给 QA 的时候发现部分机型,如华为(系统4.2),oppo(系统5.1)的出现卡顿情况。

百思不得其解,后来参考文章深入浏览器理解 CSS animations 和 transitions 的性能问题一文,将图片缩放中动画元素改成 transform,如下

@-webkit-keyframes imgSmall{  0%{      -webkit-transform:scale(1);  }  100%{      -webkit-transform:scale(.465);  }}

登录后复制

果然啊,卡顿问题解决了。

文章深入浏览器理解 CSS animations 和 transitions 的性能问题是这么解释的,现代的浏览器通常会有两个重要的执行线程,这 2 个线程协同工作来渲染一个网页:主线程和合成线程。

一般情况下,主线程负责:运行 JavaScript;计算 HTML 元素的 CSS 样式;页面的布局;将元素绘制到一个或多个位图中;将这些位图交给合成线程。

相应地,合成线程负责:通过 GPU 将位图绘制到屏幕上;通知主线程更新页面中可见或即将变成可见的部分的位图;计算出页面中哪部分是可见的;计算出当你在滚动页面时哪部分是即将变成可见的;当你滚动页面时将相应位置的元素移动到可视区域。

假设我们要一个元素的 height 从 100 px 变成 200 px,就像这样:

div {    height: 100px;    transition: height 1s linear;}div:hover {    height: 200px;}

登录后复制

主线程和合成线程将按照下面的流程图执行相应的操作。注意在橘黄色方框的操作可能会比较耗时,在蓝色框中的操作是比较快速的。

css动画滑动不流畅怎么办

而使用 transform:scale 实现

div {    transform: scale(0.5);    transition: transform 1s linear;}div:hover {    transform: scale(1.0);}

登录后复制

此时流程如下:

bc5d7f1784ce49aae25c030df96d6ae.jpg

也就是说,使用 transform,浏览器只需要一次生成这个元素的位图,并在动画开始的时候将它提交给 GPU 去处理 。之后,浏览器不需要再做任何布局、 绘制以及提交位图的操作。从而,浏览器可以充分利用 GPU 的特长去快速地将位图绘制在不同的位置、执行旋转或缩放处理。

为了从数量级上去证实这个理论,我打开 chrome 的 Timeline 查看页面 FPS

801906355b961481a4e6be55e2f5baf.jpg

其中,当用 height 做动画元素时,在切换过程的 FPS 只有 44,我们知道每秒 60 帧是最适合人眼的交互,小于 60,人眼能明显感觉到,这就是为什么卡顿的原因。

1bb08afc188736d7b73dc6a709cfaf2.jpg

rendering 和 painting 所花的时间如下:

814e1fd8595c7e29b6e127280d72401.jpg

再来看看用 transform:scale

3cb26bf22eaf2460656acd8fc9b4545.jpg

FPS 达到 66,且 rendering 和 painting 时间减少了 3 倍。

到此为止问题是解决了,隔了几天,看到一篇解决 Chrome 动画”卡顿”的办法,发现还能通过开启硬件加速的方式优化动画,于是又试了一遍。

webkit-transform: translate3d(0,0,0);-moz-transform: translate3d(0,0,0);-ms-transform: translate3d(0,0,0);-o-transform: translate3d(0,0,0);transform: translate3d(0,0,0);

登录后复制

惊人的事情发生了,FPS 达到 72:

f5ba006de0d03e9ac63f67091b20924.jpg

b1bfe90845a2e9372be4b30fab85bde.jpg

总结解决 CSS3 动画卡顿方案

尽量使用 transform 当成动画属性,避免使用 height,width,margin,padding 等;

立即学习“前端免费学习笔记(深入)”;

要求较高时,可以开启浏览器开启 GPU 硬件加速。

推荐学习:《css视频教程》

c059ab47fb68563cf7fcae29e535086.jpg

以上就是css动画滑动不流畅怎么办的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2920908.html

(0)
上一篇 2025年3月11日 18:23:26
下一篇 2025年3月10日 19:51:47

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • css数字换行不生效怎么办

    css数字换行不生效的解决办法:1、打开相应的HTML文件;2、找到数字内容的标签;3、给数字部分的标签添加css属性为“word-break: break-all;”即可实现数字不换行的问题。 本教程操作环境:Windows10系统、CS…

    2025年3月11日
    200
  • css样式列表有什么用

    css样式列表的作用是可以同时控制多个网页的布局,比如可以控制颜色、字体、文本大小、元素之间的间距、元素的位置和布局、要使用的背景图像或背景颜色、不同设备的不同显示和屏幕大小等;使用css可以节省大量的工作。 本教程操作环境:Windows…

    2025年3月11日
    200
  • css是脚本吗

    css不是脚本,不属于脚本语言,css是层叠样式表;css是一种用来表现HTML或XML等文件样式的计算机语言;CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化;CSS能够对网页中元素位置的排版进行像素级精确…

    2025年3月11日
    200
  • css怎么实现反转180

    css实现反转180的方法:1、创建一个HTML示例文件;2、定义div为“”;3、通过“background: url(‘/public/smart_equipment.png’) 0 0 no-repeat;tr…

    2025年3月11日
    200
  • css both意思是什么

    css both的意思是指设置clear属性值为both,其作用是清除浮动,即要求框的顶边框边低于在源文档中之前生成的任何浮动框的底外边距边,也就是说可以清除之前所有浮动框所带来的影响。 本教程操作环境:Windows10系统、CSS3版、…

    2025年3月11日
    200
  • 用css怎么实现跑马光

    用css实现跑马光效果的方法:1、创建一个div边框,代码为“…”;2、通过设置css属性为“@keyframes moveLine {0% {background-position: -100px 1px, calc(100%…

    2025年3月11日
    200
  • css左边框语法是什么

    css左边框语法是“border-left:值;”;“border-left”是一个简写属性,可以把左边框的所有属性设置到一个声明中;可以按顺序设置属性如“border-left-width”、“border-left-style”、“bo…

    2025年3月11日
    200
  • css不显示蓝边框代码是什么

    css不显示蓝边框代码是“img {border:0;onfocus=”this.blur()”}”;其中border是边框属性的简写属性,用于指定元素边框的样式、宽度和颜色;可以设置的属性分别是“border-wi…

    2025年3月11日
    200
  • css怎么禁止内容溢出

    在css中可以使用“text-overflow”属性实现禁止内容溢出,该属性规定当文本溢出包含元素时发生的事情,其语法是“text-overflow : clip | ellipsis | ellipsis-word”。 本教程操作环境:W…

    2025年3月11日
    200
  • css怎么实现三个点隐藏

    css实现三个点隐藏的方法:1、单行情况下,通过css属性“text-overflow: ellipsis;”可以实现将文本溢出显示为三个点;2、多行情况下,通过属性“overflow: hidden;text-overflow: elli…

    2025年3月11日
    200

发表回复

登录后才能评论