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 相关文章推荐
JS 动态加载脚本的4种方法
May 05 Javascript
firefox和IE系列的相关区别整理 以备后用
Dec 28 Javascript
JQuery中Bind()事件用法分析
May 05 Javascript
jQuery插件jRumble实现网页元素抖动
Jun 05 Javascript
浅谈jquery.fn.extend与jquery.extend区别
Jul 13 Javascript
将页面table内容与样式另存成excel文件的方法
Aug 05 Javascript
Jquery轮播效果实现过程解析
Mar 30 Javascript
浅谈js的异步执行
Oct 18 Javascript
bootstrap modal弹出框的垂直居中
Dec 14 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
Aug 22 Javascript
vuex 实现getter值赋值给vue组件里的data示例
Nov 05 Javascript
jQuery实现滑动星星评分效果(每日分享)
Nov 13 jQuery
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中实现Javascript的escape()函数代码
2010/08/08 PHP
微信支付开发维权通知实例
2016/07/12 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
jquery form表单提交插件asp.net后台中文解码
2010/06/12 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
python实现的各种排序算法代码
2013/03/04 Python
python集合用法实例分析
2015/05/30 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
pycharm 如何取消连按两下shift出现的全局搜索
2021/01/15 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
Julep官网:美容产品和指甲油
2017/02/25 全球购物
公司拓展活动方案
2014/02/13 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
redis实现排行榜功能
2021/05/24 Redis
python 管理系统实现mysql交互的示例代码
2021/12/06 Python