मुझे आपका "केवल विचार" सिर्फ एक स्थैतिक चरित्र चौड़ाई मानचित्र करने जैसा है! यह वास्तव में मेरे उद्देश्यों के लिए अच्छा काम करता है। कभी-कभी, प्रदर्शन कारणों के लिए या क्योंकि आपके पास DOM तक आसान पहुँच नहीं है, आप बस एक त्वरित हैकी स्टैंडअलोन कैलकुलेटर को एक ही फ़ॉन्ट पर कैलिब्रेट कर सकते हैं। तो यहाँ एक Helvetica को कैलिब्रेट किया गया है; एक स्ट्रिंग पास करें और (वैकल्पिक रूप से) एक फ़ॉन्ट आकार:
function measureText(str, fontSize = 10) {
const widths = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2796875,0.2765625,0.3546875,0.5546875,0.5546875,0.8890625,0.665625,0.190625,0.3328125,0.3328125,0.3890625,0.5828125,0.2765625,0.3328125,0.2765625,0.3015625,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.2765625,0.2765625,0.584375,0.5828125,0.584375,0.5546875,1.0140625,0.665625,0.665625,0.721875,0.721875,0.665625,0.609375,0.7765625,0.721875,0.2765625,0.5,0.665625,0.5546875,0.8328125,0.721875,0.7765625,0.665625,0.7765625,0.721875,0.665625,0.609375,0.721875,0.665625,0.94375,0.665625,0.665625,0.609375,0.2765625,0.3546875,0.2765625,0.4765625,0.5546875,0.3328125,0.5546875,0.5546875,0.5,0.5546875,0.5546875,0.2765625,0.5546875,0.5546875,0.221875,0.240625,0.5,0.221875,0.8328125,0.5546875,0.5546875,0.5546875,0.5546875,0.3328125,0.5,0.2765625,0.5546875,0.5,0.721875,0.5,0.5,0.5,0.3546875,0.259375,0.353125,0.5890625]
const avg = 0.5279276315789471
return str
.split('')
.map(c => c.charCodeAt(0) < widths.length ? widths[c.charCodeAt(0)] : avg)
.reduce((cur, acc) => acc + cur) * fontSize
}
यह विशालकाय बदसूरत सरणी वर्ण कोड द्वारा अनुक्रमित ASCII वर्ण चौड़ाई है। तो यह सिर्फ ASCII का समर्थन करता है (अन्यथा यह औसत चरित्र चौड़ाई मानता है)। सौभाग्य से, चौड़ाई मूल रूप से फ़ॉन्ट आकार के साथ रैखिक रूप से होती है, इसलिए यह किसी भी फ़ॉन्ट आकार में बहुत अच्छी तरह से काम करता है। यह कहीं भी kernering या ligatures या जो भी के बारे में जागरूकता का अभाव है।
"कैलिब्रेट" करने के लिए मैंने हर चरित्र को एक svg पर charCode 126 (शक्तिशाली टिल्ड) तक प्रदान किया और बाउंडिंग बॉक्स प्राप्त किया और इसे इस सरणी में सहेजा; अधिक कोड और स्पष्टीकरण और डेमो यहाँ ।