js多行文本組件封裝

在項(xiàng)目中,經(jīng)常會(huì)遇到文本超出問題留荔,通常的解決辦法是超出顯示省略號(hào),要么手動(dòng)截取文本豌习,要么設(shè)置css樣式存谎。在此我封裝了一個(gè)組件可以自動(dòng)使多行文本超出部分顯示為省略號(hào),本文主要記錄了思路肥隆,如果嫌我廢話太多可直接下拉至最后代碼(簡(jiǎn)書竟然不能設(shè)置錨點(diǎn)真是...)既荚。

常用到的單行文本超出解決辦法:

{
  overflow: hidden;
  text-overflow: ellipsis;
  white-space:nowrap;
}

我本以為text-overflow也可以設(shè)置多行文本,于是最開始的思路就是用元素的line-height 乘以設(shè)置的行數(shù)rows栋艳,得到高度恰聘,然后手動(dòng)設(shè)置元素高度,超出部分自動(dòng)顯示省略號(hào)豈不是美滋滋,就可以拿去跟同事裝逼了晴叨,UI妹子可能就會(huì)多看我一眼了凿宾。沒想到剛一出馬就遇到了問題,element.style的方式是取不到css設(shè)置的樣式的兼蕊。要使用如下方法(我沒做IE兼容)

  /* 
    element:你的元素初厚,
    attribute:css樣式名,駝峰形式
  */
  /*非IE瀏覽器*/ 
  window.getComputedStyle(element)[attribute]
  /*IE瀏覽器 */ 
  element.currentStyle[attribute]

但是我太高估了text-overflow,這種思路可以實(shí)現(xiàn)文字截取孙技,但是不會(huì)自動(dòng)出現(xiàn)省略號(hào)产禾。

于是我決定集百家之眾長(zhǎng),不能閉(dan)門(wu)造(zhuang)車(bi)牵啦,就去百度了一下亚情,發(fā)現(xiàn)webkit內(nèi)核的瀏覽器可以直接用css樣式設(shè)置多行文本超出部門自動(dòng)顯示省略號(hào),如下所示

  /*webkit-line-clamp設(shè)置行數(shù)即可*/
  {
    display:-webkit-box;
    webkit-line-clamp: 2;
    webkit-box-orient: vertical;
  }  

我不禁痛心疾首哈雏,感覺自己全做了無用功楞件,再也得不到UI妹子的愛了 ,但是轉(zhuǎn)念一想裳瘪,那非webkit內(nèi)核的瀏覽器怎么辦土浸,于是決定寫一個(gè)兼容的方法。

最開始的思路是彭羹,根據(jù)字體大小和元素寬度栅迄,取到單行字?jǐn)?shù),即設(shè)定行數(shù)時(shí)可以得到元素能容納的字?jǐn)?shù)皆怕,這樣做文本截取即可,試驗(yàn)后發(fā)現(xiàn)不同字符的占寬明顯不同西篓,比如單個(gè)漢字就明顯比單個(gè)字母或者數(shù)字占寬要大愈腾,思路流產(chǎn)。

后來轉(zhuǎn)念一想岂津,既然我可以拿到實(shí)時(shí)高度虱黄,我何不每次刪一個(gè)字符就算一遍高度。我可以拿到設(shè)定行數(shù)和行高吮成,所以可以拿到最終呈現(xiàn)的元素的高度橱乱,這樣每次拿實(shí)時(shí)的高度與此高度進(jìn)行比較,若實(shí)時(shí)高度不大于最終高度粱甫,即可實(shí)現(xiàn)文字截取泳叠,此時(shí)我在尾部添加一個(gè)省略號(hào)豈不美哉。試驗(yàn)了一下發(fā)現(xiàn)可行茶宵,即為最終方案危纫,代碼如下
html部分

  <div   
    class="jc-textBox"
    rows="1"
    style="width:100px"
  >
    111111111111111111111111111111111111111
  </div>
  <div   
    class="jc-textBox"
    rows="3"
    style="width:100px"
  >
    啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦
  </div>
  <div   
    class="jc-textBox"
    rows="3"
    style="width:100px"
  >
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  </div>

css部分

  .jc-textBox {
    word-wrap: break-word;
    word-break: break-all;
    overflow: hidden;
    text-overflow: ellipsis;
    line-height: 1;
  }

