用省略号的css自动换行

时间:2015-04-28 04:46:58

标签: html css html5

只使用CSS,一旦容器垂直填充,我想要自动换行,然后省略省略号。根据研究,如果white-space: nowrap我只能得到省略号 - 这只会给我一行。

上下文是已知高度和可变宽度的父div,其中有一个子a元素,如果它不在max-height: 100%,它应该始终垂直居中。

如果在父级中display: table并且指定了子级中的display: table-cellmax-height: xxxtext-overflow: ellipsis,它似乎应该有效。

我认为这不是很多,但它迟到了,我可能会遗漏一些东西。是否有名为still-cant-be-done-in-html5.com的网站?

Fiddle

2 个答案:

答案 0 :(得分:5)

有一个仅限webkit的功能称为"线路钳位"这可以实现我认为你正在寻找的东西。不幸的是,这是非标准的,目前还没有计划(至少我知道)将其作为任何标准的一部分。

https://css-tricks.com/line-clampin/

使用以下CSS完成:

.line-clamp {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;  
}

使用此代码,如果元素的内容用文本填充超过3行,它将在第三行用省略号截断。

有几个不同的JavaScript库试图完成类似的事情,你可以在我在这个答案中包含的链接中看到。不幸的是,使用标准CSS,文本溢出:省略号仅限于一行。

或者,W3C邮件列表中目前有a thread about "region fragments"以及它们如何用于制作多行元素的省略号,但规范仍处于草案阶段,它可能需要几年时间才能进入任何浏览器。

答案 1 :(得分:1)

现在我知道你可以用纯CSS做到这一点。

您可以使用Clamp.js。但我必须警告你,其结果有时会被打破。所以我使用了一个小hack,涉及将clamp的行数设置为3并将包装元素的line-height CSS属性设置为 1 / 3 rd 元素的高度。

// Copying Clamp.min.js here because we cannot execute RAW file from github as it's content type is 'text/plain'.
// Scroll down to see the last line of code.
/*!
 * Clamp.js 0.5.1
 *
 * Copyright 2011-2013, Joseph Schmitt http://joe.sh
 * Released under the WTFPL license
 * http://sam.zoy.org/wtfpl/
 */
(function(){window.$clamp=function(c,d){function s(a,b){n.getComputedStyle||(n.getComputedStyle=function(a,b){this.el=a;this.getPropertyValue=function(b){var c=/(\-([a-z]){1})/g;"float"==b&&(b="styleFloat");c.test(b)&&(b=b.replace(c,function(a,b,c){return c.toUpperCase()}));return a.currentStyle&&a.currentStyle[b]?a.currentStyle[b]:null};return this});return n.getComputedStyle(a,null).getPropertyValue(b)}function t(a){a=a||c.clientHeight;var b=u(c);return Math.max(Math.floor(a/b),0)}function x(a){return u(c)*
a}function u(a){var b=s(a,"line-height");"normal"==b&&(b=1.2*parseInt(s(a,"font-size")));return parseInt(b)}function l(a){if(a.lastChild.children&&0<a.lastChild.children.length)return l(Array.prototype.slice.call(a.children).pop());if(a.lastChild&&a.lastChild.nodeValue&&""!=a.lastChild.nodeValue&&a.lastChild.nodeValue!=b.truncationChar)return a.lastChild;a.lastChild.parentNode.removeChild(a.lastChild);return l(c)}function p(a,d){if(d){var e=a.nodeValue.replace(b.truncationChar,"");f||(h=0<k.length?
k.shift():"",f=e.split(h));1<f.length?(q=f.pop(),r(a,f.join(h))):f=null;m&&(a.nodeValue=a.nodeValue.replace(b.truncationChar,""),c.innerHTML=a.nodeValue+" "+m.innerHTML+b.truncationChar);if(f){if(c.clientHeight<=d)if(0<=k.length&&""!=h)r(a,f.join(h)+h+q),f=null;else return c.innerHTML}else""==h&&(r(a,""),a=l(c),k=b.splitOnChars.slice(0),h=k[0],q=f=null);if(b.animate)setTimeout(function(){p(a,d)},!0===b.animate?10:b.animate);else return p(a,d)}}function r(a,c){a.nodeValue=c+b.truncationChar}d=d||{};
var n=window,b={clamp:d.clamp||2,useNativeClamp:"undefined"!=typeof d.useNativeClamp?d.useNativeClamp:!0,splitOnChars:d.splitOnChars||[".","-","\u2013","\u2014"," "],animate:d.animate||!1,truncationChar:d.truncationChar||"\u2026",truncationHTML:d.truncationHTML},e=c.style,y=c.innerHTML,z="undefined"!=typeof c.style.webkitLineClamp,g=b.clamp,v=g.indexOf&&(-1<g.indexOf("px")||-1<g.indexOf("em")),m;b.truncationHTML&&(m=document.createElement("span"),m.innerHTML=b.truncationHTML);var k=b.splitOnChars.slice(0),
h=k[0],f,q;"auto"==g?g=t():v&&(g=t(parseInt(g)));var w;z&&b.useNativeClamp?(e.overflow="hidden",e.textOverflow="ellipsis",e.webkitBoxOrient="vertical",e.display="-webkit-box",e.webkitLineClamp=g,v&&(e.height=b.clamp+"px")):(e=x(g),e<=c.clientHeight&&(w=p(l(c),e)));return{original:y,clamped:w}}})();


// CODE BEGINS HERE
$clamp(document.getElementById('toclamp'), {
  clamp: 3
});
div {
  width: 100px;
  height: 58px;
  border: 1px solid red;
  line-height: 20px;
}
<div id="toclamp">
  The quick brown fox jumps over the lazy dog.
</div>
<br />
<div id="noclamp">
  The quick brown fox jumps over the lazy dog.
</div>