Chèn dấu chấm lửng (Thẻ) vào thẻ HTML nếu nội dung quá rộng


148

Tôi có một trang web có bố cục đàn hồi thay đổi độ rộng của nó nếu cửa sổ trình duyệt được thay đổi kích thước.

Trong bố cục này, có các tiêu đề ( h2) sẽ có độ dài thay đổi (thực sự là các tiêu đề từ các blog blog mà tôi không có quyền kiểm soát). Hiện tại - nếu chúng rộng hơn cửa sổ - chúng được chia thành hai dòng.

Có một giải pháp (trình duyệt chéo) thanh lịch - ví dụ như với jQuery - rút ngắn phần bên trongHTML của thẻ tiêu đề đó và thêm "..." nếu văn bản quá rộng để khớp với một dòng trên màn hình hiện tại / chiều rộng container?


1
Câu trả lời được cập nhật năm 2014: stackoverflow.com/a/22811590/759452
Adrien Be

Tôi đã tạo plugin dựa trên chủ đề này sử dụng các thuộc tính CSS khoảng trắng và gói từ để định dạng văn bản. github.com/nothrem/jQuerySmartEllipsis
Radek Pech

Câu trả lời:


119

Tôi đã có một giải pháp hoạt động trong FF3, Safari và IE6 + với văn bản đơn và đa dòng

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

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

<div class="ellipsis" style="width: 100px; border: 1px solid black;">Lorem ipsum dolor sit amet, consectetur adipisicing elit</div>
<div class="ellipsis multiline" style="width: 100px; height: 40px; border: 1px solid black; margin-bottom: 100px">Lorem ipsum dolor sit amet, consectetur adipisicing elit</div>

<script type="text/javascript" src="/js/jquery.ellipsis.js"></script>
<script type="text/javascript">
$(".ellipsis").ellipsis();
</script>

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);

22
Thật tuyệt, tôi đã tìm cách xử lý tràn với nhiều dòng. Một cải tiến: thay vì nối thêm ba dấu chấm, nối thêm ký tự dấu chấm lửng, '' '.
Simon Lieschke

4
Điều này hoạt động rất tốt. Bạn nên xuất bản này trên trang web jQuery.
Edgar

1
Mặc dù trong IE nếu chức năng dấu chấm lửng được áp dụng trên div chỉ có một liên kết, sau khi dấu chấm lửng, liên kết sẽ biến mất. Bất kỳ con trỏ về điều này?
Chantz

6
Nếu bạn muốn thấy điều này hoạt động, bạn có thể thấy nó ở đây (xin lỗi vì định dạng khó hiểu trên mã plugin) jsfiddle.net/danesparza/TF6Rb/1
Dan Esparza

22
Để cải thiện hiệu suất, hãy thực hiện tìm kiếm nhị phân thay vì xóa 1 ký tự một lần trong vòng lặp "while". Nếu 100% văn bản không phù hợp, hãy thử 50% văn bản; sau đó 75% văn bản nếu 50% phù hợp hoặc 25% nếu 50% không phù hợp, v.v.
StanleyH

182

Giải pháp CSS duy nhất sau đây để cắt bớt văn bản trên một dòng duy nhất hoạt động với tất cả các trình duyệt được liệt kê tại http://www.caniuse.com khi viết ngoại trừ Firefox 6.0. Lưu ý rằng JavaScript là hoàn toàn không cần thiết trừ khi bạn cần hỗ trợ gói văn bản nhiều dòng hoặc các phiên bản Firefox trước đó.

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

Nếu bạn cần hỗ trợ cho các phiên bản Firefox trước đó, hãy xem câu trả lời của tôi cho câu hỏi khác này .


2
Đây là thứ tự cường độ nhanh hơn phương pháp jQuery. Hoạt động tốt trong IE7 + và Chrome.
JDB vẫn còn nhớ Monica

3
Điều này cũng hoạt động tốt trình duyệt cổ xưa. Chúng tôi đã sử dụng nó thành công tại Google vào năm 2004, nơi chúng tôi được yêu cầu hỗ trợ hoặc xuống cấp một cách duyên dáng trên một số trình duyệt góc thực sự.
ElBel

2
JS Fiddle cho những người muốn lấy mẫu trên trình duyệt - jsfiddle.net/r39Ad
Deepak Bala

