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实用基础超详细介绍
Apr 11 Javascript
jQuery在iframe中无法弹出对话框的解决方法
Jan 12 Javascript
jQuery照片伸缩效果不影响其他元素的布局
May 09 Javascript
初识Node.js
Sep 03 Javascript
js实现编辑div节点名称的方法
Dec 17 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
Feb 25 Javascript
AngularJS表达式讲解及示例代码
Aug 16 Javascript
js鼠标经过tab选项卡时实现切换延迟
Mar 24 Javascript
vue的for循环使用方法
Feb 12 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
Jul 17 Javascript
JavaScript前端开发时数值运算的小技巧
Jul 28 Javascript
你不知道的SpringBoot与Vue部署解决方案
Nov 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
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
PHP Zip解压 文件在线解压缩的函数代码
2010/05/26 PHP
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
PHP rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
PHP框架Laravel的小技巧两则
2015/02/10 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
Vue实现简单分页器
2018/12/29 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
ES6的异步操作之promise用法和async函数的具体使用
2019/12/06 Javascript
python调用windows api锁定计算机示例
2014/04/17 Python
在Python中使用Mako模版库的简单教程
2015/04/08 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
2014全国两会大学生学习心得体会
2014/03/10 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
图书室标语
2014/06/21 职场文书
经验交流材料格式
2014/12/30 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
Python中的程序流程控制语句
2022/02/24 Python
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS