浅谈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 未结束的字符串常量错误解决方法
Jun 13 Javascript
JS模块与命名空间的介绍
Mar 22 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
Apr 19 Javascript
JQuery中使用on方法绑定hover事件实例
Dec 09 Javascript
js实现iframe自动自适应高度的方法
Feb 17 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
Mar 04 Javascript
jQuery Easyui加载表格出错时在表格中间显示自定义的提示内容
Dec 08 Javascript
分享ES6的7个实用技巧
Jan 18 Javascript
jQuery 防止相同的事件快速重复触发方法
Feb 08 jQuery
jQuery简单实现根据日期计算星期几的方法
Jan 09 jQuery
微信小程序实现上传图片裁剪图片过程解析
Aug 22 Javascript
JS实现使用POST方式发送请求
Aug 30 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 Pear 安装及使用
2009/03/19 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
基于PHP的简单采集数据入库程序【续篇】
2014/07/30 PHP
php生成圆角图片的方法
2015/04/07 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
JS继承 笔记
2011/07/13 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
js实现图片360度旋转
2017/01/22 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
python操作gitlab API过程解析
2019/12/27 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
法学函授自我鉴定
2014/02/06 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
起诉状范本
2015/05/20 职场文书
旗帜观后感
2015/06/08 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
MySQL注入基础练习
2021/05/30 MySQL
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL