CSS省略号在第二行


207

text-overflow: ellipsis第二行的CSS ,这可能吗?我在网上找不到。

例:

我想要的是这样的:

I hope someone could help me. I need 
an ellipsis on the second line of...

但这是怎么回事:

I hope someone could help me. I ... 

3
AFAIK省略号将出现,并在元素宽度的末尾截断文本。它不会流到下一行。最好的解决方案是实现一些服务器端或客户端脚本,该脚本会自动将文本修剪为一定数量的字符,然后附加省略号。我猜想客户端脚本会更好,这将使您仍然可以在需要时使用所有原始文本。
FarligOpptreden 2011年

这是一个类似的问题: stackoverflow.com/questions/3922739/…–
Evgeny

tl; dr:只有在Webkit中才有可能
Evgeny

我最接近实现此目标的方法是为省略号添加一个“之后”伪元素,并将其内联放置在包含文本的元素之后。但是,如果元素文本太长,省略号就消失了,因此您必须以某种方式修剪文本以使其可靠。
2014年

Answers:


105

text-overflow: ellipsis;工作要求是white-spaceprenowrap等)的单行版本。这意味着文本永远不会到达第二行。

嗯 在纯CSS中是不可能的。

我刚在寻找完全相同的东西时的来源:http ://www.quirksmode.org/css/textoverflow.html(Quirksmode ftw!)

编辑如果优秀的CSS众神将实现http://www.w3.org/TR/css-overflow-3/#max-lines,我们可以使用fragments(new)和max-lines(new)在纯CSS中进行模糊处理。在http://css-tricks.com/line-clampin/上还有更多信息

编辑2 WebKit / Blink具有line-clamp-webkit-line-clamp: 2将省略号放在第二行。


9
守望,但到目前为止,似乎神还没有与我们同在:caniuse.com/#search=max-lines
Daniel Daniel

1
如何用saas实现以上功能?@Rudie
Bhoomi Bhalani

144

这应该在webkit浏览器中起作用:

overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;

1
请注意,至此注释为止,-webkit-line-clamp不尊重可见性:隐藏。bugs.webkit.org/show_bug.cgi?id=45399
凯文

1
嘿-看起来不错,但对我不起作用。它只是将“ ...”放在给定的行夹中,但不剪切其余文本(即使使用空格attr)
lemoid

3
您可能需要添加overflow: hidden才能使其正常工作。
罗伯特

这在Firefox中不起作用,壁虎引擎不支持Webkit
ZetaPR

这应该是公认的答案。您不希望在元素的底部使用任何填充,因为您可以将其余的文本窥视一遍。
Tr1stan

34

正如其他人已经回答的那样,不存在纯CSS解决方案。有一个非常易于使用的jQuery插件,称为dotdotdot。它使用容器的宽度和高度来计算是否需要截断并添加省略号。

$("#multilinedElement").dotdotdot();

这是一个jsFiddle


该插件还提供了许多其他实用程序,例如添加“阅读更多”链接,它还可以解析URI和HTML标记。好发现!
Martin Andersson

2
我试用了电子商务商店的jQuery dotdotdot 1.7.3,以将网格类别页面上的产品名称限制为两行。经过全面的测试后,我们决定不使用此插件,因为有时在刷新后,类别页面的布局会被破坏。YMMV。最后,我们使用了一个非常简单的原始JS解决方案:如果产品名称元素的clientHeight小于其scrollHeight,则在预设边界处截断文本并附加“ ...”。有时由于预设的边界,一些产品名称可能会太短,但它非常稳定。
thdoan 2015年

1
易于实施且效果出色。谢谢!
雷切尔·S

尽管效果很好,但不幸的是它存在性能问题。如果您的项目需要使用多个省略号,请考虑另一种选择。另外,还有来自存储库的引文:“由于无法提高其性能,因此不再积极维护该插件。”
boyomarinov