@DilipRajkumar bạn sẽ cần cung cấp thêm chi tiết, ví dụ: ví dụ về JSFiddle chứng minh rằng nó không hoạt động trong IE 8.
Simon Lieschke

1
@SharpCoder bạn không. Trường hợp văn bản bị cắt được quyết định bởi chiều rộng của phần tử có chứa nó, tức là nó cắt ngắn khi nó sẽ tràn qua chiều rộng của phần tử.
Simon Lieschke

40

Tôi đã xây dựng mã này bằng cách sử dụng một số bài đăng khác, với các cải tiến sau:

  1. Nó sử dụng một tìm kiếm nhị phân để tìm độ dài văn bản vừa phải.
  2. Nó xử lý các trường hợp ban đầu (các) phần tử dấu chấm lửng được ẩn bằng cách thiết lập một sự kiện hiển thị một lần chạy lại mã dấu chấm lửng khi mục này được hiển thị lần đầu tiên. Điều này rất hữu ích cho các chế độ xem chi tiết tổng thể hoặc chế độ xem dạng cây trong đó một số mục không được hiển thị ban đầu.
  3. Nó tùy ý thêm một thuộc tính tiêu đề với văn bản gốc cho hiệu ứng di chuột.
  4. Đã thêm vào display: blockkiểu, do đó, nhịp làm việc
  5. Nó sử dụng ký tự dấu chấm lửng thay vì 3 dấu chấm.
  6. Nó tự động chạy tập lệnh cho mọi thứ với lớp .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));

2
Xinh đẹp. Bravo để thực hiện đề nghị của tôi về một tìm kiếm nhị phân.
StanleyH

2
Chỉ cần một ghi chú nhanh ... đáng để thêm .css ('max-width', 'none') vào tempEuity var ... Cách này bạn có thể sử dụng khai báo độ rộng tối đa trong css của mình, giúp plugin linh hoạt hơn rất nhiều (ít nhất là đối với hầu hết các trường hợp sử dụng tôi có). Công việc tốt đẹp nào. :)
chúa tể

3
Đây là một thực hiện nhanh hơn nhiều so với câu trả lời được chấp nhận ở trên. Nếu bạn có nhiều phần tử .ellipsis và đang làm bất cứ điều gì năng động với chúng, thì phần tử này hoạt động tốt hơn nhiều.
mjvotaw

Bạn có thể vui lòng cung cấp một ví dụ? Câu hỏi của tôi là ở đây: stackoverflow.com/questions/26344520/
Kẻ

Tìm kiếm nhị phân là tốt hơn nhưng không phải với các bộ dữ liệu rất nhỏ và trong trường hợp này, nó cản trở hiệu suất so với tìm kiếm tuyến tính thẳng như indexOf () ... rõ ràng
user1360809

20

Câu trả lời của tôi chỉ hỗ trợ văn bản một dòng. Kiểm tra bình luận của gfullam dưới đây cho ngã ba nhiều dòng, nó có vẻ khá hứa hẹn.

Tôi đã viết lại mã từ câu trả lời đầu tiên một vài lần và tôi nghĩ rằng đây phải là cách nhanh nhất.

Đầu tiên, nó tìm thấy độ dài văn bản "Ước tính", sau đó thêm hoặc xóa ký tự cho đến khi độ rộng chính xác.

Logic nó sử dụng được hiển thị dưới đây:

nhập mô tả hình ảnh ở đây

Sau khi tìm thấy độ dài văn bản "ước tính", các ký tự được thêm hoặc xóa cho đến khi đạt được độ rộng mong muốn.

Tôi chắc chắn rằng nó cần một số điều chỉnh, nhưng đây là mã:

(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);

3
Giải pháp của bạn có thể không phải là tốt nhất, nhưng nó được giải thích rất rõ. Và tôi thích loại logic gần đúng này. +1 :)
Flater

2
Tôi đã chia rẽ điều này để thêm hỗ trợ cho việc cắt xén văn bản và đa hướng (dọc): jsfiddle.net/gfullam/j29z7381 (Tôi thích logic gần đúng BTW)
gfullam

19

Chỉ trong trường hợp bạn kết thúc ở đây vào năm 2013 - đây là một cách tiếp cận css thuần túy tôi tìm thấy ở đây: http://css-tricks.com/snippets/css/truncate-opes-with-ellipsis/

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

