Бывают ситуации, когда может быть полезно получить точную ширину пикселя измерения em
. Например, предположим, что у вас есть элемент с свойством CSS (например, границей или дополнением), который измеряется в ems, и вам нужно получить точную ширину пикселя границы или отступов. Там есть вопрос, который затрагивает эту тему:
Как я могу получить размер шрифта по умолчанию в пикселях с помощью JavaScript или JQuery?
Этот вопрос задает вопрос о получении размера шрифта по умолчанию, который необходим для преобразования относительного значения em
в точное значение px
.
Этот ответ содержит довольно хорошее объяснение того, как получить размер шрифта по умолчанию для элемента:
Поскольку ems измеряют ширину, вы всегда можете вычислить точный пиксельный шрифт размер, создавая div, который составляет 1000 ems long и делит его client-Width на 1000. Я, кажется, помню, что ems усекаются до ближайшая тысячная, поэтому вам нужно 1000 ems, чтобы избежать ошибочного усечение результата пикселя.
Итак, используя этот ответ в качестве руководства, я написал следующую функцию, чтобы получить размер шрифта по умолчанию:
function getDefaultFontSize(parentElement)
{
parentElement = parentElement || document.body;
var div = document.createElement('div');
div.style.width = "1000em";
parentElement.appendChild(div);
var pixels = div.offsetWidth / 1000;
parentElement.removeChild(div);
return pixels;
}
Как только у вас будет размер шрифта по умолчанию, вы можете преобразовать ширину em
в ширину px
, просто умножив ems на размер шрифта по умолчанию элемента и округляя результат:
Math.round(ems * getDefaultFontSize(element.parentNode))
Проблема: getDefaultFontSize
идеально подходит как простая, свободная от побочных эффектов функция, которая возвращает размер шрифта по умолчанию. Но у этого есть неудачный побочный эффект: он изменяет DOM! Он добавляет ребенка, а затем удаляет его. Добавление ребенка необходимо для получения действительного свойства offsetWidth
. Если вы не добавляете дочерний элемент div
в DOM, свойство offsetWidth
остается равным 0, потому что элемент никогда не отображается. Несмотря на то, что мы сразу удаляем дочерний элемент, эта функция может по-прежнему создавать непреднамеренные побочные эффекты, такие как запуск события (например, событие Internet Explorer onpropertychange
или событие W3C DOMSubtreeModified
), которое прослушивалось на родительском элементе.
Вопрос: Есть ли способ написать по-настоящему свободную функцию побочного эффекта getDefaultFontSize()
, которая не будет случайно запускать обработчики событий или вызывать другие непредвиденные побочные эффекты?