两行文字溢出省略号


117

我知道您可以使用CSS规则组合来在溢出时(不超出父级的范围)使文本以省略号(...)结尾。

是否有可能(随意说,不)达到相同的效果,但让文本换行超过一行?

这是一个演示

div {
  width: 300px; 
  height: 42px; 
  overflow: hidden; 
  text-overflow: ellipsis; 
  white-space: nowrap;
}

如您所见,当文本的宽度大于div的宽度时,文本以省略号结尾。但是,仍然有足够的空间使文本换行并继续。这会被中断white-space: nowrap,以使省略号起作用。

有任何想法吗?

PS:没有JS解决方案,如果可能的话,使用纯CSS。


什么决定“有空间”?是否包括设置的像素高度在内的所有内容?如果最终用户在浏览器中增加字体大小会怎样?
乔尔·埃瑟顿


@JoelEtherton我想这是由浏览器决定的,是的,在我看来,一切都以像素为单位。
Tony Bogdanov

这可以是一个很好的解决方案: stackoverflow.com/questions/6222616/...
常春藤

Answers:


31

我不确定您是否看过THIS,但是Chris Coyier出色的CSS-Tricks.com早已发布了指向该链接的链接,它是一个纯CSS解决方案,可以完全满足您的要求。

(单击以查看CodePen)

HTML:

<div class="ellipsis">
    <div>
        <p>
            Call me Ishmael. Some years ago – never mind how long precisely – having
            little or no money in my purse, and nothing particular to interest me on
            shore, I thought I would sail about a little and see the watery part of the
            world. It is a way I have of driving off the spleen, and regulating the
            circulation. Whenever I find myself growing grim about the mouth; whenever it
            is a damp, drizzly November in my soul; whenever I find myself involuntarily
            pausing before coffin warehouses, and bringing up the rear of every funeral I
            meet; and especially whenever my hypos get such an upper hand of me, that it
            requires a strong moral principle to prevent me from deliberately stepping
            into the street, and methodically knocking people's hats off – then, I account
            it high time to get to sea as soon as I can.
        </p>
    </div>
</div>

CSS:

html,body,p {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
}
.ellipsis {
    overflow: hidden;
    height: 200px;
    line-height: 25px;
    margin: 20px;
    border: 5px solid #AAA;
}
.ellipsis:before {
    content: "";
    float: left;
    width: 5px;
    height: 200px;
}
.ellipsis > *:first-child {
    float: right;
    width: 100%;
    margin-left: -5px;
}
.ellipsis:after {
    content: "\02026";
    box-sizing: content-box;
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    float: right;
    position: relative;
    top: -25px;
    left: 100%;
    width: 3em;
    margin-left: -3em;
    padding-right: 5px;
    text-align: right;
    background-size: 100% 100%;/* 512x1 image,gradient for IE9. Transparent at 0% -> white at 50% -> white at 100%.*/
    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAMAAACfZeZEAAAABGdBTUEAALGPC/xhBQAAAwBQTFRF////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wDWRdwAAAP90Uk5TgsRjMZXhS30YrvDUP3Emow1YibnM9+ggOZxrBtpRRo94gxItwLOoX/vsHdA2yGgL8+TdKUK8VFufmHSGgAQWJNc9tk+rb5KMCA8aM0iwpWV6dwP9+fXuFerm3yMs0jDOysY8wr5FTldeoWKabgEJ8RATG+IeIdsn2NUqLjQ3OgBDumC3SbRMsVKsValZplydZpZpbJOQco2KdYeEe36BDAL8/vgHBfr2CvTyDu8R7esU6RcZ5ecc4+Af3iLcJSjZ1ivT0S/PMs3LNck4x8U7wz7Bv0G9RLtHuEq1TbJQr1OtVqqnWqRdoqBhnmSbZ5mXapRtcJGOc4t2eYiFfH9AS7qYlgAAARlJREFUKM9jqK9fEGS7VNrDI2+F/nyB1Z4Fa5UKN4TbbeLY7FW0Tatkp3jp7mj7vXzl+4yrDsYoVx+JYz7mXXNSp/a0RN25JMcLPP8umzRcTZW77tNyk63tdprzXdmO+2ZdD9MFe56Y9z3LUG96mcX02n/CW71JH6Qmf8px/cw77ZvVzB+BCj8D5vxhn/vXZh6D4uzf1rN+Cc347j79q/zUL25TPrJMfG/5LvuNZP8rixeZz/mf+vU+Vut+5NL5gPOeb/sd1dZbTs03hBuvmV5JuaRyMfk849nEM7qnEk6IHI8/qn049hB35QGHiv0yZXuMdkXtYC3ebrglcqvYxoj1muvC1nDlrzJYGbpcdHHIMo2FwYv+j3QAAOBSfkZYITwUAAAAAElFTkSuQmCC);
    background: -webkit-gradient(linear,left top,right top,
        from(rgba(255,255,255,0)),to(white),color-stop(50%,white));
        background: -moz-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -o-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -ms-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
    }

当然,单纯的CSS解决方案意味着它也是一个相当复杂的解决方案,但是它可以干净利落地工作。我将认为Javascript是不可能的,因为使用Javascript更容易实现(并且可能更可降解)。

此外,还有一个完整过程的可下载zip文件(如果您想了解所有内容),还有一个SASS mixin文件,以便您可以轻松将其折叠到过程中。

希望这可以帮助!

http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/


我刚刚在Android手机上单击了您的Codepen链接,该链接在Firefox中有效。它在什么平台/浏览器上不起作用?
dashard

uploady.com/#!/download/kAwBXv1CqXg/PU68wrP6QzGgydlS我使用的是chrome,预览中没有省略号。继续添加文本行,什么也没有发生。在几行之后它将开始显示省略号?
coding_idiot

在您发布的上载链接中,文本显然尚未溢出容器。文本必须太多,以致固定容器在出现椭圆之前无法显示。只需继续添加文本即可看到效果。
dashard

@MarcosPérezGude-不会令我惊讶。用>>“来暗示这一点,”当然,作为纯CSS解决方案意味着它也是一个相当复杂的解决方案…“ <<
dashard

137

简单的CSS属性可以解决问题。以下是三行省略号。

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

15
这在Firefox中不起作用。仅Chrome,Safari和Opera
Anyavacy

1
caniuse称,“其他浏览器不太可能按原样支持该属性”。所以抬头。
马坦·波比

顺利的家伙..非常有帮助
Valentino Pereira '18

4
也在firefox中工作gr8
Nisharg Shah,

4
似乎现在得到了大力支持:caniuse.com/#search=line-clamp
Joao

52

看看这个纯CSS版本:http : //codepen.io/martinwolf/pen/qlFdp

display: -webkit-box;
max-width: 400px;
height: 109.2px;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.625;

7
真的很酷,太糟糕了,仅是Webkit。这是关于此事的有趣文章:css-tricks.com/line-clampin
Tony Bogdanov

为什么要声明两个text-overflowdisplay规则?
j08691 2015年

哇哦。我从未在钳线之前见过
Mike Aron

1
仅供参考,这些天在Firefox中也可以正常使用。很好的解决方案!
Athoxx

只有一个问题,当我有一行或两行文本时,我想让它们居中,如果添加display flex我丢失了省略号,该怎么办呢?似乎只有在以下情况下才起作用:-webkit box set
PirateApp

10

下面的CSS应该可以解决问题。

在第二行之后,文本将包含...

line-height: 1em;
max-height: 2em;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

这很好,但是我不得不添加overflow:hidden
timhysniu

3

如果上述方法不起作用,请使用它

 display: block;
 display: -webkit-box;
 max-width: 100%;
 margin: 0 auto;
 -webkit-line-clamp: 2;
 /* autoprefixer: off */
 -webkit-box-orient: vertical;
 /* autoprefixer: on */
 overflow: hidden;
 text-overflow: ellipsis;