Nó hoạt động tốt.


1
FWIW, text-overflowkhông hoạt động với textareacác yếu tố (kể từ năm 2015). Nếu bạn cần hỗ trợ cho textareabạn, bạn có thể đạt được nó bằng cách sửa đổi câu trả lời được chấp nhận hoặc bằng cách sử dụng ngã ba này .
gfullam

18

Tôi đã tạo một plugin jQuery thực sự tuyệt vời để xử lý tất cả các loại dấu chấm lửng của văn bản có tên là ThreeDots @ http://tpgblog.com/threedots

Nó linh hoạt hơn nhiều so với các cách tiếp cận CSS và hỗ trợ các hành vi và tương tác nâng cao hơn, có thể tùy chỉnh.

Thưởng thức.


8

Một plugin jQuery linh hoạt hơn cho phép bạn giữ một phần tử sau dấu chấm lửng (ví dụ nút "đọc thêm") và cập nhật trênWindowResize. Nó cũng hoạt động xung quanh văn bản với đánh dấu:

http://dotdotdot.frebsite.nl


Tôi mới thử nghiệm plugin này, nhưng tôi không thể làm cho nó hoạt động được. Trunk8 là một lựa chọn tốt hơn cho tôi.
Guilherme Garnier

8

Plugin trunk8 jQuery hỗ trợ nhiều dòng và có thể sử dụng bất kỳ html nào, không chỉ các ký tự dấu chấm lửng, cho hậu tố cắt ngắn: https://github.com/rviscomi/trunk8

Demo tại đây: http://jrvis.com/trunk8/


Vâng, nhưng điều này là cổ xưa. Hình như nó không được hỗ trợ?
dùng2513846

1
Có vẻ như nó được hỗ trợ tích cực - tại thời điểm viết (tháng 3 năm 2016), các vấn đề và PR cho thấy hoạt động gần đây liên quan đến người tạo dự án.
Eliot Sykes

5

Thực sự có một cách khá đơn giản để thực hiện điều này trong CSS khai thác thực tế là IE mở rộng điều này với các hỗ trợ phi tiêu chuẩn và FF:after

Bạn cũng có thể thực hiện điều này trong JS nếu bạn muốn bằng cách kiểm tra cuộn giấy của mục tiêu và so sánh nó với chiều rộng của cha mẹ, nhưng imho điều này kém mạnh mẽ hơn.

Chỉnh sửa: điều này rõ ràng là phát triển hơn tôi nghĩ. Hỗ trợ CSS3 có thể sớm tồn tại và một số tiện ích mở rộng không hoàn hảo có sẵn để bạn thử.

Đó là cuối cùng là đọc tốt.


Trên thực tế tôi thích giải pháp JS - vì nó chỉ thêm "..." nếu văn bản rộng hơn không gian có sẵn.
BlaM

3

Tôi đã làm một cái gì đó tương tự cho một khách hàng gần đây. Đây là phiên bản của những gì tôi đã làm cho họ (ví dụ được thử nghiệm trong tất cả các phiên bản trình duyệt mới nhất trên Win Vista). Không hoàn hảo tất cả xung quanh bảng, nhưng có thể được điều chỉnh khá dễ dàng.

Bản trình diễn: http://enobrev.info/ellipsis/

Mã số:

<html>
    <head>
        <script src="http://www.google.com/jsapi"></script>
        <script>            
            google.load("jquery", "1.2.6");
            google.setOnLoadCallback(function() {
                $('.longtext').each(function() {
                    if ($(this).attr('scrollWidth') > $(this).width()) {
                        $more = $('<b class="more">&hellip;</b>');

                        // add it to the dom first, so it will have dimensions
                        $(this).append($more);

                        // now set the position
                        $more.css({
                            top: '-' + $(this).height() + 'px',
                            left: ($(this).attr('offsetWidth') - $more.attr('offsetWidth')) + 'px'
                        });
                    }
                });
            });
        </script>

        <style>
            .longtext {
                height: 20px;
                width: 300px;
                overflow: hidden;
                white-space: nowrap;
                border: 1px solid #f00;
            }

            .more {
                z-index: 10;
                position: relative;
                display: block;
                background-color: #fff;
                width: 18px;
                padding: 0 2px;
            }
        </style>
    </head>
    <body>
        <p class="longtext">This is some really long text.  This is some really long text.  This is some really long text.  This is some really long text.</p>
    </body>