js部分

  let textBoxs = $('.jc-textBox'),
      tbLength = textBoxs.length;
  
  //獲取元素的當(dāng)前樣式
  const getCurrentStyle = (element,attribute) => {
    return window.getComputedStyle(element)[attribute];
  }

  
  //獲取當(dāng)前行數(shù)設(shè)置下的最大高度
  const getMaxHeight = (element,rows) => {
    let lineHeight = getCurrentStyle(element,'lineHeight');
    let number = 0;
    if(lineHeight === 'normal'){
      let fontSize = getCurrentStyle(element,'fontSize');
      number = getNumber(fontSize) * 1.2;
    }else {
      number = getNumber(lineHeight);
    }
    return number * rows;
  }

  //當(dāng)元素的現(xiàn)有高度大于最大高度時(shí),就刪除字符,直到現(xiàn)有高度不大于最大高度
  const removeLastChar = (element,maxHeight) => {
    let end = false;
    let text = element.innerText;
    let textArr = text.split('');
    while(!end){
      textArr.pop();
      let newText = textArr.join('');
      element.innerText = newText + '...';
      let currentHeight =getCurrentStyle(element,'height');
      currentHeight = getNumber(currentHeight);
      if(currentHeight <= maxHeight){
        end = true;
      }
    }
  }

  //獲取屬性中的數(shù)字
  const getNumber = (str) => {
    let number = parseFloat(str);
    number = Math.ceil(number);
    return number;
  } 

  for(let i = 0;i<tbLength;i++){
    let textBox = textBoxs[i];
    let  options = {
      rows: parseInt(textBox.getAttribute('rows')),
      isSupportLineClamp: typeof(textBox.style.webkitLineClamp) != 'undefined',
    }
    textBox.title = textBox.innerText;
    let rows = options.rows;
    let maxHeight = getMaxHeight(textBox,rows);
    if(options.isSupportLineClamp){
      textBox.style.webkitLineClamp = rows;
      textBox.style.display = '-webkit-box';
      textBox.style.webkitBoxOrient = 'vertical';
    }else {
      let height = getCurrentStyle(textBox,'height');
      height = getNumber(height);
      if(height > maxHeight){
        removeLastChar(textBox,maxHeight);
      }
    }
  }

測(cè)試效果
chrome


chrome-textbox.png

firefox


firefox-textbox.png

注:firefox默認(rèn)樣式時(shí)中文的行高乘行數(shù)不等于元素高度种蝶,至今不知道為啥契耿,可以通過顯式的設(shè)置line-height或者改變font-family來解決,我用了第一種辦法螃征。

好了搪桂,我要去裝逼了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盯滚,一起剝皮案震驚了整個(gè)濱河市踢械,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淌山,老刑警劉巖裸燎,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泼疑,居然都是意外死亡德绿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門退渗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來移稳,“玉大人,你說我怎么就攤上這事会油「隽唬” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵翻翩,是天一觀的道長(zhǎng)都许。 經(jīng)常有香客問我,道長(zhǎng)嫂冻,這世上最難降的妖魔是什么胶征? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮桨仿,結(jié)果婚禮上睛低,老公的妹妹穿的比我還像新娘。我一直安慰自己服傍,他們只是感情好钱雷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吹零,像睡著了一般罩抗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘪校,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天澄暮,我揣著相機(jī)與錄音名段,去河邊找鬼。 笑死泣懊,一個(gè)胖子當(dāng)著我的面吹牛伸辟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馍刮,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼信夫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了卡啰?” 一聲冷哼從身側(cè)響起静稻,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匈辱,沒想到半個(gè)月后振湾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亡脸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年押搪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浅碾。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡大州,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垂谢,到底是詐尸還是另有隱情厦画,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布滥朱,位于F島的核電站根暑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏徙邻。R本人自食惡果不足惜购裙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹃栽。 院中可真熱鬧,春花似錦躯畴、人聲如沸民鼓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丰嘉。三九已至,卻和暖如春嚷缭,著一層夾襖步出監(jiān)牢的瞬間饮亏,已是汗流浹背耍贾。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留路幸,地道東北人荐开。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像简肴,于是被迫代替她去往敵國(guó)和親晃听。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案砰识? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5能扒? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,486評(píng)論 1 45
  • 1辫狼、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,981評(píng)論 3 119
  • 美國(guó)著名電影理論家和影評(píng)人初斑、俄亥俄州凱斯西儲(chǔ)大學(xué)榮譽(yù)教授路易斯·賈內(nèi)梯的《認(rèn)識(shí)電影》,從20世紀(jì)70年代流行至今膨处,...
    我是松鼠醬閱讀 286評(píng)論 0 0
  • 今天4:14分被手環(huán)無緣無故振醒灵迫,以為時(shí)間到了秦叛,起床一看,不對(duì)瀑粥。又回到床上挣跋,忘記帶上手環(huán),結(jié)果一覺睡到六點(diǎn)半狞换。我知...
    孫蘋閱讀 632評(píng)論 0 1