使用CSS将文字长度限制为n行


515

是否有可能使用CSS将文本长度限制为“ n”行(或在垂直溢出时将其剪切)。

text-overflow: ellipsis; 仅适用于1行文字。

原文:

纳豆菌,马利筋,阿片草,法式
阿利盖特草,乌拉尔阿利奎特草,乌
骨菜!坐吧!乌拉圭乌龟
马戏团丁丁!Dapibus sed aenean,magna sagittis,lorem velit

所需的输出(2行):

胃纳豆菌,阿里卡姆,克拉斯在pellentesque
tincidunt elit purus lectus,鹅肝,元素中...


1
请注意:Firefox不支持文本溢出省略号,请参见bugzilla.mozilla.org/show_bug.cgi?id=312156
Joril,2011年


在IE10上不起作用。它适用于11
user2060451

@GauravShah谢谢。它也可以在IE10上使用。这里的大多数解决方案都不是跨浏览器。
user2060451

Answers:


652

有一种使用非官方换行语法的方法,从Firefox 68开始,它可在所有主流浏览器中使用。

body {
   margin: 20px;
}

.text {
   overflow: hidden;
   text-overflow: ellipsis;
   display: -webkit-box;
   -webkit-line-clamp: 2; /* number of lines to show */
   -webkit-box-orient: vertical;
}
<div class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam consectetur venenatis blandit. Praesent vehicula, libero non pretium vulputate, lacus arcu facilisis lectus, sed feugiat tellus nulla eu dolor. Nulla porta bibendum lectus quis euismod. Aliquam volutpat ultricies porttitor. Cras risus nisi, accumsan vel cursus ut, sollicitudin vitae dolor. Fusce scelerisque eleifend lectus in bibendum. Suspendisse lacinia egestas felis a volutpat.
</div>

除非您关心IE用户,否则没有必要做line-heightmax-height回退。


3
例如,使用一定的font-size到line-height,您还可以使用text-align:justify看到下一行的一部分,省略号不在最后一行的末尾,而是在该位置重叠了文本,如果文本是左对齐的话
Matus

3
这是小提琴:jsfiddle.net/csYjC/1122,当我准备它的时候,我发现最后一行的那一部分仅在有填充时才可见
Matus

好吧,没有人说过这种非标准的仅用于webkit的黑魔法将一直在完美运行。您可以在其他(可能是父)容器上使用填充。在<p>标签中划掉文本很有意义:jsfiddle.net/csYjC/1129
Evgeny

2
请注意,至此注释为止,-webkit-line-clamp不尊重可见性:隐藏。这花了我几个小时的调试时间。以下是支持的错误报告:bugs.webkit.org/show_bug.cgi?id=45399
凯文

3
如果您-webkit-box-orient: vertical;在编译scs时遇到隐藏的问题,请尝试尝试 /* autoprefixer: ignore next */ -webkit-box-orient: vertical;
Salam,

109

您可以执行以下操作:

.max-lines {
  display: block;/* or inline-block */
  text-overflow: ellipsis;
  word-wrap: break-word;
  overflow: hidden;
  max-height: 3.6em;
  line-height: 1.8em;
}
<p class="max-lines">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vitae leo dapibus, accumsan lorem eleifend, pharetra quam. Quisque vestibulum commodo justo, eleifend mollis enim blandit eu. Aenean hendrerit nisl et elit maximus finibus. Suspendisse scelerisque consectetur nisl mollis scelerisque.</p>

其中max-height:= line-height:× <number-of-lines>in em


13
正在像文本溢出一样工作:剪辑,因为它没有显示(...)
rishiAgar

似乎对我来说也是最好的解决方案,但是正如@rishiAgar指出的那样,它并不以省略号结尾。像剪辑一样继续起作用。
David Carrigan

我相信您必须添加属性display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;以使省略号出现。但这仅适用于Chrome。对于也可以在Firefox上运行的解决方案,请看这里:stackoverflow.com/a/20595073/1884158这是关于此主题的有用教程:css-tricks.com/line-clampin
modulitos

34

跨浏览器的有效解决方案

多年来,这个问题困扰着我们所有人。

为了在所有情况下都提供帮助,我提出了仅CSS的方法,以及在css警告时出现问题的情况下使用的jQuery方法。