</html>

3

Chà, một giải pháp đơn giản, không hoàn toàn thêm "...", nhưng việc ngăn <h2> phá thành hai dòng sẽ là thêm bit css này:

h2 {
    height:some_height_in_px; /* this is the height of the line */
    overflow:hidden; /* so that the second (or third, fourth, etc.)
                        line is not visible */
}

Tôi đã suy nghĩ thêm, và tôi đã đưa ra giải pháp này, bạn phải bọc nội dung văn bản của thẻ h2 của mình bằng một thẻ khác (ví dụ: một khoảng) (hoặc cách khác là bọc h2s bằng thứ gì đó có chiều cao cho trước) và sau đó bạn có thể sử dụng loại javascript này để lọc ra những từ không cần thiết:

var elems = document.getElementById('conainter_of_h2s').
                     getElementsByTagName('h2');

    for ( var i = 0, l = elems.length; i < l; i++) {
        var span = elems.item(i).getElementsByTagName('span')[0];
        if ( span.offsetHeight > elems.item(i).offsetHeight ) {
            var text_arr = span.innerHTML.split(' ');
            for ( var j = text_arr.length - 1; j>0 ; j--) {
                delete text_arr[j];
                span.innerHTML = text_arr.join(' ') + '...';
                if ( span.offsetHeight <= 
                                        elems.item(i).offsetHeight ){
                    break;
                }
            }
        }
    }

Trên thực tế tôi đã nghĩ về việc sử dụng nó làm cơ sở cho một giải pháp khả thi, nhưng tôi không biết nếu - dựa trên điều này - có thể tìm ra, nếu toàn bộ văn bản hiện được hiển thị hoặc nếu tôi cần rút ngắn nó và thêm " ... ". Chỉ cần cắt nó đi sẽ trông lạ.
BlaM

3

Đây là một giải pháp JavaScript khác. Hoạt động rất tốt và rất nhanh.

https://github.com/dobiatowski/jQuery.FastEllipsis

Đã thử nghiệm trên Chrome, FF, IE trên Windows và Mac.


Mặc dù điều này ít tự động hơn, tôi thấy đó là một giải pháp chính xác hơn câu trả lời của Adam Tegen . Kịch bản này yêu cầu số lượng dòng văn bản tối đa được chỉ định thay vì đoán.
bánh rán

3

Có một giải pháp cho văn bản nhiều dòng với css thuần túy. Nó được gọi line-clamp, nhưng nó chỉ hoạt động trong trình duyệt webkit. Tuy nhiên, có một cách để bắt chước điều này trong tất cả các trình duyệt hiện đại (mọi thứ gần đây hơn IE8.) Ngoài ra, nó sẽ chỉ hoạt động trên nền vững chắc vì bạn cần một hình nền để ẩn những từ cuối cùng của dòng cuối cùng. Đây là cách nó diễn ra:

Đưa ra html này:

<p class="example" id="example-1">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>

Đây là CSS:

p {
    position:relative;
    line-height:1.4em;
    height:4.2em;      /* 3 times the line-height to show 3 lines */
}
p::after {
    content:"...";
    font-weight:bold;
    position:absolute;
    bottom:0;
    right:0;
    padding:0 20px 1px 45px;
    background:url(ellipsis_bg.png) repeat-y;
}

ellipsis_bg.png là một hình ảnh có cùng màu với nền của bạn, có chiều rộng khoảng 100px và có cùng chiều cao với chiều cao đường thẳng của bạn.

Nó không đẹp lắm, vì văn bản của bạn có thể bị cắt ở giữa một chữ cái, nhưng nó có thể hữu ích trong một số trường hợp.

Tham khảo: http://www.css-101.org/articles/line-clamp/line-clamp_for_non_webkit-basing_browsers.php


Điều đó thật tuyệt, nhưng bạn cần chắc chắn rằng văn bản của bạn đủ dài, bởi vì CSS này sẽ thêm "..." ngay cả khi văn bản đủ ngắn để phù hợp với không gian có sẵn. BTW: Câu trả lời tương tự đã được Apopii cung cấp khoảng một tháng trước;)
BlaM