2

我的解决方案重用了amcdnl的解决方案,但我的后退方法包括为文本容器使用高度:

.my-caption h4 {
    display: -webkit-box;
    margin: 0 auto;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;

    height: 40px;/* Fallback for non-webkit */
}

-webkit-line-clamp不适用于IE11,Edge或Firefox。
ʀʀʏ

@Garry,您是对的,当时您需要进行JS修复,但是现在可以正常使用了。caniuse.com/#search=webkit-line-clamp
VincentPerrin.com 19-10-19

1

基于我在stackoveflow中看到的答案,我创建了这个LESS mixin(使用此链接生成CSS代码):

.max-lines(@lines: 3; @line-height: 1.2) {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: @lines;
  line-height: @line-height;
  max-height: @line-height * @lines;
}

用法

.example-1 {
    .max-lines();
}

.example-2 {
    .max-lines(3);
}

.example-3 {
    .max-lines(3, 1.5);
}

1

结合两个类似乎更优雅。two-lines如果只需要一行,则可以删除类:

.ellipse {
          white-space: nowrap;
          display:inline-block;
          overflow: hidden;
          text-overflow: ellipsis;
       }
      .two-lines {
          -webkit-line-clamp: 2;
          display: -webkit-box;
          -webkit-box-orient: vertical;
          white-space: normal;
      }
      .width{
          width:100px;
          border:1px solid hotpink;
      }
        <span class='width ellipse'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>

       <span class='width ellipse two-lines'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>



0
          text-overflow: ellipsis;
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box;
          line-height: 36px;
          max-height: 18px;
          -webkit-line-clamp: 2;
          -webkit-box-orient: vertical;

我发现了线夹和线高作品的组合:D


0

在我的有角度的应用程序中,以下样式对我有用,以使第二行上的文本溢出达到省略号

 <div style="height:45px; overflow: hidden; position: relative;">
     <span class=" block h6 font-semibold clear" style="overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box; 
        line-height: 20px; /* fallback */
        max-height: 40px; /* fallback */
        -webkit-line-clamp: 2; /* number of lines to show */
        -webkit-box-orient: vertical;">
        {{ event?.name}} </span>
 </div>

希望它能帮助某人。


0

对于使用scss的人员,您需要添加!autoprefixer到注释的开头,以便将其保留用于postcss:

我遇到了这个问题,这就是为什么在这里发布

line-height: 1em;
max-height: 2em;
display: -webkit-box;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

参考


0

您可以使用溶解效果代替省略号,纯CSS并看起来更专业:

    <div style="width: 293px; height:48px; overflow: hidden; ">
        More than two line of text goes here-More than two line of text goes here
    </div>
    <div style="position: relative; top: -24px; width: 293px; height:24px; 
             background: linear-gradient(90deg, rgba(255,0,0,0) 40%, rgba(255,255,255,1) 99%);">
    </div>

在这里,我假设您的背景色是白色。


-1

这是一个完全的hack,但是它可以工作:

http://jsfiddle.net/2wPNg/

div {
    width: 30%;
    float: left;
    margin-right: 2%;
    height: 94px;
    overflow: hidden;
    position: relative;
}

div:after {
     display: block;
      content: '...';
      width: 1em;
  height: 1.5em;
  background: #fff;
  position: absolute;
  bottom: -6px;
  right: 0;
    }

它确实有问题...。它可能会尴尬地切断一封信,并且在响应站点​​上可能会产生一些奇怪的结果。


5
这将是不正确的解决方案,因为如果内容较小,则最后还会添加“ ...”。小提琴:jsfiddle.net/2wPNg
Sachin

-1

这是一个使用jQuery管理省略号的简单脚本。它检查元素的实际高度,并创建一个隐藏的原始节点和一个截断的节点。当用户单击时,它将在两个版本之间切换。

