当前位置:  开发笔记 > 编程语言 > 正文

如果内容太宽,请将省略号(...)插入HTML标记

如何解决《如果内容太宽,请将省略号()插入HTML标记》经验,为你挑选了9个好方法。

我有一个弹性布局的网页,如果调整浏览器窗口大小,它会改变其宽度.

在这种布局中,标题(h2)将具有可变长度(实际上是我无法控制的博客标题的头条新闻).目前 - 如果它们比窗户宽 - 它们分成两行.

是否有一个优雅的,经过测试的(跨浏览器)解决方案 - 例如使用jQuery - 缩短了标题标签的innerHTML,如果文本太宽而无法放入当前屏幕的一行,则会添加"..."容器宽度?



1> Simon Liesch..:

除了Firefox 6.0之外,以下仅用于截断单行文本的CSS解决方案适用于http://www.caniuse.com上列出的所有浏览器.请注意,除非您需要支持包装多行文本或早期版本的Firefox,否则完全没有JavaScript.

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

如果您需要支持早期版本的Firefox,请查看我对其他问题的回答.


这也适用于古老的浏览器.我们在2004年成功地在Google上使用它,我们需要在一些真正的角落浏览器上优雅地支持或降级.
这比jQuery方法快几个数量级.适用于IE7 +和Chrome.
JS Fiddle适合想要在浏览器上对其进行采样的人 - http://jsfiddle.net/r39Ad/

2> alex..:

我有一个在FF3,Safari和IE6 +中使用单行和多行文本的解决方案

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

.ellipsis.multiline {
    white-space: normal;
}

Lorem ipsum dolor sit amet, consectetur adipisicing elit
Lorem ipsum dolor sit amet, consectetur adipisicing elit

jquery.ellipsis.js

(function($) {
    $.fn.ellipsis = function()
    {
        return this.each(function()
        {
            var el = $(this);

            if(el.css("overflow") == "hidden")
            {
                var text = el.html();
                var multiline = el.hasClass('multiline');
                var t = $(this.cloneNode(true))
                    .hide()
                    .css('position', 'absolute')
                    .css('overflow', 'visible')
                    .width(multiline ? el.width() : 'auto')
                    .height(multiline ? 'auto' : el.height())
                    ;

                el.after(t);

                function height() { return t.height() > el.height(); };
                function width() { return t.width() > el.width(); };

                var func = multiline ? height : width;

                while (text.length > 0 && func())
                {
                    text = text.substr(0, text.length - 1);
                    t.html(text + "...");
                }

                el.html(t.html());
                t.remove();
            }
        });
    };
})(jQuery);


要提高性能,请执行二进制搜索,而不是在"while"循环中一次删除1个字符.如果100%的文字不合适,请尝试50%的文字; 然后75%的文本,如果50%适合,或25%,如果50%不适合,等等.
很好,我一直在寻找如何处理多行溢出.一个改进:不添加三个句点,而是附加省略号字符'...'.
如果你想看到这个在行动,你可以在这里看到它(对于插件代码上的搞怪格式感到抱歉)http://jsfiddle.net/danesparza/TF6Rb/1/
这非常有效.您应该在jQuery站点上发布它.

3> Adam Tegen..:

我使用了许多其他帖子构建了此代码,并具有以下增强功能:

    它使用二进制搜索来查找恰到好处的文本长度.

    它通过设置一次性显示事件来处理最初隐藏省略号元素的情况,该事件在首次显示项目时重新运行省略号代码.这对于主要细节视图或树视图很方便,其中某些项目最初未显示.

    它可选地为原始文本添加title属性以用于悬停效果.

    添加display: block到样式,所以跨度工作

    它使用省略号字符而不是3个句点.

    它使用.ellipsis类自动运行脚本

CSS:

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

.ellipsis.multiline {
        white-space: normal;
}

jquery.ellipsis.js

(function ($) {

    // this is a binary search that operates via a function
    // func should return < 0 if it should search smaller values
    // func should return > 0 if it should search larger values
    // func should return = 0 if the exact value is found
    // Note: this function handles multiple matches and will return the last match
    // this returns -1 if no match is found
    function binarySearch(length, func) {
        var low = 0;
        var high = length - 1;
        var best = -1;
        var mid;

        while (low <= high) {
            mid = ~ ~((low + high) / 2); //~~ is a fast way to convert something to an int
            var result = func(mid);
            if (result < 0) {
                high = mid - 1;
            } else if (result > 0) {
                low = mid + 1;
            } else {
                best = mid;
                low = mid + 1;
            }
        }

        return best;
    }

    // setup handlers for events for show/hide
    $.each(["show", "toggleClass", "addClass", "removeClass"], function () {

        //get the old function, e.g. $.fn.show   or $.fn.hide
        var oldFn = $.fn[this];
        $.fn[this] = function () {

            // get the items that are currently hidden
            var hidden = this.find(":hidden").add(this.filter(":hidden"));

            // run the original function
            var result = oldFn.apply(this, arguments);

            // for all of the hidden elements that are now visible
            hidden.filter(":visible").each(function () {
                // trigger the show msg
                $(this).triggerHandler("show");
            });

            return result;
        };
    });

    // create the ellipsis function
    // when addTooltip = true, add a title attribute with the original text
    $.fn.ellipsis = function (addTooltip) {

        return this.each(function () {
            var el = $(this);

            if (el.is(":visible")) {

                if (el.css("overflow") === "hidden") {
                    var content = el.html();
                    var multiline = el.hasClass('multiline');
                    var tempElement = $(this.cloneNode(true))
                        .hide()
                        .css('position', 'absolute')
                        .css('overflow', 'visible')
                        .width(multiline ? el.width() : 'auto')
                        .height(multiline ? 'auto' : el.height())
                    ;

                    el.after(tempElement);

                    var tooTallFunc = function () {
                        return tempElement.height() > el.height();
                    };

                    var tooWideFunc = function () {
                        return tempElement.width() > el.width();
                    };

                    var tooLongFunc = multiline ? tooTallFunc : tooWideFunc;

                    // if the element is too long...
                    if (tooLongFunc()) {

                        var tooltipText = null;
                        // if a tooltip was requested...
                        if (addTooltip) {
                            // trim leading/trailing whitespace
                            // and consolidate internal whitespace to a single space
                            tooltipText = $.trim(el.text()).replace(/\s\s+/g, ' ');
                        }

                        var originalContent = content;

                        var createContentFunc = function (i) {
                            content = originalContent.substr(0, i);
                            tempElement.html(content + "…");
                        };

                        var searchFunc = function (i) {
                            createContentFunc(i);
                            if (tooLongFunc()) {
                                return -1;
                            }
                            return 0;
                        };

                        var len = binarySearch(content.length - 1, searchFunc);

                        createContentFunc(len);

                        el.html(tempElement.html());

                        // add the tooltip if appropriate
                        if (tooltipText !== null) {
                            el.attr('title', tooltipText);
                        }
                    }

                    tempElement.remove();
                }
            }
            else {
                // if this isn't visible, then hook up the show event
                el.one('show', function () {
                    $(this).ellipsis(addTooltip);
                });
            }
        });
    };

    // ellipsification for items with an ellipsis
    $(document).ready(function () {
        $('.ellipsis').ellipsis(true);
    });

} (jQuery));


