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

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的值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Transform字面上就是变形,改变的意思。在CSS3中transform主要包括以下几种:旋转rotate、扭...
    hzrWeber阅读 22,191评论 0 19
  • 看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印象,因...
    DCbryant阅读 1,898评论 0 4
  • 关于css3变形 CSS3变形是一些效果的集合,比如平移、旋转、缩放和倾斜效果,每个效果都被称作为变形函数(Tra...
    hopevow阅读 6,424评论 2 13
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    love2013阅读 2,349评论 0 11
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,815评论 0 2