当前位置:   article > 正文

最多显示三行,多余...展开,点击展开收起 getClientRects_最多3行

最多3行

需求:显示文本,最多显示三行,多余的显示 ... 展开,点击展开收起.

效果如下:



需要考虑的点:换行,展开的时候遮住收起



如果是不需要有固定在右侧的展开收起,那么移动端直接用css3

  1. overflow: hidden;
  2. text-overflow: ellipsis;
  3. display: -webkit-box;
  4. -webkit-line-clamp: 3;
  5. -webkit-box-orient: vertical

之前想过用屏幕宽度减去两边留白  除以字体大小,得出每一行可以显示多少行字。

var oneCount = Math.floor((window.innerWidth - 55-15 ) / 16),
function getStrByteLen(v) {
    //一个中文按照两个字节算,返回长度
    return v ? v.replace(/[\u00FF-\uFFFF]/g, "  ").length : 0;
}

然而需要考虑的因素很多:

1、头部有标签,得加入计算

2、有换行

3、单行可显示的字符数不是刚好对应上,如可以显示3个字符,那么“aa中",则中字换行。

……

等等总是很难达到比较满意的效果。显示总有出入。

真正解决问题是使用

getClientRects

getClientRects这个方法如果是读取div元素上的,则总是一行

  1. <div class="txt">
  2. 我是一个小文本,
  3. 我是一个小文本
  4. </div>
那么如下:

document.querySelector(".txt").getClientRects()

读取到的总是一行


需要把块级元素div ---> 行内元素span


  1. function handleTxt() {
  2. var dom = document.querySelectorAll(".quan_feed_desc[data-shareid]");
  3. for(var i=0,len=dom.length;i<len;i++){
  4. var shareid = dom[i].dataset.shareid;
  5. if(typeof shareid=="undefined") continue;
  6. var obj={};
  7. for(var j=feedObj.openText,len2=feedObj.feedlist.length;j<len2;j++){//openText,记录上次计算到哪里了。
  8. if(feedObj.feedlist[j].shareid==shareid){
  9. obj = feedObj.feedlist[j];
  10. break;
  11. }
  12. }
  13. var rect = dom[i].getClientRects();
  14. var h = getLength(rect);
  15. if(h<3||!obj.showTxt){
  16. dom[i].removeAttribute("data-shareid");
  17. continue;
  18. }
  19. var tl=0,t = obj.showTxt;
  20. dom[i].querySelectorAll(".dot").forEach(function (el) {
  21. el.style.display="inline-block";//把点点和展开放开,为后面计算更真实
  22. });
  23. var showtxt = dom[i].querySelector(".showtxt");
  24. while(h>3){
  25. var step=1;
  26. if(/<br\/>$/.test(t)){//回退的时候,如果碰到换行要整体替换
  27. step = 5;
  28. }
  29. t = t.slice(0,-step);
  30. showtxt.innerHTML = t;
  31. h = getLength(dom[i].getClientRects());
  32. tl+=step;
  33. }
  34. obj.hideTxt =obj.showTxt.slice(obj.showTxt.length-tl);
  35. if(obj.hideTxt){
  36. var height=dom[i].querySelector(".quan_feed_more").offsetWidth;//页面展开更多的大小
  37. obj.hideTxt+=(rect[rect.length-1].width>(dom[i].offsetWidth-height)?'<span style="display:inline-block;width:'+height+'px"></span>':'');//页面收起和正文重叠
  38. }
  39. obj.showTxt = t;
  40. obj.txtDone = 1;
  41. dom[i].removeAttribute("data-shareid");
  42. }
  43. feedObj.openText = feedObj.feedlist.length;
  44. }
  1. function getLength(list){
  2. var line = 0, lastBottom=0;
  3. for(var i=0,len=list.length;i<len;i++){
  4. if(list[i].bottom ==lastBottom){
  5. return;
  6. }
  7. lastBottom = list[i].bottom;
  8. line++;
  9. }
  10. return line;
  11. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/blog/article/detail/77100
推荐阅读