FE-problem-collection icon indicating copy to clipboard operation
FE-problem-collection copied to clipboard

多行文本溢出显示省略号

Open mayufo opened this issue 8 years ago • 7 comments

最近在项目的制作过程中遇到超出需要折行的问题 如果是一行超出

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

当然还需要设置宽度的

还可以参考 之前的解决方案 https://github.com/ShuyunXIANFESchool/FE-problem-collection/issues/13

问题

如果是两行显示,第一行折行,第二行需要超出省略该如何实现呢? 或者第N行要省略该如何解决呢?

解决

  • 解决方案1 css 的不规则属性解决

-webkit-line-clamp 是一个不规则属性,不出现在css 草案中。用来实现块级元素显示几行,它需要与其他元素组合使用

display:-webkit-box;
-webkit-box-orient: vertical; // 从上向下垂直排列子元素。设置或检索伸缩盒对象的子元素的排列方式 。
text-overflow: ellipsis; //文本溢出 用省略号显示
-webkit-line-clamp: 2;
overflow: hidden;

当然也需要设置高度来配合显示

  • 解决方案2 css 的伪类实现

对要显示的文字进行相对定位 对省略号进行绝对定位

p {
    position: relative;
    line-height: 1.4em;
    height: 4.2em // 1.4 *3 显示三行的 所有高度是行高的三倍
    overflow: hidden;
}

p::after {
    content: '...',
    position: absolute,
    bottom: 0;
    right: 0;
    padding: 5px;
}

demo https://jsfiddle.net/mayufo/us8tcuyz/

  • 解决方案3:js解决方法

Clamp.js 这个就不具体展开了

可以参考demo http://codepen.io/feiwen8772/pen/AckqK

参考

  • http://www.css88.com/webkit/-webkit-appearance/
  • http://www.w3school.com.cn/tiy/t.asp?f=css3_box-orient
  • http://www.520ued.com/article/54192b4b8d31c11e3b000400

mayufo avatar Jul 18 '16 10:07 mayufo

方案一:火狐下的兼容性问题怎么处理?

silence717 avatar Dec 26 '16 02:12 silence717

感谢@silence717给我提出的问题

之前的对于多行文本溢出隐藏并没有深入,没有发现其中的问题,容我哭三分钟!!!

方案一 使用的 -webkit-line-clamp 虽然看似简单好用,但是确实是忽略了火狐和ie的兼容问题,经测试只能在chrome下使用

方案二 无法自动判断是否超出了文本,当文章没有超出所限制的字数的时候,还是有省略号存在

图片说明问题 image

重新查了一些网上的做法,特别来补充一下

补充1 js方法实现

原理:

1 通过给文字段固定的行高,每次通过固定的行高和可视高度进行判断 2 如果超过固定行高,减少显示的单词,直到显示我们希望的行高。

代码:

#block-with-text {
         height: 58px;
}
function ellipsizeText(id) {
        var el = document.getElementById(id);
        var wordArray = el.innerHTML.split(' ');
        while(el.scrollHeight > el.offsetHeight) {
            wordArray.pop();
            el.innerHTML = wordArray.join(' ') + '...';
        }
    }
    ellipsizeText('block-with-text');

demo https://jsfiddle.net/m3uv2ad3/1/

缺点

1 文本块需要有固定的高度 2 当其中某个单词过长的时候 会造成省略号显示的问题 (个人感觉可以忽略)

image

注意:

1 以上是英文的使用,如果是中文,务必将里面的空格删掉,因为中文不是用空格划分的 demo https://jsfiddle.net/mayufo/m3uv2ad3/3/ 2 在火狐下 设置同样的高度 中文显示的比较少,英文显示的行数会比较多。 3 如果中英混合 ,肯定就是按照中文的高度 image

测试 已经测试火狐和chrome

补充2 css实现

原理:

1 分别设置两个伪类before和after,before用来显示省略号,after 用来隐藏省略号 2 当内容较少的时候 after会盖住before,不显示省略号 3 当内容较多需要省略号的时候,内容会把after挤出去,这样就能显示出省略号

image

代码

 .block-with-text {
            overflow: hidden;
            position: relative;
            line-height: 1.2em;
            /* max-height = line-height (1.2) * (3) 设置三行行高 */
            max-height: 3.6em;
            text-align: justify;
            /*省略号到右边距的位置 */
            margin-right: 15px;
             /*给省略号的宽度留位置,三个点的宽度大概14px, 最好不要小于这个宽度*/
            padding-right: 15px;
        }
       /*创建省略号*/
        .block-with-text:before {
            content: '...';
            position: absolute;
            /* 省略号的显示位置定位在右下方*/
            right: 0;
            bottom: 0;
        }
       /*遮盖省略号*/
        .block-with-text:after {
            content: '';
            position: absolute;
            /*设置遮盖省略号的位置 */
            right: 0;
            /*设置遮盖省的大小 */
            width: 1em;
            height: 1em;
            margin-top: 0.2em;
            /*设置遮盖省略号的背景颜色,这个要和背景颜色一致 */
            background: white;
        }

demo https://jsfiddle.net/mayufo/ehzyprds/

缺点

1 需要设置一个隐藏块来隐藏省略号,并要注意背景颜色 2 需要注意省略号的位置

测试 已经测试火狐和chrome

参考

  • http://hackingui.com/front-end/a-pure-css-solution-for-multiline-text-truncation/

mayufo avatar Dec 27 '16 06:12 mayufo

文字少的时候还是显示了省略号

guofuming avatar Jan 16 '18 03:01 guofuming

补充2 css实现

guofuming avatar Jan 16 '18 03:01 guofuming

第二个demo可以实现。。。。

guofuming avatar Jan 16 '18 03:01 guofuming

缺点就是可能会出现字符被遮盖不全的情况 比如中英文混杂

pre1ude avatar Feb 09 '18 13:02 pre1ude

补充2的css实现简直是太棒棒了,比只用after伪类更棒

poria-cat avatar Dec 27 '18 14:12 poria-cat