如预期的那样,最大的好处之一就是“省略号”接近最后一个词。

如果您使用纯CSS解决方案,则三个点将与最后一个单词分开。

function manageShortMessages() {

        $('.myLongVerticalText').each(function () {
            if ($(this)[0].scrollHeight > $(this)[0].clientHeight)
                $(this).addClass('ellipsis short');
        });

        $('.myLongVerticalText.ellipsis').each(function () {
            var original = $(this).clone().addClass('original notruncation').removeClass('short').hide();
            $(this).after(original);

            //debugger;
            var shortText = '';
            shortText = $(this).html().trim().substring(0, 60) + '...';
            $(this).html(shortText);
        });
        
        $('.myLongVerticalText.ellipsis').click(function () {
            $(this).hide();

            if ($(this).hasClass('original'))
            {
                $(this).parent().find('.short').show();
            }
            else
            {
                $(this).parent().find('.original').show();
            }
        });
    }
	
  manageShortMessages();
div {
 border:1px solid red;
 margin:10px;
}

div.myLongVerticalText {
  height:30px;
  width:450px;
}

div.myLongVerticalText.ellipsis {
 cursor:pointer;
}

div.myLongVerticalText.original {
  display:inline-block;
  height:inherit;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="myLongVerticalText">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sit amet quam hendrerit, sagittis augue vel, placerat erat. Aliquam varius porta posuere. Aliquam erat volutpat. Phasellus ullamcorper malesuada bibendum. Etiam fringilla, massa vitae pulvinar vehicula, augue orci mollis lorem, laoreet viverra massa eros id est. Phasellus suscipit pulvinar consectetur. Proin dignissim egestas erat at feugiat. Aenean eu consectetur erat. Nullam condimentum turpis eu tristique malesuada.

Aenean sagittis ex sagittis ullamcorper auctor. Sed varius commodo dui, nec consectetur ante condimentum et. Donec nec blandit mi, vitae blandit elit. Phasellus efficitur ornare est facilisis commodo. Donec convallis nunc sed mauris vehicula, non faucibus neque vehicula. Donec scelerisque luctus dui eu commodo. Integer eu quam sit amet dui tincidunt pharetra eu ac quam. Quisque tempus pellentesque hendrerit. Sed orci quam, posuere eu feugiat at, congue sed felis. In ut lectus gravida, volutpat urna vitae, cursus justo. Nam suscipit est ac accumsan consectetur. Donec rhoncus placerat metus, ut elementum massa facilisis eget. Donec at arcu ac magna viverra tincidunt.
</div>


<div class="myLongVerticalText">
One Line Lorem ipsum dolor sit amet.  
</div>
</body>


如果您对此解决方案不满意,请在这里解释原因,我们将不胜感激。
Matteo Conta'7

1
OP要求CSS解决方案,而您提供了jQuery?
dashard

我错过了缺少javascript的强烈要求,在我的情况下,纯CSS解决方案带来了渲染问题,jQuery解决方案使我对最终渲染和省略号位置有了更多控制。
马泰奥·康塔

完全同意。在我的回答中,我指出使用JS可以轻松实现这一目标。
dashard

-3

不确定目标是什么,但是您是否希望文本出现在第二行?

这是您的jsFiddle:http : //jsfiddle.net/8kvWX/4/刚刚删除了以下内容:

     white-space:nowrap;  

我不确定这是否是您要寻找的东西。

问候,

e


1
他想在第二行的末尾使用省略号,如果没有JavaScript,这并不容易...
Marc Audet 2013年

@MarcAudet正好:)
Tony Bogdanov

是的,正如我发现另一个人要求在第二行上加上这些行,他的CSS与您的CSS几乎相同,但该类指向的是ul标签。无论如何,对不起托尼。如果成功,我将再次进行查看并更新答案。
2013年

好吧,我认为最好的解决方案是@Itay Gal的解决方案。据我所知,它正在工作。
2013年
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.