@BlaM Khá giống nhau thực sự. Nhưng tôi nghĩ rằng thủ thuật gradient là gọn gàng và mã này trong CSS thay vì SASS, vì vậy tôi nghĩ rằng nó xứng đáng là một câu trả lời riêng biệt.
Jules Colle

3

Dấu chấm lửng đa dòng CSS thuần cho nội dung văn bản:

.container{
    position: relative;  /* Essential */
    background-color: #bbb;  /* Essential */
    padding: 20px; /* Arbritrary */
}
.text {
    overflow: hidden;  /* Essential */
    /*text-overflow: ellipsis; Not needed */
    line-height: 16px;  /* Essential */
    max-height: 48px; /* Multiples of line-height */
}
.ellipsis {
    position: absolute;/* Relies on relative container */
    bottom: 20px; /* Matches container padding */
    right: 20px; /* Matches container padding */
    height: 16px; /* Matches line height */
    width: 30px; /* Arbritrary */
    background-color: inherit; /* Essential...or specify a color */
    padding-left: 8px; /* Arbritrary */
}
<div class="container">
    <div class="text">
        Lorem ipsum dolor sit amet, consectetur eu in adipiscing elit. Aliquam consectetur venenatis blandit. Praesent vehicula, libero non pretium vulputate, lacus arcu facilisis lectus, sed feugiat tellus nulla eu dolor. Nulla porta bibendum lectus quis euismod. Aliquam volutpat ultricies porttitor. Cras risus nisi, accumsan vel cursus ut, sollicitudin vitae dolor. Fusce scelerisque eleifend lectus in bibendum. Suspendisse lacinia egestas felis a volutpat. Aliquam volutpat ultricies porttitor. Cras risus nisi, accumsan vel cursus ut, sollicitudin vitae dolor. Fusce scelerisque eleifend lectus in bibendum. Suspendisse lacinia egestas felis a volutpat.
    </div>
    <div class="ellipsis">...</div>
</div>

Vui lòng kiểm tra đoạn trích cho một ví dụ trực tiếp.


2

Điều này tương tự với Alex nhưng thực hiện theo thời gian đăng nhập thay vì tuyến tính và lấy tham số maxHeight.

jQuery.fn.ellipsis = function(text, maxHeight) {
  var element = $(this);
  var characters = text.length;
  var step = text.length / 2;
  var newText = text;
  while (step > 0) {
    element.html(newText);
    if (element.outerHeight() <= maxHeight) {
      if (text.length == newText.length) {
        step = 0;
      } else {
        characters += step;
        newText = text.substring(0, characters);
      }
    } else {
      characters -= step;
      newText = newText.substring(0, characters);
    }
    step = parseInt(step / 2);
  }
  if (text.length > newText.length) {
    element.html(newText + "...");
    while (element.outerHeight() > maxHeight && newText.length >= 1) {
      newText = newText.substring(0, newText.length - 1);
      element.html(newText + "...");
    }
  }
};


1

Tôi viết lại chức năng của Alex để sử dụng cho thư viện MooTools. Tôi đã thay đổi nó một chút để nhảy từ hơn là thêm dấu chấm lửng ở giữa một từ.

Element.implement({
ellipsis: function() {
    if(this.getStyle("overflow") == "hidden") {
        var text = this.get('html');
        var multiline = this.hasClass('multiline');
        var t = this.clone()
            .setStyle('display', 'none')
            .setStyle('position', 'absolute')
            .setStyle('overflow', 'visible')
            .setStyle('width', multiline ? this.getSize().x : 'auto')
            .setStyle('height', multiline ? 'auto' : this.getSize().y)
            .inject(this, 'after');

        function height() { return t.measure(t.getSize).y > this.getSize().y; };
        function width() { return t.measure(t.getSize().x > this.getSize().x; };

        var func = multiline ? height.bind(this) : width.bind(this);

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

        this.set('html', t.get('html'));
        t.dispose();
    }
}
});

1

Tôi không thể tìm thấy một tập lệnh hoạt động chính xác như tôi muốn, vì vậy tôi cũng đã có một đoạn mã riêng cho jQuery - khá nhiều tùy chọn để thiết lập thêm theo cách của họ :)

https://github.com/rmorse/AutoEllipsis


1

Tôi đã hơi ngạc nhiên bởi hành vi của css mặc dù.

