Получить вычисленный размер шрифта для элемента DOM в JS
Можно ли определить вычисленный font-size
элемента DOM с учетом общих настроек, сделанных в другом месте (например, в теге body
), унаследованных значений и т.д.?
Независимо от подхода, основанного на структуре, было бы неплохо, поскольку я работаю над script, который должен работать автономно, но это, конечно, не обязательно.
Справочная информация: я пытаюсь настроить плагин выбора шрифтов CKEditor (источник здесь), чтобы он всегда показывал размер шрифта текущей позиции курсора (в отличие от того, когда внутри span
, который имеет явный набор font-size
, который является текущим поведением).
Ответы
Ответ 1
Вы можете попробовать использовать нестандартное свойство 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)];
}
}
Использование:
var element = document.getElementById('elementId');
getStyle(element, 'font-size');
Дополнительная информация:
Изменить: Спасибо @Crescent Fresh, @kangax и @Pekka за комментарии.
Изменения:
- Добавлена функция
camelize
, так как свойства, содержащие hypens, такие как font-size
, должны быть доступны как camelCase (например.: fontSize
) в объекте IE currentStyle
.
- Проверка существования
document.defaultView
перед доступом к getComputedStyle
.
- Добавлен последний случай, когда
el.currentStyle
и getComputedStyle
недоступны, получите встроенное свойство CSS через element.style
.
Ответ 2
Чтобы преодолеть проблему "em", я быстро написал функцию, если размер шрифта в ie является "em", функция вычисляет с размером шрифта тела.
function getFontSize(element){
var size = computedStyle(element, 'font-size');
if(size.indexOf('em') > -1){
var defFont = computedStyle(document.body, 'font-size');
if(defFont.indexOf('pt') > -1){
defFont = Math.round(parseInt(defFont)*96/72);
}else{
defFont = parseInt(defFont);
}
size = Math.round(defFont * parseFloat(size));
}
else if(size.indexOf('pt') > -1){
size = Math.round(parseInt(size)*96/72)
}
return parseInt(size);
}
function computedStyle(element, property){
var s = false;
if(element.currentStyle){
var p = property.split('-');
var str = new String('');
for(i in p){
str += (i > 0)?(p[i].substr(0, 1).toUpperCase() + p[i].substr(1)):p[i];
}
s = element.currentStyle[str];
}else if(window.getComputedStyle){
s = window.getComputedStyle(element, null).getPropertyValue(property);
}
return s;
}
Ответ 3
Похоже, что jQuery (по крайней мере, 1.9) использует getComputedStyle()
или currentStyle
сам, когда вы используете $('#element')[.css][1]('fontSize')
, поэтому вам действительно не нужно беспокоиться о более сложных решениях, если вы в порядке используете jQuery.
Протестировано в IE 7-10, FF и Chrome