Tôi thích "ý tưởng duy nhất" của bạn về việc chỉ làm một bản đồ chiều rộng ký tự tĩnh! Nó thực sự hoạt động tốt cho mục đích của tôi. Đôi khi, vì lý do hiệu suất hoặc vì bạn không có quyền truy cập dễ dàng vào DOM, bạn có thể chỉ muốn một máy tính độc lập hacky nhanh chóng được hiệu chỉnh theo một phông chữ duy nhất. Vì vậy, đây là một trong những hiệu chuẩn để Helvetica; truyền một chuỗi và (tùy chọn) một cỡ chữ:
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
}
Mảng xấu xí khổng lồ đó là độ rộng ký tự ASCII được lập chỉ mục theo mã ký tự. Vì vậy, điều này chỉ hỗ trợ ASCII (nếu không, nó giả sử độ rộng ký tự trung bình). May mắn thay, chiều rộng về cơ bản tỷ lệ tuyến tính với kích thước phông chữ, vì vậy nó hoạt động khá tốt ở bất kỳ kích thước phông chữ nào. Đáng chú ý là thiếu bất kỳ nhận thức về k sâu hoặc chữ hoặc bất cứ điều gì.
Để "hiệu chỉnh", tôi chỉ hiển thị mọi ký tự lên charCode 126 (dấu ngã mạnh mẽ) trên một svg và lấy hộp giới hạn và lưu nó vào mảng này; thêm mã và giải thích và demo ở đây .