var cssEllipsis = 
{   "width": "100%","display": "inline-block", 
"vertical-align": "middle", "white-space": "nowrap", 
"overflow": "hidden", "text-overflow": "ellipsis" 
};

Trừ khi tôi cung cấp chiều rộng cho điều khiển mà tôi cần để liên kết dấu chấm lửng không hỗ trợ cho nguyên nhân của tôi. Là chiều rộng một tài sản phải được thêm vào ??? Hãy đặt suy nghĩ của bạn.


1

HÃY SỬ DỤNG ELLIPSIS CHỈ CSS

<html>
<head>
<style type="text/css">
#ellipsisdiv {
    width:200px;
    white-space: nowrap;  
    overflow: hidden;  
    text-overflow: ellipsis;  
}  
</style>
</head>
<body>
<div id="ellipsisdiv">
This content is more than 200px and see how the the ellipsis comes at the end when the content width exceeds the div width.
</div>
</body>
</html>

* Mã này hoạt động trên hầu hết các trình duyệt hiện tại. Nếu bạn gặp bất kỳ vấn đề nào với Opera và IE (có thể bạn sẽ không gặp phải), hãy thêm những vấn đề này theo kiểu:

-o-text-overflow: ellipsis;  
-ms-text-overflow: ellipsis;

* Tính năng này là một phần của CSS3. Cú pháp đầy đủ của nó là:

text-overflow: clip|ellipsis|string;

1

Dưới đây là một thư viện tiện ích / plugin đẹp mắt có dấu chấm lửng được tích hợp sẵn: http://www.codeitbetter.co.uk/widgets/ellipsis/ Tất cả những gì bạn cần làm là tham khảo thư viện và gọi như sau:

<script type="text/javascript"> 
   $(document).ready(function () { 
      $(".ellipsis_10").Ellipsis({ 
         numberOfCharacters: 10, 
         showLessText: "less", 
         showMoreText: "more" 
      }); 
   }); 
</script> 
<div class="ellipsis_10"> 
   Some text here that's longer than 10 characters. 
</div>

1

bạn có thể làm điều này dễ dàng hơn nhiều chỉ với css, ví dụ: chế độ sass

.truncatedText {
   font-size: 0.875em;
   line-height: 1.2em;
   height: 2.4em; // 2 lines * line-height
   &:after {
      content: " ...";
   }
}

và bạn có dấu chấm lửng;)


0

Giống như @acSlater, tôi không thể tìm thấy thứ gì đó cho những gì tôi cần vì vậy tôi tự lăn. Chia sẻ trong trường hợp bất kỳ ai khác có thể sử dụng:

Phương pháp:
ellipsisIfNecessary(mystring,maxlength);
Sử dụng:
trimmedString = ellipsisIfNecessary(mystring,50);
Liên kết mã và demo: https://gist.github.com/cemerson/10368014

Hai chú thích: a) Mã này không kiểm tra kích thước thực của phần tử HTML. Bạn cần chỉ định một độ dài nhất định - có thể là chức năng cần thiết, nhưng thực sự không quan trọng để làm. b) Bạn chỉ cần thêm "..." vào cuối chuỗi. Có một dấu hiệu dấu chấm lửng "'" bạn có thể / nên sử dụng.
BlaM

Xin chào @BlaM - mã thực sự kiểm tra độ dài so với tham số maxlength. Nó làm việc cho tôi ít nhất. Điều đó nói rằng - đây chỉ là một lần khiêm tốn cho tình huống cụ thể của tôi. Vui lòng sử dụng bất kỳ giải pháp nào ở trên nếu giải pháp này không phù hợp với tình huống của bạn.
Christopher D. Emerson

Có, nó hoạt động với "chiều dài", nhưng không phải với "chiều rộng" (kích thước pixel).
BlaM

Ý tưởng thú vị - hãy thoải mái tạo một phiên bản cập nhật với sự hỗ trợ cho điều đó. Tôi không cần điều đó ngay bây giờ nhưng có thể hữu ích trong tương lai.
Christopher D. Emerson

