省略号在文本中间(Mac风格)

39 javascript css jquery truncation

我需要"..."在可调整大小的元素中的文本中间实现省略号().这可能是它的样子.所以,

"Lorem ipsum dolor sit amet. Ut ornare dignissim ligula sed commodo."
Run Code Online (Sandbox Code Playgroud)

变

"Lorem ipsum dolor sit amet ... commodo."
Run Code Online (Sandbox Code Playgroud)

当元素伸展到文本的宽度时,我希望省略号消失.如何才能做到这一点?

Ste*_*röm 27

在HTML中,将完整值放在自定义data-*属性中

<span data-original="your string here"></span>
Run Code Online (Sandbox Code Playgroud)

然后将分配load和resize事件侦听器分配给JavaScript函数,该函数将读取原始数据属性并将其放在innerHTMLspan标记中.以下是省略号函数的示例:

function start_and_end(str) {
  if (str.length > 35) {
    return str.substr(0, 20) + '...' + str.substr(str.length-10, str.length);
  }
  return str;
}
Run Code Online (Sandbox Code Playgroud)

调整值,或者如果可能,使它们动态化,如果需要,可以使用不同的对象.如果您有来自不同浏览器的用户,则可以使用dom中其他位置的相同字体和大小从文本中窃取参考宽度.然后插入适当数量的字符以供使用.

提示也要在...上添加一个abbr-tag,或者使用户能够获得完整字符串的工具提示的消息.

<abbr title="simple tool tip">something</abbr>
Run Code Online (Sandbox Code Playgroud)

  • @ user102465你能分享最终结果吗?谢谢! (3认同)
  • 有没有css的方法?修复它本身而不是使用javsacript? (2认同)
  • 您实际上可以在第二部分中使用“ str.substr(-10)”。 (2认同)

ext*_*mpl 20

我想提出解决这个问题的例子.

主要思想是将文本分成两个偶数部分(或者如果长度是奇数则首先是更大的),其中一个最后有省略号,另一个右对齐text-overflow: clip.

所以你需要用js做的,如果你想让它自动/通用 - 就是分割字符串和设置属性.

但它有一些缺点.

  1. 单词,甚至字母都没有很好的包装(目前text-overflow: ''仅在FF中有效)
  2. 如果在单词之间发生分裂 - 空间应该在第一部分.否则,它将被折叠.
  3. 字符串的结尾不应该有任何感叹号,因为direction: rtl- 它们将被移动到字符串的左侧.我认为,可以通过在标签中放置单词的正确部分和::after伪元素中的感叹号来解决这个问题.但我还没有正确地工作.

但是,对于所有这些,它看起来真的很酷,特别是当您拖动浏览器的边框时,您可以轻松地在jsfiddle页面上执行此操作:https://jsfiddle.net/extempl/93ymy3oL/ .或者只是运行下面固定最大宽度的代码段.

扰流板下的GIF:

GIF

body {
  max-width: 400px;
}

span::before, span::after {
  display: inline-block;
  max-width: 50%;
  overflow: hidden;
  white-space: pre;
}

span::before {
  content: attr(data-content-start);
  text-overflow: ellipsis;
}

span::after {
  content: attr(data-content-end);
  text-overflow: '';
  direction: rtl;
}
Run Code Online (Sandbox Code Playgroud)
<span data-content-start="Look deep into nature, and then you " 
      data-content-end=  "will understand everything better"></span>

<br>
<span data-content-start="https://www.google.com.ua/images/branding/g" 
      data-content-end=  "ooglelogo/2x/googlelogo_color_272x92dp.png"></span>
Run Code Online (Sandbox Code Playgroud)

  • 上面的代码片段似乎在 Chrome 中运行良好,但后半部分的文本剪辑看起来有点有趣。 (3认同)

小智 9

所以我的同事提出了一个不使用额外dom元素的解决方案.我们检查div是否溢出并添加最后n个字符的数据属性.其余的都是用css完成的.

这是一些HTML:

<div class="box">
    <div class="ellipsis" data-tail="some">This is my text it is awesome</div>
</div>
<div class="box">
    <div class="ellipsis">This is my text</div>
</div>
Run Code Online (Sandbox Code Playgroud)

和css:

.box {
    width: 200px;
}

.ellipsis:before {
    float: right;
    content: attr(data-tail);
}

.ellipsis {
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
}
Run Code Online (Sandbox Code Playgroud)

这是强制性的jsfiddle:http: //jsfiddle.net/r96vB/1/

  • 这打破了FF (2认同)
  • 非常好的解决方案,但不幸的是它在Firefox 34(文本重叠)和IE <10(不支持的方法querySelector)中不起作用 (2认同)

joh*_*vey 6

以下Javascript函数将执行中间截断,如OS X:

function smartTrim(string, maxLength) {
    if (!string) return string;
    if (maxLength < 1) return string;
    if (string.length <= maxLength) return string;
    if (maxLength == 1) return string.substring(0,1) + '...';

    var midpoint = Math.ceil(string.length / 2);
    var toremove = string.length - maxLength;
    var lstrip = Math.ceil(toremove/2);
    var rstrip = toremove - lstrip;
    return string.substring(0, midpoint-lstrip) + '...' 
    + string.substring(midpoint+rstrip);
}       
Run Code Online (Sandbox Code Playgroud)

它将用省略号替换中间的字符.我的单元测试显示:

var s = '1234567890';
assertEquals(smartTrim(s, -1), '1234567890');
assertEquals(smartTrim(s, 0), '1234567890');
assertEquals(smartTrim(s, 1), '1...');
assertEquals(smartTrim(s, 2), '1...0');
assertEquals(smartTrim(s, 3), '1...90');
assertEquals(smartTrim(s, 4), '12...90');
assertEquals(smartTrim(s, 5), '12...890');
assertEquals(smartTrim(s, 6), '123...890');
assertEquals(smartTrim(s, 7), '123...7890');
assertEquals(smartTrim(s, 8), '1234...7890');
assertEquals(smartTrim(s, 9), '1234...67890');
assertEquals(smartTrim(s, 10), '1234567890');
assertEquals(smartTrim(s, 11), '1234567890');
Run Code Online (Sandbox Code Playgroud)

  • 这很好,并且按描述工作,但是我需要使输出字符串“可拉伸”,以便根据一个人的视口大小确定截断。大屏幕 - 无截断,窄屏幕 - 使用动态计算的字符数截断字符串以获得最佳匹配。 (2认同)

Nik*_*hou 6

经过对 Flex Box 的一些研究后,我发现了这个纯 CSS 解决方案,我认为它非常酷。

<div style="width:100%;border:1px solid green;display:inline-flex;flex-wrap:nowrap;">
   <div style="flex: 0 1 content;text-overflow: ellipsis;overflow:hidden;white-space:nowrap;"> Her comes very very very very very very very very very very very very very very very very very very very long </div>
   <div style="flex: 1 0 content;white-space:nowrap;"> &nbsp;but flexible line</div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 不要认为这回答了问题。这并不能解决在 _1_ 字符串中间添加省略号的问题。这只是在两个字符串之间添加一个省略号。即,在 @user102465 的情况下,首先必须以某种方式拆分字符串才能使您的解决方案正常工作。 (2认同)