TS計算任意字符串寬度

前言:由于像素和字體大小缸废,字節(jié)(特別是 UTF-8)等限制因素软能,所以我們不能直接知道一個字符串所占的實際寬度饰潜。

這里提供幾種比較測量方法:

1、通過Canvas測

const getTextWidth = (text:string, font:string = "normal 12pt arial"): number => {
  if (!text) return 12;
  const canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas"));
  const context = canvas.getContext("2d"); 
  context.font = font;
  const metrics = context.measureText(text);
  return metrics.width;
}

或者

let tCanvas = null;
const getTextWidth = (text:string, font:string = "normal 12pt sans-serif"): number => {
  if (!text) return 12;
  let canvas = tCanvas || (tCanvas = document.createElement("canvas"));
  const context = canvas.getContext("2d"); 
  context.font = font;
  const metrics = context.measureText(text);
  return metrics.width;
}

使用:

const width = getTextWidth("hello there!", "bold 12pt arial")
console.log('width:', width)

2箕别、通過 DOM 測量铜幽,這種方法在字符串中含有多個空格時滞谢,測出來的寬度會一樣

// 計算單行文本寬度
const getTextWidth = (text: string = "", font: string = "12px"): number => {
  if (!text) return 12;
  const dom = document.createElement("span") as HTMLElement;
  dom.style.display = "inline-block";
  dom.style.fontSize = font;
  dom.style.whiteSpace = "nowrap";
  dom.textContent = text;
  document.body.appendChild(dom);
  const width = dom.clientWidth;
  document.body.removeChild(dom);
  return width;
};

3、用個 visibility: hidden 的浮動的層來計算字符串寬度除抛。

在添加的 div 容器里把樣式設置為和你實際的 div 一樣狮杨。

<!DOCTYPE html>
<html> 
<head>
  <script src='jquery.min.js'></script>
</head>
<body>
  <div
    id='labelText' 
    style='color:black; line-height:1.2; white-space: nowrap; position:fixed;
      top:0px; left:0px; display:block; visibility:visible;'
  ></div>
 
  <script>
    var str = 'Live like you were dying, Love because you do.';
    str = str.substring(0, str.length);
    $('#labelText').css({
      'font-size': '12px',
      'font-family': 'Microsoft YaHei'
    }).html(str);
    var width = $('#labelText').width();
    console.log(width);
  </script>
</body>
</html>

計算高度也一樣。

注意:最后別忘了移除額外添加的 div到忽!

點贊加關注橄教,永遠不迷路

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喘漏,隨后出現(xiàn)的幾起案子护蝶,更是在濱河造成了極大的恐慌,老刑警劉巖翩迈,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件持灰,死亡現(xiàn)場離奇詭異,居然都是意外死亡负饲,警方通過查閱死者的電腦和手機堤魁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來返十,“玉大人妥泉,你說我怎么就攤上這事“陕” “怎么了涛漂?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長检诗。 經常有香客問我匈仗,道長,這世上最難降的妖魔是什么逢慌? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任悠轩,我火速辦了婚禮,結果婚禮上攻泼,老公的妹妹穿的比我還像新娘火架。我一直安慰自己,他們只是感情好忙菠,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布何鸡。 她就那樣靜靜地躺著,像睡著了一般牛欢。 火紅的嫁衣襯著肌膚如雪骡男。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天傍睹,我揣著相機與錄音隔盛,去河邊找鬼犹菱。 笑死,一個胖子當著我的面吹牛吮炕,可吹牛的內容都是我干的腊脱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼龙亲,長吁一口氣:“原來是場噩夢啊……” “哼陕凹!你這毒婦竟也來了?” 一聲冷哼從身側響起俱笛,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捆姜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迎膜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泥技,經...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年磕仅,在試婚紗的時候發(fā)現(xiàn)自己被綠了珊豹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡榕订,死狀恐怖店茶,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情劫恒,我是刑警寧澤贩幻,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站两嘴,受9級特大地震影響丛楚,放射性物質發(fā)生泄漏。R本人自食惡果不足惜憔辫,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一趣些、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贰您,春花似錦坏平、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杠园,卻和暖如春坎穿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背返劲。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工玲昧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篮绿。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓孵延,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亲配。 傳聞我的和親對象是個殘疾皇子尘应,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容