使用CSS截断长字符串:可行吗?


210

有没有什么好方法可以用纯HTML和CSS截断文本,以使动态内容适合固定宽度和高度的布局?

我一直在通过逻辑宽度(即盲目猜测的字符数)来截断服务器端,但是由于'w'比'i'宽,所以这往往不是最佳选择,并且还要求我重新猜测(并不断调整)每个固定宽度的字符数。理想情况下,截断将发生在浏览器中,该浏览器知道渲染文本的物理宽度。

我发现IE的text-overflow: ellipsis属性完全可以满足我的要求,但是我需要它能够跨浏览器。该属性似乎是(某种程度上)标准的,但Firefox不支持。我发现了各种 基于的变通办法overflow: hidden,但是它们要么不显示省略号(我希望用户知道内容已被截断),要么一直显示(即使内容未被截断)。

有没有人能以固定的布局来适合动态文本的好方法,还是服务器端的逻辑宽度截断是否和我现在想要的一样好?




Answers:


187

更新: Firefox 7(2011年9月27日发布)text-overflow: ellipsis现在已受支持。好极了!我的原始答案是历史记录。

Justin Maxwell具有跨浏览器CSS解决方案。但是它的缺点是不允许在Firefox中选择文本。在Matt Snider的博客上查看其来宾帖子,以获取有关其工作原理的完整详细信息。

请注意,此技术还可以防止使用innerHTMLFirefox中的属性更新JavaScript中节点的内容。解决方法请参阅本文结尾。

的CSS

.ellipsis {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    -moz-binding: url('assets/xml/ellipsis.xml#ellipsis');
}

ellipsis.xml 文件内容

<?xml version="1.0"?>
<bindings
  xmlns="http://www.mozilla.org/xbl"
  xmlns:xbl="http://www.mozilla.org/xbl"
  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
>
    <binding id="ellipsis">
        <content>
            <xul:window>
                <xul:description crop="end" xbl:inherits="value=xbl:text"><children/></xul:description>
            </xul:window>
        </content>
    </binding>
</bindings>

更新节点内容

要以可在Firefox中运行的方式更新节点的内容,请使用以下命令:

var replaceEllipsis(node, content) {
    node.innerHTML = content;
    // use your favorite framework to detect the gecko browser
    if (YAHOO.env.ua.gecko) {
        var pnode = node.parentNode,
            newNode = node.cloneNode(true);

        pnode.replaceChild(newNode, node);
    }
};

有关其工作原理的说明,请参见Matt Snider的帖子


太好了,谢谢指出!不可选择的文本以及对截断的div中可以包含的内容的限制是令人遗憾的,但是通常看起来是一个不错的解决方案。
山姆·斯托克斯

我碰到的唯一真正的挫折是空格被渲染为&nbsp;,所以缩进实际上是不可行的……= /
Matchu

我也遇到了同样的问题。我不敢相信Firefox还不支持某种形式。
mcjabberz

这种方法对Webkit和IE8上SELECT控件的OPTION元素上的任何人都有效吗?Webkit似乎没有为我做任何事情,IE8只是在没有省略号的情况下对其进行了裁剪。
Rajat 2010年

Microsoft的文档text-overflow未表示对option元素的支持(请参阅msdn.microsoft.com/zh-cn/library/ms531174(VS.85).aspx的“ 应用于”部分)。
西蒙·里希克

45

2014年3月:使用CSS截断长字符串:针对浏览器支持的新答案

http://jsbin.com/leyukama/1/上进行演示(我使用jsbin,因为它支持IE的旧版本)。

<style type="text/css">
    span {
        display: inline-block;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;     /** IE6+, Firefox 7+, Opera 11+, Chrome, Safari **/
        -o-text-overflow: ellipsis;  /** Opera 9 & 10 **/
        width: 370px; /* note that this width will have to be smaller to see the effect */
    }
</style>

<span>Some very long text that should be cut off at some point coz it's a bit too long and the text overflow ellipsis feature is used</span>

-ms-text-overflow CSS属性不是必需的:它是text-overflow CSS属性的同义词,但是从6到11的IE版本已经支持text-overflow CSS属性。

在Windows OS上针对Web浏览器成功测试(在Browserstack.com上):

  • IE6至IE11
  • Opera 10.6,Opera 11.1,Opera 15.0,Opera 20.0
  • Chrome 14,Chrome 20,Chrome 25
  • Safari 4.0,Safari 5.0,Safari 5.1
  • Firefox 7.0,Firefox 15

Firefox:Simon Lieschke(在另一个答案中指出)指出,Firefox仅支持从Firefox 7开始(2011年9月27日发布)的文本溢出CSS属性。

我在Firefox 3.0和Firefox 6.0上再次检查了此行为(不支持文本溢出)。

需要在Mac OS Web浏览器上进行一些进一步的测试。

注意:应用省略号时,您可能希望在鼠标悬停时显示工具提示,这可以通过javascript完成,请参见以下问题:HTML文本溢出省略号检测HTML-仅在激活省略号时如何显示工具提示

资源:


@chiragpatel通过编辑此实时演示jsbin.com/leyukama/1
Adrien Be

对于有兴趣的人来说,FF7 <是当今Firefox用户的0.05%
Tom Tom

19

如果您可以使用JavaScript解决方案,可以使用jQuery插件以跨浏览器的方式进行操作-请参见http://azgtech.wordpress.com/2009/07/26/text-overflow-ellipsis-for -firefox-via-jquery /


绝对有用,谢谢!似乎除Firefox之外的所有浏览器都支持CSS属性,因此使用此插件,唯一不适合使用Firefox的用户是禁用了Javascript的Firefox用户-无论如何这都是正常的降级。知道性能影响如何吗?
山姆·斯托克斯

不,对不起...我没有在现实生活中使用过代码,只是在演示中玩过。演示并剪切并粘贴一百次到同一页面会很容易。
RichieHindle 2009年

2
JavaScript truncate()(对于jQuery或Prototype或其他类型,为点字符串)只是一种中间解决方案,因为它们没有考虑字符宽度。因此,如果您由于预定义的有限空间而想要截断文本,则这些功能仅在使用等宽字体时才可靠地工作。任何严肃的解决方案都必须对字形进行操作,而不是对字符数进行操作。
马赛厄斯2009年

@Matthias:也许自从您测试代码以来,代码已经更新,但是我只是看了一下演示,它与可变宽度字体完美结合。
RichieHindle

7

确定,已实施Firefox 7 text-overflow: ellipsis以及text-overflow: "string"。最终版本计划于2011-09-27发布。


6

解决该问题的另一种方法是使用以下CSS规则集:

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

.ellipsis:after{
  content:'...';
}

上面的CSS的唯一缺点是,无论文本是否溢出容器,它都会添加“ ...”。不过,如果您遇到一堆元素并且确定内容会溢出的情况,那么这将是一组更简单的规则。

我的两分钱。向Justin Maxwell的原始技术致敬


伪代码的问题是,如果文本确实溢出,“ ...”仍然会被截断或隐藏。我希望如果文本溢出,那么可以确保显示“ ...”。显然,事实并非如此:(
安东尼

@Antony只需放置伪元素:(position: absolute; right: 0;并且不要忘position: relative了在真正的元素上起作用)。但是它将与文本重叠,因此您可能也想添加背景色。
最后一个孩子
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.