在某些情況下,獲取em
度量的確切像素寬度可能很有用。例如,假設您有一個帶有CSS屬性的元素(如邊框或填充),這是以ems度量的,並且您需要獲得邊框或填充的精確像素寬度。有一個現有的問題,其中涉及這個話題:在JavaScript中將em轉換爲px(並獲取默認字體大小)
How can i get default font size in pixels by using JavaScript or JQuery?
這個問題是問得到默認字體大小 - 這是必要的,以相對em
值轉換爲一個確切的px
值。
This answer對如何去獲得一個元素的默認字體大小相當不錯的解釋:通過創建一個div是
由於EMS測量寬度可以隨時計算出精確的像素字體 大小1000 ems長,並將其 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
理想情況下應該是一個簡單的副作用自由函數,它返回默認的字體大小。但它DOERS有一個不幸的副作用:它修改DOM!它追加一個孩子,然後移除孩子。爲了得到有效的offsetWidth
屬性,附加孩子是必要的。如果您不將子div
附加到DOM,則offsetWidth
屬性將保持爲0,因爲該元素永遠不會呈現。儘管我們立即刪除了子元素,但此函數仍可能會產生意想不到的副作用,例如觸發正在父元素上偵聽的事件(如Internet Explorer的onpropertychange
或W3C的DOMSubtreeModified
事件)。
問:有沒有什麼辦法來寫一個真正的無副作用getDefaultFontSize()
功能不會意外火災事件處理或造成其他意外的副作用?
不是真的,這就是DOM的工作原理。但是,您可以將創建的元素的類設置爲諸如「font-size-check」之類的東西,然後在任何事件觸發時檢查該元素是否具有該類以確定是否忽略它。 –
遍歷DOM,直到找到一個寬度指定爲ems的節點,並將其用於不太精確的測量?唯一的副作用是處理時間。也不能保證工作。 – mgiuffrida