浅谈javascript获取元素transform参数


Posted in Javascript onJuly 24, 2015

之前写页面的时候有试过想用js获取某些元素的translate的数值什么的,但是translate又是transform的子样式(勉强说说),理所当然就是先获取transform样式,再读里面的值。

body{-webkit-transform: translateX(20px);}

但当我尝试这样做的时候,奇迹出现了:

浅谈javascript获取元素transform参数

当时我的内心几乎是崩溃的,我只想安安静静的获取translate的值而已啊,谁知给我弹出这货,虽然上高数课的时候也有讲到所有变化(二维、三维)效果都可以浓缩在一个矩阵里面的,但如果要逆向解析矩阵得到我想要的值就不是这么简单了。

一次偶然的机会,我再次想用js获取translate的值,这次的结果出乎意料:

浅谈javascript获取元素transform参数

看到这一幕,简直是泪如雨下,虽然不能直接就得到我要的值,但是拿正则匹配一下就可以了。

你是不是以为是jq做了手脚?其实不然,我比对了一下,发现两次body样式的写法是不一样的:

第一次:

body{-webkit-transform: translateX(20px);}

第二次:

<body style='-webkit-transform: translateX(20px);'></body>

没错,第一次是通过css设置,第二次是通过body的style属性设置的,按照我的理解,css和style属性虽然都可以对页面元素进行渲染,但是两者的地位是不一样的。(以下含推测成分)

当页面加载时,css和style对渲染树产生了作用,都会影响元素的变现,不同的地方在于style是元素的属性,用户设置了什么就应该保存什么,就想一个烙印深深烙在了特定元素上,所以当body通过style设置‘-webkit-transform'时,我们可以通过document.body.style.webkitTransform 原样获取设置的值。也许你会有疑问,那直接获取css设置的值不就好了嘛。但我觉得这是做不到的(除去解析css文件的方法),因为css文件被加载完,形成渲染树后它的任务就完成了,css和style所产生的最终对元素进行渲染的规则都可以通过window.getComputedStyle(element) 找到。通过这个方法我们可以看到,transform最终产生的渲染规则是以矩阵maxrix(x,x,x,x,x)的形式保存的(也许是方便计算机的运算),

浅谈javascript获取元素transform参数

这就解释了为什么$('body').css('-webkit-transform') 这货会返回矩阵了,而且也看出了$().css()方法是从浏览器最终渲染规则中返回结果的(就是window.getComputedStyle(element)),所以它是读取不了你的css设置参数的,而且当你用$().css()给元素设置样式时,其实它是通过设置元素style属性(内联)设置的,试试你就知道了。虽然这个$().css()有‘css'字样,但是它和‘css文件'没有半毛钱关系,或许这就能证明上面我说的:‘不能直接获取css设置的值'吧。

总结:

1.css和style共同作用渲染树,且style设置的值会原样保存为元素的style属性的子属性,最终渲染规则可以通过window.getComputedStyle(element) 找到

2.jq$().css()方法获取的是最终渲染规则,设置的是style属性(内联样式)

建议:

1.当我们需要实时获取并修改元素transform各参数的时候(例如用translate实现各种滑动效果),应该把transform设置成元素的内联属性(通过style设置),这样方便读取

2.矩阵虽吓人,但若不想成为平凡的页面仔,还是需要搞懂

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
离开页面时检测表单元素是否被修改,提示保存的js代码
Aug 25 Javascript
javascript 函数参数限制说明
Nov 19 Javascript
用Mootools获得操作索引的两种方法分享
Dec 12 Javascript
JavaScript模块随意拖动示例代码
May 27 Javascript
javascript学习笔记(七)Ajax和Http状态码
Oct 08 Javascript
Javascript中innerHTML用法实例分析
Jan 12 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
May 17 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
Jul 18 Javascript
AngularJS中一般函数参数传递用法分析
Nov 22 Javascript
Node.js用readline模块实现输入输出
Dec 16 Javascript
详解Layer弹出层样式
Aug 21 Javascript
vue watch自动检测数据变化实时渲染的方法
Jan 16 Javascript
js实现汉字排序的方法
Jul 23 #Javascript
javascript实现全角半角检测的方法
Jul 23 #Javascript
javascript比较两个日期相差天数的方法
Jul 23 #Javascript
jquery实现简单的轮换出现效果实例
Jul 23 #Javascript
jquery实现简单实用的打分程序实例
Jul 23 #Javascript
javascript实现框架高度随内容改变的方法
Jul 23 #Javascript
js正则表达式中exec用法实例
Jul 23 #Javascript
You might like
php 远程图片保存到本地的函数类
2008/12/08 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
PHP asXML()函数讲解
2019/02/03 PHP
js中有关IE版本检测
2012/01/04 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
2017/10/27 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
通过angular CDK实现页面元素拖放的步骤详解
2020/07/01 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Apache如何部署django项目
2017/05/21 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
Pytorch提取模型特征向量保存至csv的例子
2020/01/03 Python
python代码区分大小写吗
2020/06/17 Python
Nebula美国官网:便携式投影仪
2019/03/15 全球购物
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
《会变的花树叶》教学反思
2014/02/10 职场文书
销售人员职业生涯规划范文
2014/03/01 职场文书
学校消防安全责任书
2014/07/23 职场文书
2014年科协工作总结
2014/12/09 职场文书
工程款催款函
2015/06/24 职场文书
安全生产会议制度
2015/08/06 职场文书