1
同样,如果文本在加载后动态更改也将不起作用:(
Dejell

34

我发现Skeep的答案还不够,还需要一种overflow样式:

overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;

18

如果有人正在使用SASS / SCSS并偶然发现了这个问题-也许这个mixin可能会有所帮助:

@mixin line-clamp($numLines : 1, $lineHeight: 1.412) {
  overflow: hidden;
  text-overflow: -o-ellipsis-lastline;
  text-overflow: ellipsis;
  display: block;
  /* autoprefixer: off */
  display: -webkit-box;
  -webkit-line-clamp: $numLines;
  -webkit-box-orient: vertical;
  max-height: $numLines * $lineHeight + unquote('em');
}

这只会在webkit浏览器中添加省略号。休息只是切断它。


1
使用LESS,我不得不更改/* autoprefixer: off *//*! autoprefixer: off */其他选项,否则-webkit-box-orient: vertical;在编译后会被删除,这意味着省略号从未显示过
Nathan

18

只需对支持它的浏览器(大多数现代浏览器)使用line-clamp,而对于较旧的浏览器则使用line-clamp。

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


    @supports (-webkit-line-clamp: 2) {
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: initial;
      display: -webkit-box;
      -webkit-line-clamp: 2;
      -webkit-box-orient: vertical;
    }
  }

1
空格:初始;救了我
詹姆斯

10

您无法让它在两行上工作真是太可惜了!如果该元素是显示块,并且高度设置为2em或类似的东西,那就太棒了,当文本溢出时,它会显示省略号!

对于单个衬板,您可以使用:

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

对于多行,您可以使用github http://pvdspek.github.com/jquery.autoellipsis/上的jQuery autoellipsis之类的Polyfill


该插件太重了。5岁了。宁可dotdotdot在另一篇文章中提到使用。
adi518 '16

10

我不是JS专业人士,但是我想出了几种方法可以做到这一点。

HTML:

<p id="truncate">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum consequat tortor et euismod. Nam commodo consequat libero vel lobortis. Morbi ac nisi at leo vehicula consectetur.</p>

然后使用jQuery将其截断为特定字符数,但保留最后一个字,如下所示:

// Truncate but leave last word
var myTag = $('#truncate').text();
if (myTag.length > 100) {
  var truncated = myTag.trim().substring(0, 100).split(" ").slice(0, -1).join(" ") + "…";
  $('#truncate').text(truncated);
}

结果看起来像这样:

Lorem ipsum dolor坐下,一直保持着安静的状态。Morbi
elementum consequat tortor等...

或者,您可以简单地将其截断为特定的字符数,如下所示:

// Truncate to specific character
var myTag = $('#truncate').text();
if (myTag.length > 15) {
  var truncated = myTag.trim().substring(0, 100) + "…";
  $('#truncate').text(truncated);
}

结果看起来像这样:

Lorem ipsum dolor坐下,一直保持着安静的状态。Morbi
elementum consequat tortor等euismod ...

希望那些对你有帮助。

这是jsFiddle


7

这是纯CSS的好例子

.container{
  width: 200px;
}
.block-with-text {
  overflow: hidden;
  position: relative; 
  line-height: 1.2em;
  max-height: 3.6em;
  text-align: justify;  
  margin-right: -1em;
  padding-right: 1em;
}
.block-with-text+.block-with-text{
  margin-top:10px;
}
.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;
}
<div class="container">


<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a
</div>

<div class="block-with-text">
Lorem Ipsum is simply dummy text of the printing and typesetting industry
</div>


<div class="block-with-text">
Lorem Ipsum is simply
</div>

</div>


很好的解决方案,即使第二行太短而不能被截断,它也会截断文本,但还是要竖起大拇指
Amin


4

它是非标准CSS,当前版本的CSS中未涵盖(Firefox不支持它)。尝试改用JavaScript。


4

用省略号修饰多行文本的纯CSS方式

调整文本容器的高度,控制线由-webkit-line-clamp断开:2;

