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 相关文章推荐
jQuery快速上手:写jQuery与直接写JS的区别详细解析
Aug 26 Javascript
javascript使用location.search的示例
Nov 05 Javascript
jQuery控制iFrame(实例代码)
Nov 19 Javascript
js创建对象的方式总结
Jan 10 Javascript
js实现滑动触屏事件监听的方法
May 05 Javascript
JavaScript中使用Math.PI圆周率属性的方法
Jun 14 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
May 04 jQuery
JS判断一个数是否是水仙花数
Jun 11 Javascript
React-Native 组件之 Modal的使用详解
Aug 08 Javascript
vue 通过下拉框组件学习vue中的父子通讯
Dec 19 Javascript
vue请求本地自己编写的json文件的方法
Apr 25 Javascript
优雅的使用javascript递归画一棵结构树示例代码
Sep 22 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
DISCUZ 分页代码
2007/01/02 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
js 页面输出值
2008/11/30 Javascript
js GridView 实现自动计算操作代码
2009/03/25 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
微信JS接口大全
2016/08/25 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
在Python中使用next()方法操作文件的教程
2015/05/24 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
详解Python中的type和object
2018/08/15 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
python3正则模块re的使用方法详解
2020/02/11 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
2020/05/25 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
30年同学聚会感言
2014/01/30 职场文书
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL