em
測定値の正確なピクセル幅を取得すると便利な場合があります。たとえば、ems で測定される CSS プロパティ (border や padding など) を持つ要素があり、border や padding の正確なピクセル幅を取得する必要があるとします。このトピックに触れる既存の質問があります:
JavaScriptまたはJQueryを使用してデフォルトのフォントサイズをピクセル単位で取得するにはどうすればよいですか?
この質問は、相対値を正確な値に変換するために必要なデフォルトのフォントサイズを取得することについて尋ねています。 em
px
この回答には、要素のデフォルトのフォントサイズを取得する方法についてのかなり良い説明があります:
ems は幅を測定するので、1000 ems の長さの div を作成し、その client-Width プロパティを 1000 で割ることによって、正確なピクセル フォント サイズをいつでも計算できます。ピクセル結果の誤った切り捨てを回避します。
したがって、この回答をガイドとして使用して、デフォルトのフォントサイズを取得する次の関数を作成しました。
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;
}
デフォルトのフォント サイズを取得したら、要素のデフォルトのフォント サイズで ems を乗算し、結果を丸めるだけで、任意のem
幅を幅に変換できます。px
Math.round(ems * getDefaultFontSize(element.parentNode))
問題:はgetDefaultFontSize
、デフォルトのフォント サイズを返す単純で副作用のない関数であることが理想的です。しかし、残念な副作用があります: DOM を変更します! 子を追加してから削除します。有効なoffsetWidth
プロパティを取得するには、子を追加する必要があります。div
子を DOM に追加しない場合offsetWidth
、要素がレンダリングされないため、プロパティは 0 のままです。子要素をすぐに削除しても、この関数は、親要素でリッスンしていたイベント (Internet Exploreronpropertychange
や W3C のイベントなど) を発生させるなど、意図しない副作用を引き起こす可能性があります。DOMSubtreeModified
質問:getDefaultFontSize()
誤ってイベント ハンドラーを起動したり、その他の意図しない副作用を引き起こしたりしない、真に副作用のない関数を作成する方法はありますか?