0
<html>
<head>
    <!-- By Warren E. Downs, copyright 2016.  Based loosely on a single/multiline JQuery using example by Alex,
    but optimized to avoid JQuery, to use binary search, to use CSS text-overflow: ellipsis for end,
    and adding marquee option as well.
    Credit: Marquee: http://jsfiddle.net/jonathansampson/xxuxd/
            JQuery version: http://stackoverflow.com/questions/536814/insert-ellipsis-into-html-tag-if-content-too-wide
            (by Alex, http://stackoverflow.com/users/71953/alex)
            (Improved with Binary Search as suggested by StanleyH, http://stackoverflow.com/users/475848/stanleyh)
    -->
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
    <meta content="utf-8" http-equiv="encoding">
    <style>

        .single {
            overflow:hidden;
            white-space: nowrap;
            width: 10em;
            padding: 10px;
            margin: 0 auto;
            border: solid 1px blue;
        }

        .multiline {
            overflow: hidden;
            white-space: wrap;
            width: 10em;
            height: 4.5em;
            padding: 10px;
            margin: 0 auto;
            border: solid 1px blue;
        }

        .marquee {
            overflow: hidden;
            width: 40em;
            padding: 10px;
            margin: 0 auto;
            border: solid 1px blue;
        }

</style>
    <script>
        var _marqueeNumber=0;
        // mode=start,end,middle
        function clipText(text, len, mode) {
            if(!mode) { mode="end"; }
            else { mode=mode.toLowerCase(); }
            if(mode == "start") { return "&hellip;"+clipText(text,len,"_start"); }
            if(mode == "_start") { return text.substr(text.length - len); }
            if(mode == "middle") { 
                return clipText(text, len/2, "end") + clipText(text, len/2, "_start");
            }
            return text.substr(0, len) + "&hellip;";
        }

        function generateKeyframes(clsName, start, end) {
            var sec=5;
            var totalLen=parseFloat(start)-parseFloat(end);
            if(start.indexOf('em') > -1)      { sec=Math.round(totalLen/3); }
            else if(start.indexOf('px') > -1) { sec=Math.round(totalLen/42); }

            var style = document.createElement('style');
            style.type = 'text/css';
            style.innerHTML = 'body {}';
            document.getElementsByTagName('head')[0].appendChild(style);
            this.stylesheet = document.styleSheets[document.styleSheets.length-1];
            try {
                this.stylesheet.insertRule('.'+clsName+' {\n'+
                    '    animation: '+clsName+' '+sec+'s linear infinite;\n'+
                    '}\n', this.stylesheet.rules.length);
                this.stylesheet.insertRule('.'+clsName+':hover {\n'+
                    '    animation-play-state: paused\n'+
                    '}\n', this.stylesheet.rules.length);
                this.stylesheet.insertRule('@keyframes '+clsName+' {\n'+
                    '    0%   { text-indent: '+start+' }\n'+
                    '    100% { text-indent: '+end+' }\n'+
                    '}', this.stylesheet.rules.length);
            } catch (e) {
                console.log(e.message);
            }
        }

        function addClone(el, multiline, estyle) {
            if(!estyle) { 
                try { estyle=window.getComputedStyle(el); }
                catch(e) { return null; }
            }
            var t = el.cloneNode(true);
            var s=t.style;
            //s.display='none';
            s.visibility='hidden'; // WARNING: Infinite loop if this is not hidden (e.g. while testing)
            s.display='inline-block';
            s.background='black';
            s.color='white';
            s.position='absolute';
            s.left=0;
            s.top=0;
            s.overflow='visible';
            s.width=(multiline ? parseFloat(estyle.width) : 'auto');
            s.height=(multiline ? 'auto' : parseFloat(estyle.height));

            el.parentNode.insertBefore(t, el.nextSibling);

            return t;
        }
        function getTextWidth(el, multiline) {
            var t=addClone(el, multiline);
            if(!t) { return null; }
            var ts=window.getComputedStyle(t);
            var w=ts.width;
            if(multiline) {
                var es=window.getComputedStyle(el);
                var lines=Math.round(parseInt(ts.height)/parseInt(es.height))*2+0.5;
                w=w+'';
                var unit=''; // Extract unit
                for(var xa=0; xa<w.length; xa++) {
                    var c=w[xa];
                    if(c <= '0' || c >= '9') { unit=w.substr(xa-1); }
                }
                w=parseFloat(w);
                w*=lines; // Multiply by lines
                w+=unit; // Append unit again
            }
            t.parentNode.removeChild(t);
            return w;
        }

        // cls=class of element to ellipsize
        // mode=start,end,middle,marq (scrolling marquee instead of clip)
        function ellipsis(cls, mode) {
            mode=mode.toLowerCase();
            var elems=document.getElementsByClassName(cls);
            for(xa in elems) {
                var el=elems[xa];
                var multiline = el.className ? el.className.indexOf('multiline') > -1 : true;
                if(mode == "marq") {       
                    var w=getTextWidth(el, multiline);
                    if(!w) { continue; }
                    var mCls="dsmarquee"+(_marqueeNumber++);
                    var es=window.getComputedStyle(el);
                    generateKeyframes(mCls,es.width, '-'+w);
                    el.className+=" "+mCls; 
                    continue; 
                }
                if(mode == "end" && !multiline) { el.style.textOverflow="ellipsis"; continue; }
                var estyle=null;
                try { estyle=window.getComputedStyle(el); }
                catch(e) { continue; }
                if(estyle.overflow == "hidden") {
                    var text = el.innerHTML;
                    var t=addClone(el, multiline, estyle);

                    function height() {
                        var ts=window.getComputedStyle(t);
                        var es=window.getComputedStyle(el);
                        return parseFloat(ts.height) - parseFloat(es.height); 
                    }
                    function width() { 
                        var ts=window.getComputedStyle(t);
                        var es=window.getComputedStyle(el);
                        return parseFloat(ts.width) - parseFloat(es.width); 
                    }

                    var tooLong = multiline ? height : width;

                    var len=text.length;
                    var diff=1;
                    var olen=0;
                    var jump=len/2;
                    while (len > 0) {
                        var diff=tooLong();
                        if(diff > 0) { len-=jump; jump/=2; }
                        else if(diff < 0) { len+=jump; }
                        len=Math.round(len);
                        //alert('len='+len+';olen='+olen+';diff='+diff+';jump='+jump+';t='+JSON.stringify(t.innerHTML));
                        t.innerHTML=clipText(text, len, mode);
                        if(olen == len) { break; }
                        olen=len;
                    }
                    el.innerHTML=t.innerHTML;
                    t.parentNode.removeChild(t);
                }           
                //break;
                t.style.visibility='hidden';
            }
        }

        function testHarness() {
            ellipsis('ellipsis1', 'start'); 
            ellipsis('ellipsis2', 'end'); 
            ellipsis('ellipsis3', 'middle'); 
            ellipsis('marquee', 'marq')
        }
    </script>
    </head>
    <body onload="testHarness()">
    <div class="single ellipsis1" style="float:left">some long text that should be clipped left</div>
    <div class="single ellipsis2" style="float:right">right clip long text that should be clipped</div>
    <div class="single ellipsis3" style="float:center">some long text that should be clipped in the middle</div>

    <br />

    <p class="single marquee">Windows 8 and Windows RT are focused on your lifeyour friends and family, your apps, and your stuff. With new things like the <a href="http://windows.microsoft.com/en-US/windows-8/start-screen">Start screen</a>, <a href="http://windows.microsoft.com/en-US/windows-8/charms">charms</a>, and a <a href="http://windows.microsoft.com/en-US/windows-8/microsoft-account">Microsoft account</a>, you can spend less time searching and more time doing.</p>
    &nbsp;

    <br />

    <div class="multiline ellipsis1" style="float:left">Test test test test test test, some more long text, such as asdasdasdasdasd, that should be multiline clipped left(*)</div>

    <div class="multiline ellipsis2" style="float:right">right clip multiline long text, such as Test test test test test test, and some more long text that should be multiline clipped right.</div>

    <div class="multiline ellipsis3" style="float:center">Test test test test test test, some more long text, such as asdasdasdasdasd, that should be multiline clipped in the middle(*)</div>

    <br />

    <p class="multiline marquee">Multiline Marquee: Windows 8 and Windows RT are focused on your lifeyour friends and family, your apps, and your stuff. With new things like the <a href="http://windows.microsoft.com/en-US/windows-8/start-screen">Start screen</a>, <a href="http://windows.microsoft.com/en-US/windows-8/charms">charms</a>, and a <a href="http://windows.microsoft.com/en-US/windows-8/microsoft-account">Microsoft account</a>, you can spend less time searching and more time doing.</p>
    &nbsp;

    </body>
</html>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.