这是我想出的仅CSS解决方案,在所有情况下都可以使用,但有一些小的警告。

基本原理很简单,它隐藏了跨度的溢出,并根据Eugene Xa的建议设置了基于线条高度的最大高度。

然后在包含div后面有一个伪类,可以很好地放置省略号。

注意事项

此解决方案将始终放置省略号,无论是否需要它。

如果最后一行以结尾句子结尾,则将以四个点结尾。

您需要对合理的文本对齐感到满意。

省略号将在文本的右边,看起来可能很草率。

代码+代码段

jsfiddle

.text {
  position: relative;
  font-size: 14px;
  color: black;
  width: 250px; /* Could be anything you like. */
}

.text-concat {
  position: relative;
  display: inline-block;
  word-wrap: break-word;
  overflow: hidden;
  max-height: 3.6em; /* (Number of lines you want visible) * (line-height) */
  line-height: 1.2em;
  text-align:justify;
}

.text.ellipsis::after {
  content: "...";
  position: absolute;
  right: -12px; 
  bottom: 4px;
}

/* Right and bottom for the psudo class are px based on various factors, font-size etc... Tweak for your own needs. */
<div class="text ellipsis">
  <span class="text-concat">
Lorem ipsum dolor sit amet, nibh eleifend cu his, porro fugit mandamus no mea. Sit tale facete voluptatum ea, ad sumo altera scripta per, eius ullum feugait id duo. At nominavi pericula persecuti ius, sea at sonet tincidunt, cu posse facilisis eos. Aliquid philosophia contentiones id eos, per cu atqui option disputationi, no vis nobis vidisse. Eu has mentitum conclusionemque, primis deterruisset est in.

Virtute feugait ei vim. Commune honestatis accommodare pri ex. Ut est civibus accusam, pro principes conceptam ei, et duo case veniam. Partiendo concludaturque at duo. Ei eirmod verear consequuntur pri. Esse malis facilisis ex vix, cu hinc suavitate scriptorem pri.
  </span>
</div>

jQuery方法

我认为这是最好的解决方案,但并不是每个人都可以使用JS。基本上,jQuery将检查任何.text元素,如果字符数超过预设的max var,它将截去其余部分并添加省略号。

此方法没有任何警告,但是此代码示例仅用于演示基本思想-在生产中使用它,除非有两个方面的改进,否则我不会在生产中使用它:

1)它将重写.text元素的内部html。是否需要。2)没有测试来检查内部html是否没有嵌套的元素-因此您在很大程度上依赖作者正确使用.text。

已编辑

感谢您抓住@markzzz

代码和摘要

jsfiddle

setTimeout(function()
{
	var max = 200;
  var tot, str;
  $('.text').each(function() {
  	str = String($(this).html());
  	tot = str.length;
    str = (tot <= max)
    	? str
      : str.substring(0,(max + 1))+"...";
    $(this).html(str);
  });
},500); // Delayed for example only.
.text {
  position: relative;
  font-size: 14px;
  color: black;
  font-family: sans-serif;
  width: 250px; /* Could be anything you like. */
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p class="text">
Old men tend to forget what thought was like in their youth; they forget the quickness of the mental jump, the daring of the youthful intuition, the agility of the fresh insight. They become accustomed to the more plodding varieties of reason, and because this is more than made up by the accumulation of experience, old men think themselves wiser than the young.
</p>

<p class="text">
Old men tend to forget what thought was like in their youth;
</p>
 <!-- Working Cross-browser Solution

This is a jQuery approach to limiting a body of text to n words, and end with an ellipsis -->


3
您的CSS解决方案不是很好,因为文本不溢出的情况如何?它也显示“ ...” ...
user5260143

但是如果文本较短,jQuery版本也会添加点:jsfiddle.net/o82opadm/35
markzzz

@markzzz-谢谢,不知道我是如何错过它的:-)我现在对其进行了修改,但是如果没有更多的工作,我就不会在生产中使用它。但是至少已经提出了基本思想。
asimovwasright

1
我发现,唯一的CSS的解决办法似乎运作良好,但前提是你使用的只是像素测量。新兴市场和百分比给我带来麻烦。然后,我将省略号作为<a>样式添加到位置:absolute,用于希望单击链接并阅读更多内容的用户。就我而言,我知道文本总是会溢出,因此不需要jQuery。感谢有用的CSS解决方案!
心理学家

