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 相关文章推荐
第五章之BootStrap 栅格系统
Apr 25 Javascript
在localStorage中存储对象数组并读取的方法
Sep 24 Javascript
JS实现旋转木马式图片轮播效果
Jan 18 Javascript
用jquery的attr方法实现图片切换效果
Feb 05 Javascript
JavaScript变量作用域_动力节点Java学院整理
Jun 27 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
Aug 23 Javascript
AngularJS中的路由使用及实现代码
Oct 09 Javascript
Express下采用bcryptjs进行密码加密的方法
Feb 07 Javascript
Vue cli构建及项目打包以及出现的问题解决
Aug 27 Javascript
React Native中Mobx的使用方法详解
Dec 04 Javascript
使用webpack搭建vue项目实现脚手架功能
Mar 15 Javascript
一文搞懂redux在react中的初步用法
Jun 09 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
PHP数据缓存技术
2007/02/14 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
PHP--用万网的接口实现域名查询功能
2012/12/13 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
原生JS生成指定位数的验证码
2020/10/28 Javascript
Python中的模块和包概念介绍
2015/04/13 Python
python实现折半查找和归并排序算法
2017/04/14 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
白酒业务员岗位职责
2013/12/27 职场文书
上班睡觉检讨书
2014/01/09 职场文书
高二历史教学反思
2014/01/25 职场文书
安全生产检查通报
2014/01/29 职场文书
婚礼庆典答谢词
2015/01/20 职场文书
新郎接新娘保证书
2015/05/08 职场文书
单身证明格式样本
2015/06/15 职场文书
话题作文之自信作文
2019/11/15 职场文书