Бывают ситуации, когда может быть полезно получить точную ширину пикселя измерения em
. Например, предположим, что у вас есть элемент с свойством CSS (например, границей или дополнением), который измеряется в ems, и вам нужно получить точную ширину пикселя границы или отступов. Там в существующий вопрос, который затрагивает эту тему:Преобразование em в px в Javascript (и получение размера шрифта по умолчанию)
How can i get default font size in pixels by using JavaScript or JQuery?
Этот вопрос просит о том, чтобы размер по умолчанию шрифта - который необходим для того, чтобы преобразовать относительную em
значение для точного px
значения.
This answer имеет довольно хорошее объяснение того, как идти о получении размера шрифта по умолчанию элемента:
Поскольку ширина Эмса меры всегда можно вычислить точный пиксельный шрифт размера путем создания 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
ширина, просто умножив СЭМ по размеру шрифта по умолчанию элемента и округляя результат:
Math.round(ems * getDefaultFontSize(element.parentNode))
Задача:getDefaultFontSize
идеально подходит для простой, свободной от побочных эффектов функции, которая возвращает размер шрифта по умолчанию. Но это У есть неудачный побочный эффект: он изменяет DOM! Он добавляет ребенка, а затем удаляет его. Добавление ребенка необходимо, чтобы получить действительное свойство offsetWidth
. Если вы не добавите дочерний элемент div
в DOM, свойство offsetWidth
останется на 0, потому что элемент никогда не отображается. Несмотря на то, что мы сразу удаляем дочерний элемент, эта функция может по-прежнему создавать непреднамеренные побочные эффекты, такие как запуск события (например, событие onpropertychange
или приложение W3C DOMSubtreeModified
), которое прослушивало родительский элемент.
Вопрос: Есть ли способ, чтобы написать действительно побочный эффект свободного getDefaultFontSize()
функции, которая не случайно сгореть обработчик событий или вызвать другие непредвиденные побочные эффекты?
Не совсем, это то, как работает DOM. Однако вы можете установить класс созданного элемента на что-то вроде «font-size-check», а затем в любом случае, запущенном, проверьте, имеет ли этот элемент этот класс, чтобы определить, следует ли его игнорировать. –
Пройдите DOM, пока не найдете узел с шириной, указанной в ems, и используйте это для несколько менее точного измерения? Единственным побочным эффектом является время обработки. Также не гарантируется работа. – mgiuffrida