.block-ellipsis {
  display: block;
  display: -webkit-box;
  max-width: 100%;
  height: 30px;
  margin: 0 auto;
  font-size: 14px;
  line-height: 1;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

3

我之前遇到过此问题,并且没有纯CSS解决方案

这就是为什么我开发了一个小型图书馆来处理此问题(以及其他问题)的原因。该库提供用于建模和执行字母级文本呈现的对象。例如,您可以模拟文本溢出:带有任意限制的省略号(不需要一行)

有关更多信息,请访问http://www.samuelrossille.com/home/jstext.html,以获取屏幕截图,教程和下载链接。


3

如果有人想让线夹在flexbox中工作,那会有些棘手-尤其是当您用很长的单词对酷刑进行测试时。此代码段中唯一的实际区别是min-width: 0;在包含截断文本的flex项目中,和word-wrap: break-word;。有关见解的https://css-tricks.com/flexbox-truncated-text/的提示。免责声明:据我所知,这仍然是webkit。

.flex-parent {
  display: flex;
}

.short-and-fixed {
  width: 30px;
  height: 30px;
  background: lightgreen;
}

.long-and-truncated {
  margin: 0 20px;
  flex: 1;
  min-width: 0;/* Important for long words! */
}

.long-and-truncated span {
  display: inline;
  -webkit-line-clamp: 3;
  text-overflow: ellipsis;
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  word-wrap: break-word;/* Important for long words! */
}
<div class="flex-parent">
  <div class="flex-child short-and-fixed">
  </div>
  <div class="flex-child long-and-truncated">
    <span>asdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasd</span>
  </div>
  <div class="flex-child short-and-fixed">
  </div>
</div>

http://codepen.io/AlgeoMA/pen/JNvJdx(codepen版本)


1

这里的所有答案都是错误的,他们缺少重要的部分,高度

.container{
    width:200px;
    height:600px;
    background:red
}
.title {
        overflow: hidden;
        line-height: 20px;
        height: 40px;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
    }
<div class="container">
    <div class="title">this is a long text you cant cut it in half</div>
</div>

0

基于-webkit-line-clamp的纯CSS方法,可在webkit上使用:

@-webkit-keyframes ellipsis {/*for test*/
    0% { width: 622px }
    50% { width: 311px }
    100% { width: 622px }
}
.ellipsis {
    max-height: 40px;/* h*n */
    overflow: hidden;
    background: #eee;

    -webkit-animation: ellipsis ease 5s infinite;/*for test*/
    /**
    overflow: visible;
    /**/
}
.ellipsis .content {
    position: relative;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-box-pack: center;
    font-size: 50px;/* w */
    line-height: 20px;/* line-height h */
    color: transparent;
    -webkit-line-clamp: 2;/* max row number n */
    vertical-align: top;
}
.ellipsis .text {
    display: inline;
    vertical-align: top;
    font-size: 14px;
    color: #000;
}
.ellipsis .overlay {
    position: absolute;
    top: 0;
    left: 50%;
    width: 100%;
    height: 100%;
    overflow: hidden;

    /**
    overflow: visible;
    left: 0;
    background: rgba(0,0,0,.5);
    /**/
}
.ellipsis .overlay:before {
    content: "";
    display: block;
    float: left;
    width: 50%;
    height: 100%;

    /**
    background: lightgreen;
    /**/
}
.ellipsis .placeholder {
    float: left;
    width: 50%;
    height: 40px;/* h*n */

    /**
    background: lightblue;
    /**/
}
.ellipsis .more {
    position: relative;
    top: -20px;/* -h */
    left: -50px;/* -w */
    float: left;
    color: #000;
    width: 50px;/* width of the .more w */
    height: 20px;/* h */
    font-size: 14px;

    /**
    top: 0;
    left: 0;
    background: orange;
    /**/
}
<div class='ellipsis'>
    <div class='content'>
        <div class='text'>text text text text text text text text text text text text text text text text text text text text text </div>
        <div class='overlay'>
            <div class='placeholder'></div>
            <div class='more'>...more</div>
        </div>
    </div>
</div>


-1

没有真正简单的方法可以做到这一点。使用Clamp.js库。

$clamp(myHeader, {clamp: 3});

-6

我找到了一个解决方案,但是您需要知道适合于您的文本区域的粗略字符长度,然后将...连接到前面的空格。

我这样做的方法是:

  1. 假定一个粗略的字符长度(在这种情况下为200),并与您的文本一起传递给函数
  2. 分割空格,以便有一个长字符串
  3. 使用jQuery在字符长度后的第一个“”空间进行切片
  4. 加入其余的...

代码:

truncate = function(description){
        return description.split('').slice(0, description.lastIndexOf(" ",200)).join('') + "...";           
}

这是一个小提琴-http: //jsfiddle.net/GYsW6/1/

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.