JavaScript 读取元素的CSS信息的代码


Posted in Javascript onFebruary 07, 2010

比如为某个HTML元素级联了一组样式信息,其中width属性的值为80px。然后调用脚本读取这个值,得到的结果总是一个空字符串,而事实上我想得到"80px"。针对这种情况,David Flanagan在《JavaScript 权威指南》(第五版)一书中给出了解决方案。

以下是针对JavaScript: The Definitive Guide, 5th Edition Chapter16 Section4的翻译
脚本计算的样式

HTML元素的style属性相当于style HTML 特性, 而作为style属性的值,CSS2属性对象只为这样的一个元素内联样式信息。这并不包括CSS级联里面的任何其他样式。有时你的确想知道确切的赋予某个元素的样式设置,同时忽略掉在级联里面的样式。你想要做的就是为元素计算样式。很不幸被计算的样式的名字是含糊的;它与在浏览器显示元素之前被执行的计算相关:所有的样式均被尝试能否适用于元素,并且所有适用的样式被合并在元素的任何内嵌样式中。这种聚集后的样式信息能够被用于正确的将元素表现在浏览器窗口中。在W3C标准中,用于决定元素被计算样式的API是window对象的getComputedStyle()方法。这个方法的第一个参数是期望被计算样式的元素。第二个参数是任何期望的CSS伪对象,比如":before"或者":after"。你很可能不会对伪对象感兴趣,但是在Mozilla和Firefox对于该方法的实现中,第二个参数是不能被忽略的。否则,由于它的第二个参数,你总是会发现getComputedStyle()引发null。getComputedStyle()的返回值是一个表现所有加载确定元素或者伪对象的样式的CSS2属性对象。与CSS2属性对象能够控制内嵌样式信息不同,getComputedStyle()返回的对象是只读的。IE不支持getComputedStyle()方法,但是提供了一个更简单的替代方案。每个HTML元素有一个currentStyle属性可以控制它被计算的样式。IE的这个API唯一的缺点就是它不能提供一个查询伪对象样式的方式。作为被计算样式的的一个例子,你可以使用如下的跨平台的代码来确认元素被表现的字型:

var p = document.getElementsByTagName("p")[0]; // Get first paragraph of doc 
var typeface = ""; // We want its typeface 
if (p.currentStyle) // Try simple IE API first 
typeface = p.currentStyle.fontFamily; 
else if (window.getComputedStyle) // Otherwise use W3C API 
typeface = window.getComputedStyle(p, null).fontFamily;

计算样式很快,而且它并不总是提供你想要的信息。考虑刚才字型的例子。font-family属性接受了一个逗号分隔的列表,轻松的为跨平台提供了被期望的字体类型。当你查询被计算的fontFamily属性时,你很容易得到确定的加在元素上的font-family样式的值。这或许返回一个值类似于"arial,helvetica,sans-serif",却并不告诉你究竟哪个字型才是真正正在使用的。类似的,如果一个元素没有被绝对定位,而企图通过被计算样式的top和left属性查询它的位置和大小,结果总是返回"auto"。这是一个完全合法的CSS值,只是它并不是你想要的。
Javascript 相关文章推荐
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
模拟用户操作Input元素,不会触发相应事件
May 11 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
Sep 15 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
Mar 08 Javascript
js中最容易被忽视的事件问题大总结
May 15 Javascript
ReactJS实现表单的单选多选和反选的示例
Oct 13 Javascript
Vue项目使用CDN优化首屏加载问题
Apr 01 Javascript
vue-resource:jsonp请求百度搜索的接口示例
Nov 09 Javascript
微信小程序按顺序同步执行的两种方式
Dec 20 Javascript
vue实现商品列表的添加删除实例讲解
May 14 Javascript
JavaScript组合模式---引入案例分析
May 23 Javascript
js png图片(有含有透明)在IE6中为什么不透明了
Feb 07 #Javascript
JavaScript Event学习第八章 事件的顺序
Feb 07 #Javascript
JavaScript Event学习第七章 事件属性
Feb 07 #Javascript
JavaScript Event学习第六章 事件的访问
Feb 07 #Javascript
JavaScript Event学习第五章 高级事件注册模型
Feb 07 #Javascript
JavaScript Event学习第四章 传统的事件注册模型
Feb 07 #Javascript
JavaScript Event学习第三章 早期的事件处理程序
Feb 07 #Javascript
You might like
smtp邮件发送一例
2006/10/09 PHP
PHP 学习路线与时间表
2010/02/21 PHP
PHP取得一个类的属性和方法的实现代码
2011/05/22 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
jquery 插件 任意位置浮动固定层
2008/12/25 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
jQuery操作iframe中js函数的方法小结
2016/07/06 Javascript
js实现html table 行,列锁定的简单实例
2016/10/13 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
Django发送html邮件的方法
2015/05/26 Python
Python验证码识别的方法
2015/07/10 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
存储过程和函数的区别
2013/05/28 面试题
创立科技Java面试题
2015/11/29 面试题
大学同学十年聚会感言
2014/02/21 职场文书
《阳光》教学反思
2014/02/23 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
生产车间标语
2014/06/11 职场文书
乡镇组织委员个人整改措施
2014/09/16 职场文书
英文感谢信格式
2015/01/21 职场文书
综合素质评价个性与发展自我评价
2015/03/06 职场文书
python3 删除所有自定义变量的操作
2021/04/08 Python