30

据我所知,只有使用,这是可能的height: (some em value); overflow: hidden,即使那样,最终也不会有幻想...

如果这不是一个选择,我认为没有服务器端的预处理(很难,因为文本流无法可靠地预测)或jQuery(可能,但可能很复杂)是不可能的。


16
这似乎适用于任何字体大小的.mytext {overflow:hidden; 行高:1.2em;最大高度:2.4em; }
彼得

1
@Pedro是的 您也许可以.mytext使用jQuery 遍历每种内容,找出其内容是否超过可见内容,然后...手动添加。这样,您就可以与没有JS的客户端兼容,并且拥有JS的客户端可以进行修饰。也许值得一个单独的问题让jQuery Guru回答;可能相对容易地做到
Pekka 2010年


10

以下CSS类帮助我获得了两行省略号。

  .two-line-ellipsis {
        padding-left:2vw;
        text-overflow: ellipsis;
        overflow: hidden;
        width: 325px;
        line-height: 25px;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        padding-top: 15px;
    }

5

目前尚无法使用,但将来您将可以使用text-overflow:ellipis-lastline。目前,它在Opera 10.60+中可用,带有供应商前缀:example


5
这对于多行字符串不起作用,因为它还需要设置white-scace:nowrap。看这里
塞巴斯蒂安·诺亚克

4

我有一个效果很好的解决方案,但省略号使用渐变。当您具有动态文本时,它可以工作,因此您不知道它是否足够长,需要椭圆形。优点是您不必执行任何JavaScript计算,并且它适用于包括表单元格在内的可变宽度容器,并且是跨浏览器的。它使用了几个额外的div,但是很容易实现。

标记:

<td>
    <div class="fade-container" title="content goes here">
         content goes here
         <div class="fade">
    </div>
</td>

CSS:

.fade-container { /*two lines*/
    overflow: hidden;
    position: relative;
    line-height: 18px; 
    /* height must be a multiple of line-height for how many rows you want to show (height = line-height x rows) */
    height: 36px;
    -ms-hyphens: auto;
    -webkit-hyphens: auto;
    hyphens: auto;
    word-wrap: break-word;
}

.fade {
        position: absolute;
        top: 50%;/* only cover the last line. If this wrapped to 3 lines it would be 33% or the height of one line */
        right: 0;
        bottom: 0;
        width: 26px;
        background: linear-gradient(to right,  rgba(255,255,255,0) 0%,rgba(255,255,255,1) 100%);
}

博客文章:http//salzerdesign.com/blog/?p = 453

示例页面:http//salzerdesign.com/test/fade.html


3
.class{
   word-break: break-word;
   overflow: hidden;
   text-overflow: ellipsis;
   display: -webkit-box;
   line-height: 16px; /* fallback */
   max-height: 32px; /* fallback */
   -webkit-line-clamp: 2; /* number of lines to show */
   -webkit-box-orient: vertical;
}

0

我真的很喜欢线夹,但是还不支持Firefox。所以我进行了数学计算,只是隐藏了溢出

.body-content.body-overflow-hidden h5 {
    max-height: 62px;/* font-size * line-height * lines-to-show(4 in this case) 63px if you go with jquery */
    overflow: hidden;
}
.body-content h5 {
    font-size: 14px; /* need to know this*/
    line-height:1,1; /*and this*/
}

现在,假设您要通过带有链接的jQuery删除并添加此类,则需要有一个额外的像素,因此max-height为63 px,这是因为您需要每次检查高度是否大于62像素,但是在4行的情况下,您将得到一个假的true,因此一个额外的像素将解决此问题,并且不会造成任何额外的问题

我将为此粘贴一个咖啡脚本,仅作为示例,使用默认情况下隐藏的几个链接,这些类具有“ read-more”和“ read-less”类,它将删除那些不需要它的内容并删除主体-溢出类

