获取JS中DOM元素的计算字体大小

Pek*_*ica 33 javascript css jquery font-size ckeditor

是否可以检测font-sizeDOM元素的计算,考虑在其他地方(body例如在标签中),继承的值等进行的通用设置?

一个独立于框架的方法会很好,因为我正在编写一个独立运行的脚本,但这当然不是必需的.

背景:我正在尝试调整CKEditor的字体选择器插件(源于此处),以便它始终显示当前光标位置的字体大小(与仅在span具有显式font-size集合的情况下相反,这是当前行为).

CMS*_*CMS 53

您可以尝试使用非标准IE element.currentStyle属性,否则您可以查找DOM Level 2标准getComputedStyle方法(如果可用):

function getStyle(el,styleProp) {
  var camelize = function (str) {
    return str.replace(/\-(\w)/g, function(str, letter){
      return letter.toUpperCase();
    });
  };

  if (el.currentStyle) {
    return el.currentStyle[camelize(styleProp)];
  } else if (document.defaultView && document.defaultView.getComputedStyle) {
    return document.defaultView.getComputedStyle(el,null)
                               .getPropertyValue(styleProp);
  } else {
    return el.style[camelize(styleProp)]; 
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

var element = document.getElementById('elementId');
getStyle(element, 'font-size');
Run Code Online (Sandbox Code Playgroud)

更多信息:

编辑:感谢@Crescent Fresh,@ kangax@Pekka的评论.

变化:

  • 添加camelize函数,因为包含超量的属性font-size必须作为IE对象fontSize上的camelCase(例如:)访问currentStyle.
  • document.defaultView在访问之前检查是否存在getComputedStyle.
  • 添加了最后一种情况,当el.currentStylegetComputedStyle不可用时,通过获取内联CSS属性element.style.

  • 小心,`currentStyle`和`getComputedStyle`根本不同:http://erik.eae.net/archives/2007/07/27/18.54.15/`getComputedStyle`无法获得*继承*样式,并且总是*计算*它为`px`,无论该值是否被声明为`px`. (6认同)
  • 它实际上是`document.defaultView.getComputedStyle`,而不是`window.getComputedStyle`(MDC弄错了,或者只考虑它自己的 - Mozilla - 实现).`getComputedStyle`被指定为`AbstractView`的成员,`document.defaultView`实现了,并且实际上不能保证`window == document.defaultView`(既不是specs,也不是实践;实际上,Safari 2 .x是`window!= document.defaultView`)的一个很好的例子.有趣的是,PPK在你链接的getstyles文章中做了类似的错误(在`window`上测试`defaultView`). (6认同)
  • 排序.@CMS,如果我没弄错,你需要编辑你的答案,指出`currentStyle`只接受camelized属性(例如fontSize),而`getPropertyValue`与原始形式(font-size)一起使用. (2认同)