Convertendo em para px em Javascript (e obtendo o tamanho de fonte padrão)

Existem situações em que pode ser útil obter a largura exata de pixels de umem medição. Por exemplo, suponha que você tenha um elemento com uma propriedade CSS (como borda ou preenchimento), que é medido em ems, e você precisa obter a largura exata do pixel da borda ou do preenchimento. Há uma pergunta existente que aborda este tópico:

Como posso obter o tamanho de fonte padrão em pixels usando JavaScript ou JQuery?

Esta questão está perguntando sobre como obter otamanho de fonte padrão - o que é necessário para converter um parenteem valor para um exatopx valor.

Esta resposta tem uma boa explicação de como obter o tamanho de fonte padrão de um elemento:

Como o ems mede a largura, você sempre pode calcular o tamanho exato da fonte do pixel criando uma div que é 1000 ems e dividindo sua propriedade client-Width por 1000. Eu pareço lembrar que os ems são truncados para o milésimo mais próximo, então você precisa de 1000 ems para evitar um truncamento incorreto do resultado do pixel.

Então, usando essa resposta como guia, escrevi a seguinte função para obter o tamanho de fonte padrão:

<code>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;
}
</code>

Depois de ter o tamanho da fonte padrão, você pode converter qualquerem largura parapx largura apenas multiplicando o ems pelo tamanho de fonte padrão do elemento e arredondando o resultado:

Math.round(ems * getDefaultFontSize(element.parentNode))

Problema: ogetDefaultFontSize Idealmente, é ideal que seja uma função simples, sem efeitos colaterais, que retorna o tamanho de fonte padrão. Mas issoFAZ tem um efeito colateral infeliz: modifica o DOM! Acrescenta um filho e, em seguida, remove o filho. Anexar o filho é necessário para obter uma validadeoffsetWidth propriedade. Se você não anexar a criançadiv para o DOM, ooffsetWidth a propriedade permanece em 0 porque o elemento nunca é renderizado. Embora removamos imediatamente o elemento filho, essa função ainda pode criar efeitos colaterais indesejados, como disparar um evento (como o Internet Explorer).onpropertychange ou W3CDOMSubtreeModified evento) que estava escutando no elemento pai.

Questão: Existe alguma maneira de escrever um verdadeiro efeito colateral livregetDefaultFontSize() função que não acidentalmente disparar manipuladores de eventos ou causar outros efeitos colaterais não intencionais?

questionAnswers(4)

yourAnswerToTheQuestion