jQuery ->

    $('.read-more').each ->
        if $(this).parent().find("h5").height() < 63
             $(this).parent().removeClass("body-overflow-hidden").find(".read-less").remove()
             $(this).remove()
        else
            $(this).show()

    $('.read-more').click (event) ->
        event.preventDefault()
        $(this).parent().removeClass("body-overflow-hidden")
        $(this).hide()
        $(this).parent().find('.read-less').show()

    $('.read-less').click (event) ->
        event.preventDefault()
        $(this).parent().addClass("body-overflow-hidden")
        $(this).hide()
        $(this).parent().find('.read-more').show()

顺便说一句,不要为此添加线夹,它将高度设置为62px(在这种情况下),并且您将没有jquery拖延
Alexis

0

如果您想专注于每项工作letter,我会参考这个问题

如果您想专注于每个方面,word都可以像那样+空间

如果您想专注于每一个,word都可以像那样+在没有空间的情况下进行


-1

基本示例代码,学习代码很容易。检查样式CSS注释。

table tr {
  display: flex;
}
table tr td {
  /* start */
  display: inline-block; /* <- Prevent <tr> in a display css */
  text-overflow: ellipsis;
  white-space: nowrap;
  /* end */
  padding: 10px;
  width: 150px; /* Space size limit */
  border: 1px solid black;
  overflow: hidden;
}
<table>
  <tbody>
    <tr>
      <td>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla egestas erat ut luctus posuere. Praesent et commodo eros. Vestibulum eu nisl vel dui ultrices ultricies vel in tellus.
      </td>
      <td>
        Praesent vitae tempus nulla. Donec vel porta velit. Fusce mattis enim ex. Mauris eu malesuada ante. Aenean id aliquet leo, nec ultricies tortor. Curabitur non mollis elit. Morbi euismod ante sit amet iaculis pharetra. Mauris id ultricies urna. Cras ut
        nisi dolor. Curabitur tellus erat, condimentum ac enim non, varius tempor nisi. Donec dapibus justo odio, sed consequat eros feugiat feugiat.
      </td>
      <td>
        Pellentesque mattis consequat ipsum sed sagittis. Pellentesque consectetur vestibulum odio, aliquet auctor ex elementum sed. Suspendisse porta massa nisl, quis molestie libero auctor varius. Ut erat nibh, fringilla sed ligula ut, iaculis interdum sapien.
        Ut dictum massa mi, sit amet interdum mi bibendum nec.
      </td>
    </tr>
    <tr>
      <td>
        Sed viverra massa laoreet urna dictum, et fringilla dui molestie. Duis porta, ligula ut venenatis pretium, sapien tellus blandit felis, non lobortis orci erat sed justo. Vivamus hendrerit, quam at iaculis vehicula, nibh nisi fermentum augue, at sagittis
        nibh dui et erat.
      </td>
      <td>
        Nullam mollis nulla justo, nec tincidunt urna suscipit non. Donec malesuada dolor non dolor interdum, id ultrices neque egestas. Integer ac ante sed magna gravida dapibus sit amet eu diam. Etiam dignissim est sit amet libero dapibus, in consequat est
        aliquet.
      </td>
      <td>
        Vestibulum mollis, dui eu eleifend tincidunt, erat eros tempor nibh, non finibus quam ante nec felis. Fusce egestas, orci in volutpat imperdiet, risus velit convallis sapien, sodales lobortis risus lectus id leo. Nunc vel diam vel nunc congue finibus.
        Vestibulum turpis tortor, pharetra sed ipsum eu, tincidunt imperdiet lorem. Donec rutrum purus at tincidunt sagittis. Quisque nec hendrerit justo.
      </td>
    </tr>
  </tbody>
</table>


4
OP正在寻找多线解决方案。这仅适用于单行文本。
asimovwasright

-11

我一直在寻找这个,但后来我意识到,该死的我的网站使用PHP !!!为什么不在文本输入上使用修剪功能并以最大长度播放...。

对于使用php的用户来说,这也是一种可能的解决方案:http : //ideone.com/PsTaI

<?php
$s = "In the beginning there was a tree.";
$max_length = 10;

if (strlen($s) > $max_length)
{
   $offset = ($max_length - 3) - strlen($s);
   $s = substr($s, 0, strrpos($s, ' ', $offset)) . '...';
}

echo $s;
?>

18
您无法安全地使用服务器端处理,因为您无法事先知道文本在页面中将占用多少空间。这取决于字体大小,浏览器文本大小的设置,浏览器缩放级别,等等
ermannob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.