这比上面接受的答案快得多.如果你有多个.ellipsis元素,并且正在使用它们做任何动态,那么这个元素的表现要好得多.
美丽.Bravo用于实现我对二分查找的建议.
快速说明......值得将.css('max-width','none')添加到tempElement var ...这样你可以在你的css中使用max-width声明,使插件更加灵活(至少对于我有的大多数用例).干得好.:)

4> Mikey G..:

我的回答只支持单行文字.查看下面gfullam对多线分支的评论,它看起来非常有前途.

我从第一个答案重写了几次代码,我认为这应该是最快的.

它首先找到"Estimated"文本长度,然后添加或删除一个字符,直到宽度正确为止.

它使用的逻辑如下所示:

在此输入图像描述

找到"估计的"文本长度后,添加或删除字符,直到达到所需的宽度.

我确定它需要一些调整,但这里是代码:

(function ($) {
    $.fn.ellipsis = function () {
        return this.each(function () {
            var el = $(this);

            if (el.css("overflow") == "hidden") {
                var text = el.html().trim();
                var t = $(this.cloneNode(true))
                                        .hide()
                                        .css('position', 'absolute')
                                        .css('overflow', 'visible')
                                        .width('auto')
                                        .height(el.height())
                                        ;
                el.after(t);

                function width() { return t.width() > el.width(); };

                if (width()) {

                    var myElipse = "....";

                    t.html(text);

                    var suggestedCharLength = (text.length * el.width() / t.width()) - myElipse.length;

                    t.html(text.substr(0, suggestedCharLength) + myElipse);

                    var x = 1;
                    if (width()) {
                        while (width()) {
                            t.html(text.substr(0, suggestedCharLength - x) + myElipse);
                            x++;
                        }
                    }
                    else {
                        while (!width()) {
                            t.html(text.substr(0, suggestedCharLength + x) + myElipse);
                            x++;
                        }
                        x--;
                        t.html(text.substr(0, suggestedCharLength + x) + myElipse);
                    }

                    el.html(t.html());
                    t.remove();
                }
            }
        });
    };
})(jQuery);


你的解决方案可能不是最好的,但它解释得非常好.我喜欢这种类型的近似逻辑.+1 :)
我已经分了这个来添加对textareas和多行(垂直)省略号截断的支持:http://jsfiddle.net/gfullam/j29z7381/(我喜欢近似逻辑BTW)

5> 小智..:

我制作了一个非常酷的jQuery插件,用于处理各种文本的省略号,一个叫做ThreeDots @ http://tpgblog.com/threedots

它比CSS方法更灵活,并支持更高级,可定制的行为和交互.

请享用.



6> Joseph Juhnk..:

以防你们都在2013年结束 - 这里是我在这里找到的一种纯粹的css方法:http://css-tricks.com/snippets/css/truncate-string-with-ellipsis/

.truncate {
  width: 250px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

它运作良好.



7> 小智..:

一个更灵活的jQuery插件,使您可以在省略号后保留一个元素(例如"read-more"按钮)并更新onWindowResize.它还适用于带有标记的文本:

http://dotdotdot.frebsite.nl



8> Eliot Sykes..:

trunk8 jQuery插件支持多行,并且可以使用任何html,而不仅仅是省略号字符,用于截断后缀:https://github.com/rviscomi/trunk8

在这里演示:http://jrvis.com/trunk8/



9> annakata..:

实际上有一种非常简单的方法可以在CSS中实现这一点,利用IE扩展了非标准和FF支持的事实:after

你可以通过检查目标的scrollWidth并将它与它的父级宽度进行比较来在JS中执行此操作,但是这样做不太稳健.

编辑:这显然比我想象的更发达.CSS3支持可能很快就会存在,并且您可以尝试使用一些不完善的扩展.

http://www.css3.info/preview/text-overflow/

http://ernstdehaan.blogspot.com/2008/10/ellipsis-in-all-modern-browsers.html

最后一个是好读.

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有