美文网首页
移动端用translate替换left/top制作动画效果

移动端用translate替换left/top制作动画效果

作者: 我是xy | 来源:发表于2016-09-02 09:39 被阅读0次

    css3之前,想要改变某个元素的位置,常用的方法是通过绝对定位改变其left或是top。而现在,由于css3新增加了transform属性,也可以通过改变translate来实现元素位置的变化。

    一、translate的优点:

    制作改变某个元素位置的动画效果,尤其是在移动端上,如果使用left或者top,会出现明显的卡顿,在配置较低的手机上甚至会产生重影的现象。而改用translate,元素的运动效果则会变得相对流畅许多,且不会产生重影。
    因为用left或top时,在每一帧内,cpu (中央处理器) 都需要计算该元素的其他样式,特别是相对需要复杂计算的盒阴影,渐变,圆角等样式,最后都需要将这些样式应用到该元素内。从这个角度看,如果对于较为老旧的移动设备进行相对复杂的动画,那么效果肯定不理想。
    而通过调用translate,会启动硬件加速,即在GPU层 (图形处理器) 对该元素进行渲染。这样,CPU就会相对解放出来进行其他的计算,GPU对样式的计算相对较快,且保证较大的帧率。我们可以通过2d和3d的transform来启用GPU计算。

    二、获取transform中的值:

    通过console.log可以看到,transform的值是一个矩阵:



    其中第5个数字和第6个数字分别对应translateX和translateY。

    获取这个值的方法有三种,例如我们要获取slider-bar这个元素的translateX值:
    方法1--解析矩阵:


    var style = window.getComputedStyle($('.slider-bar').get(0));  
    var matrix = new WebKitCSSMatrix(style.webkitTransform);
    matrix.m41   
    

    WebKitCSSMatrix是专门用于操作矩阵的函数。而m41就是translateX值,其中4代表第4列,1代表第一行。所以如果你还想获取translateY的值,就用m42。

    方法2--正则:

    var sliderBarTransform = $('.slider-bar').css('transform');
    var array=SliderBarTransform.match(/-?[\0-9\.]+/g);
    array[4];
    

    方法3--字符串分割:
    用typeof查看矩阵的类型,结果为字符串(string),所以也可以用字符串的方法split来分割。

    var sliderBarTransform = $('.slider-bar').css('transform');
    var array=SliderBarTransform.split('(')[1].split(')')[0].split(',');
    array[4];
    

    提示

    当元素的display为none时,是获取不到transform的,设置如下样式


    得到的结果为


    所以在使用一些插件时,如果插件会将元素的display设置为none,那么就只能获取其他数值来替换transform的值。

    相关文章

      网友评论

          本文标题:移动端用translate替换left/top制作动画效果

          本文链接:https://www.haomeiwen.com/subject/mwvcettx.html