如何进行文本溢出:两行省略号?

Posted

技术标签:

【中文标题】如何进行文本溢出:两行省略号?【英文标题】:How can I do text-overflow: ellipsis on two lines? 【发布时间】:2015-10-20 07:31:54 【问题描述】:

我有一个容器,其中文本可以扩展到两行,高度为 40 像素,字体大小为 18 像素。当我这样做时:

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

然后虚线显示正确,但它在一条线上被切断。当我这样做时:

text-overflow: ellipsis;

然后它正确显示了 2 行,但最后没有“...”。我该如何实现这一点,以便它正确使用两行并在第二行以“...”结尾?

【问题讨论】:

空白在某些情况下会有所帮助 codepen.io/gc-nomade/pen/bNxBxE br 或 pre 查看我发布的答案和代码笔链接codepen.io/anon/pen/pJQpWo CSS: Text overflow ellipsis on two lines, is it possible?的可能重复 Insert ellipsis (...) into html tag if content too wide的可能重复 显示:-webkit-box; -webkit-box-orient:垂直; -webkit-line-clamp:2;是最好的方法。 【参考方案1】:

在容器中添加一个span,它将保存文本:

<div class="container">
  <span>text...</span>
</span>

添加这个 CSS:

.container 
   overflow: hidden;
   position: relative;
   background: white;   //or other color


.container:after 
  content: '...';       //the ellipsis
  position: absolute;   //positioned in bottom-right
  bottom: 0;            //...
  right: 0;             //...
  padding: 0 0.3em;     //give some separation from text
  background: inherit;  //same color as container


.container span:after 
  content: '\0000a0';   //a space
  position: absolute;   //to cover up ellipsis if needed
  width: 1000px;        //...
  z-index: 1;           //...
  background: white;    //must match container's color.  can't use inherit here.

Fiddle

调整容器大小,您会看到省略号仅在必要时显示。

应该适用于所有现代浏览器。

【讨论】:

背景:白色可以变成背景:透明。此外,很好的解决方案,伙计。 @Tom,谢谢。我认为您需要指定背景颜色。否则,省略号可能会不必要地显示。请参阅jsfiddle.net/j7863uw5/44 的第一个 div。 这不只取决于宽度吗? 抱歉,@UlisesCT,不确定我是否理解您的问题?【参考方案2】:

您可以使用-webkit-line-clamp 完成此操作。但是需要破解。您需要设置 div 的高度,使其只能容纳两行。

查看此代码笔https://codepen.io/VamsiKaja/pen/xYZVzY

HTML 文件:

<p class="">Pellentesque habitant morbi tristique senectus et netus et </p>

CSS 文件:

p 
    width:250px;  
    font-size:20px;
    margin:1em;
    height:50px;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;

【讨论】:

【参考方案3】:

只想加我的两分钱。最接近的纯 CSS 解决方案是 -webkit-line-clamp 方法,但仅限于 webkit 浏览器,并且是旧的 flexbox 实现的残余(将来可能会被删除)。

也许您应该重新考虑是否真的需要在垂直溢出的文本上使用省略号。

我建议改为使用可滚动的文本框。由于以下三个原因,我认为这是最好的解决方案:

    适用于所有主流浏览器 不涉及 css 变通办法、hack 或 javascript 可以很好地与用户沟通文本被截断,但如果他们愿意,他们可以选择滚动浏览它 - 另外,用户已经习惯了垂直滚动条

这是文本框的示例代码:

.element 
  display: inline-block;
  height: 200px;
  overflow-y: auto;

  /* this is to preserve text containing new lines */
  white-space: pre-line;

如果我不得不选择,我会使用类似于Succint 的javascript 解决方案,它会在一定数量之后删除单词并在末尾附加一个...。如果您使用 React,这非常棒,因为您可以将组件内部所需的所有代码实现为函数,并且如果您需要原始文本,您仍然可以将其作为 props 值。

【讨论】:

【参考方案4】:

基于-webkit-line-clamp的纯css方法:

@-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>

【讨论】:

以上是关于如何进行文本溢出:两行省略号?的主要内容,如果未能解决你的问题,请参考以下文章

如何在文本中间显示文本溢出省略号

如何检测角度控制器中的文本是不是溢出(文本溢出:省略号)

多行文本溢出如何显示省略号

scss 使用省略号Mixin进行文本溢出

如何模仿文本溢出:Firefox 中的省略号?

浅谈移动端过长文本溢出显示省略号的实现方案