แทรกจุดไข่ปลา (... ) ลงในแท็ก HTML หากเนื้อหากว้างเกินไป


148

ฉันมีเว็บเพจที่มีเค้าโครงแบบยืดหยุ่นที่เปลี่ยนความกว้างของมันหากหน้าต่างเบราว์เซอร์ถูกปรับขนาด

ในเลย์เอาต์นี้มีพาดหัว ( h2) ที่จะมีความยาวแปรผัน (จริง ๆ แล้วเป็นพาดหัวจากบล็อกโพสต์ที่ฉันไม่สามารถควบคุมได้) ปัจจุบัน - ถ้ามันกว้างกว่าหน้าต่าง - มันแบ่งออกเป็นสองบรรทัด

มีวิธีการแก้ปัญหาที่สง่างามทดสอบ (เบราว์เซอร์ข้าม) - ตัวอย่างเช่นกับ jQuery - ซึ่งจะทำให้ shortHTML ของแท็กบรรทัดแรกนั้นสั้นลงและเพิ่ม "... " ถ้าข้อความกว้างเกินไปที่จะพอดีกับหนึ่งบรรทัดที่หน้าจอปัจจุบัน / ความกว้างตู้คอนเทนเนอร์?


1
คำตอบล่าสุดของการอัปเดต 2014: stackoverflow.com/a/22811590/759452
Adrien เป็น

ฉันสร้างปลั๊กอินตามเธรดนี้ที่ใช้คุณสมบัติ CSS white-space และ word-wrap เพื่อจัดรูปแบบข้อความ github.com/nothrem/jQuerySmartEllipsis
Radek Pech

คำตอบ:


119

ฉันมีวิธีแก้ปัญหาการทำงานใน FF3, Safari และ IE6 + ด้วยข้อความเดียวและหลายบรรทัด

.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
ดีฉันกำลังมองหาวิธีการจัดการกับหลายบรรทัดล้น การปรับปรุงหนึ่งอย่าง: แทนที่จะเพิ่มสามจุดต่อท้ายให้เพิ่มอักขระตัวรี "... "
467 Simon Lieschke

4
มันใช้งานได้ดีมาก คุณควรเผยแพร่สิ่งนี้ในเว็บไซต์ jQuery
Edgar

1
แม้ว่าใน IE หากฟังก์ชันจุดไข่ปลาถูกนำไปใช้กับ div ที่เพิ่งมีลิงค์ แต่หลังจากจุดไข่ปลาลิงค์จะหายไป ตัวชี้ใด ๆ เกี่ยวกับเรื่องนี้?
Chantz

6
หากคุณต้องการที่จะเห็นสิ่งนี้ในการทำงานคุณสามารถดูได้ที่นี่ (ขออภัยสำหรับการจัดรูปแบบสกรูใน
Dan Esparza

22
เพื่อปรับปรุงประสิทธิภาพให้ทำการค้นหาแบบไบนารีแทนการลบ 1 ตัวอักษรทีละตัวในลูป "while" หากข้อความ 100% ไม่พอดีลอง 50% ของข้อความ แล้ว 75% ของข้อความถ้าพอดี 50% หรือ 25% ถ้า 50% ไม่พอดีเป็นต้น
4251

182

วิธีแก้ปัญหา CSS ต่อไปนี้สำหรับการตัดข้อความในบรรทัดเดียวใช้ได้กับเบราว์เซอร์ทั้งหมดที่อยู่ในรายการhttp://www.caniuse.comตั้งแต่การเขียนยกเว้น Firefox 6.0 โปรดทราบว่า JavaScript นั้นไม่มีความจำเป็นอย่างสิ้นเชิงเว้นแต่คุณจะต้องสนับสนุนการตัดข้อความหลายบรรทัดหรือ Firefox รุ่นก่อนหน้า

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

หากคุณต้องการการสนับสนุนสำหรับเวอร์ชันก่อนหน้าของ Firefox ตรวจสอบคำตอบของฉันกับคำถามอื่น


2
นี่คือคำสั่งของขนาดเร็วกว่าวิธี jQuery ทำงานได้ดีใน IE7 + และ Chrome
JDB ยังคงจำโมนิก้าได้

3
เบราว์เซอร์โบราณนี้ใช้งานได้ดีเช่นกัน เราใช้ Google อย่างประสบความสำเร็จในปี 2004 ซึ่งเราจำเป็นต้องให้การสนับสนุนหรือลดระดับอย่างสง่างามบนเบราว์เซอร์แบบมุม
ElBel

2
JS Fiddle สำหรับผู้ที่ต้องการทดลองใช้บนเบราว์เซอร์ - jsfiddle.net/r39Ad
Deepak Bala

@DilipRajkumar คุณจะต้องให้รายละเอียดเพิ่มเติมเช่นตัวอย่างJSFiddle ที่แสดงว่าไม่ได้ทำงานใน IE 8
Simon Lieschke

1
@SharpCoder คุณทำไม่ได้ ตำแหน่งที่ข้อความถูกตัดออกถูกกำหนดโดยความกว้างขององค์ประกอบที่มีอยู่นั่นคือมันจะตัดทอนเมื่อมันล้นความกว้างขององค์ประกอบ
Simon Lieschke

40

ฉันสร้างรหัสนี้โดยใช้โพสต์อื่น ๆ จำนวนหนึ่งโดยมีการปรับปรุงดังต่อไปนี้:

  1. มันใช้การค้นหาแบบไบนารี่เพื่อค้นหาความยาวของข้อความที่ถูกต้อง
  2. มันจัดการกรณีที่องค์ประกอบ ellipsis ถูกซ่อนไว้ในตอนแรกโดยการตั้งค่าเหตุการณ์การแสดงครั้งเดียวที่เรียกใช้รหัส ellipsis อีกครั้งเมื่อรายการถูกแสดงครั้งแรก สิ่งนี้มีประโยชน์สำหรับมุมมองรายละเอียดหลักหรือมุมมองต้นไม้ที่บางรายการไม่แสดงในตอนแรก
  3. มันเป็นทางเลือกที่จะเพิ่มคุณสมบัติชื่อเรื่องพร้อมข้อความต้นฉบับสำหรับผลการเลื่อนเมาส์
  4. เพิ่มเข้าdisplay: blockกับสไตล์ดังนั้นจึงใช้ได้
  5. มันใช้อักขระจุดไข่ปลาแทน 3 จุด
  6. มันจะเรียกใช้สคริปต์อัตโนมัติสำหรับทุกสิ่งที่มีคลาส. 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
สวย. ไชโยสำหรับการดำเนินการตามคำแนะนำของฉันของการค้นหาแบบไบนารี
StanleyH

2
เพียงโน้ตสั้น ๆ ... มันคุ้มค่าที่จะเพิ่ม. css ('ความกว้างสูงสุด', 'ไม่') ไปยัง tempElement var ... วิธีนี้คุณสามารถใช้การประกาศความกว้างสูงสุดใน css ของคุณทำให้ปลั๊กอินมีความยืดหยุ่นมากขึ้น (อย่างน้อยสำหรับกรณีการใช้งานส่วนใหญ่ที่ฉันมี) ทำงานได้ดีอยู่แล้ว :)
gordyr

3
นี่เป็นการดำเนินการที่รวดเร็วกว่าคำตอบที่ยอมรับข้างต้น หากคุณมีองค์ประกอบหลายจุด
mjvotaw

คุณช่วยยกตัวอย่างได้ไหม คำถามของฉันอยู่ที่นี่: stackoverflow.com/questions/26344520/…
SearchForKnowledge

การค้นหาแบบไบนารี่เป็นที่นิยม แต่ไม่ใช่กับชุดข้อมูลที่มีขนาดเล็กมากและในกรณีนี้มันเป็นอุปสรรคต่อการทำงานเมื่อเปรียบเทียบกับการค้นหาแบบเส้นตรงเช่น indexOf () ... เห็นได้ชัด
user1360809

20

คำตอบของฉันรองรับข้อความบรรทัดเดียวเท่านั้น ตรวจสอบความคิดเห็นของ gfullam ด้านล่างสำหรับส้อมหลายคู่สายดูดีมาก

ฉันเขียนโค้ดใหม่จากคำตอบแรกสองสามครั้งและฉันคิดว่านี่น่าจะเร็วที่สุด

โดยจะค้นหาความยาวข้อความ "โดยประมาณ" ก่อนจากนั้นเพิ่มหรือลบอักขระจนกว่าความกว้างจะถูกต้อง

ตรรกะที่ใช้มีดังต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากพบความยาวข้อความ "โดยประมาณ" อักขระจะถูกเพิ่มหรือลบจนกว่าจะถึงความกว้างที่ต้องการ

ฉันแน่ใจว่าต้องการ tweaking แต่นี่คือรหัส:

(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
วิธีแก้ปัญหาของคุณอาจไม่ดีที่สุด แต่ก็อธิบายได้ดีมาก และฉันชอบตรรกะการประมาณแบบนี้ +1 :)
Flater

2
ฉันได้แยกนี้เพื่อเพิ่มการรองรับ textareas และ multiline (แนวตั้ง) การตัดปลายไข่: jsfiddle.net/gfullam/j29z7381 (ฉันชอบตรรกะการประมาณ BTW)
gfullam

19

ในกรณีที่คุณจะจบลงที่นี่ในปี 2013 - นี่คือวิธี css บริสุทธิ์ที่ฉันพบที่นี่: http://css-tricks.com/snippets/css/truncate-string-with-ellipsis/

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

มันใช้งานได้ดี


1
FWIW text-overflowไม่ทำงานกับtextareaองค์ประกอบ (จนถึงปี 2015) หากคุณต้องการการสนับสนุนสำหรับtextareaคุณสามารถบรรลุได้โดยการปรับเปลี่ยนคำตอบที่ได้รับการยอมรับหรือโดยใช้ส้อมของมันนี้
gfullam

18

ฉันสร้างปลั๊กอิน jQuery ที่เจ๋งจริงๆสำหรับจัดการจุดไข่ปลาทุกรูปแบบเรียกว่า ThreeDots @ http://tpgblog.com/threedots

มีความยืดหยุ่นมากกว่าวิธี CSS และสนับสนุนพฤติกรรมและการโต้ตอบขั้นสูงที่ปรับแต่งได้มากขึ้น

สนุก.


8

ปลั๊กอิน jQuery ที่ยืดหยุ่นมากขึ้นช่วยให้คุณสามารถเก็บองค์ประกอบไว้หลังจุดไข่ปลา (เช่นปุ่ม "อ่านเพิ่มเติม") และอัปเดต onWindowResize นอกจากนี้ยังทำงานกับข้อความด้วยมาร์กอัป:

http://dotdotdot.frebsite.nl


ฉันเพิ่งทดสอบปลั๊กอินนี้ แต่ไม่สามารถใช้งานได้ Trunk8 เป็นตัวเลือกที่ดีกว่าสำหรับฉัน
Guilherme Garnier

8

trunk8 jQuery plugin รองรับหลายบรรทัดและสามารถใช้ html ใด ๆ ก็ได้ไม่ใช่แค่ตัวอักษรจุดไข่ปลาสำหรับส่วนต่อท้ายที่ถูกตัดทอน: https://github.com/rviscomi/trunk8

ตัวอย่างที่นี่: http://jrvis.com/trunk8/


ใช่ แต่ตอนนี้เป็นโบราณแล้ว ดูเหมือนว่ามันไม่รองรับ?
user2513846

1
ดูเหมือนว่าจะได้รับการสนับสนุนอย่างแข็งขันในขณะที่เขียน (มีนาคม 2016) ปัญหาและการประชาสัมพันธ์แสดงกิจกรรมล่าสุดที่เกี่ยวข้องกับผู้สร้างโครงการ
Eliot Sykes

5

จริงๆแล้วมันมีวิธีที่ตรงไปตรงมาในการใช้CSS ในการใช้ประโยชน์จากข้อเท็จจริงที่ว่า IE ขยายขอบเขตนี้ด้วยมาตรฐานที่ไม่เป็นมาตรฐานและรองรับ FF:after

คุณสามารถทำสิ่งนี้ได้ใน JSหากคุณต้องการโดยตรวจสอบ scrollWidth ของเป้าหมายและเปรียบเทียบกับความกว้างของพาเรนต์ แต่ก็มีประสิทธิภาพน้อยกว่า

แก้ไข: เห็นได้ชัดว่ามีการพัฒนามากกว่าที่ฉันคิด อาจมีการสนับสนุน CSS3 ในไม่ช้าและมีส่วนขยายที่ไม่สมบูรณ์พร้อมให้คุณทดลองใช้

อันสุดท้ายคือการอ่านที่ดี


จริงๆแล้วฉันชอบโซลูชัน JS - เพราะมันเพิ่ม "... " เฉพาะถ้าข้อความนั้นกว้างกว่าพื้นที่ว่าง
BlaM

3

ฉันเพิ่งทำสิ่งที่คล้ายกันสำหรับลูกค้าเมื่อเร็ว ๆ นี้ นี่คือรุ่นของสิ่งที่ฉันทำเพื่อพวกเขา (ตัวอย่างทดสอบในเบราว์เซอร์เวอร์ชันล่าสุดทั้งหมดบน Win Vista) ไม่สมบูรณ์แบบรอบ ๆ กระดาน แต่สามารถปรับแต่งได้อย่างง่ายดาย

การสาธิต: http://enobrev.info/ellipsis/

รหัส:

<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

โซลูชันง่ายๆอย่างหนึ่งที่ไม่ได้เพิ่ม "... " แต่ป้องกัน <h2> จากการเจาะเข้าไปในสองบรรทัดคือการเพิ่มบิต css นี้:

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 */
}

ฉันให้ความคิดเพิ่มขึ้นและฉันคิดวิธีแก้ปัญหานี้คุณต้องห่อเนื้อหาต้นฉบับเดิมของแท็ก h2 ของคุณด้วยแท็กอื่น (เช่นสแปน) (หรืออีกทางเลือกห่อ h2s ด้วยความสูงที่กำหนด) แล้ว คุณสามารถใช้จาวาสคริปต์ประเภทนี้เพื่อกรองคำที่ไม่ต้องการออก:

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

จริง ๆ แล้วฉันคิดว่าการใช้สิ่งนี้เป็นพื้นฐานสำหรับการแก้ปัญหาที่เป็นไปได้ แต่ฉันไม่รู้ว่า - จากสิ่งนี้ - มันเป็นไปได้ที่จะทราบว่าหากข้อความทั้งหมดปรากฏขึ้นในขณะนี้หรือถ้าฉันต้องย่อให้สั้นลงและเพิ่ม " ... " เพียงแค่ตัดมันออกจะดูแปลก ๆ
BlaM

3

นี่คือโซลูชัน JavaScript อื่น ทำงานได้ดีมากและเร็วมาก

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

ทดสอบบน Chrome, FF, IE บน Windows และ Mac


ขณะนี้เป็นไปโดยอัตโนมัติน้อยผมพบว่ามันจะเป็นทางออกที่ถูกต้องมากขึ้นกว่าคำตอบอดัม Tegen ของ สคริปต์นี้ต้องการให้ระบุจำนวนบรรทัดสูงสุดของข้อความแทนการเดา
โดนัท

3

มีวิธีแก้ปัญหาสำหรับข้อความหลายบรรทัดพร้อม CSS บริสุทธิ์ มันถูกเรียกใช้line-clampแต่ใช้ได้กับเบราว์เซอร์ webkit เท่านั้น อย่างไรก็ตามมีวิธีการเลียนแบบสิ่งนี้ในเบราว์เซอร์ที่ทันสมัยทั้งหมด (ทุกอย่างที่ใหม่กว่า IE8) นอกจากนี้มันจะทำงานบนพื้นหลังที่เป็นของแข็งเพราะคุณต้องการภาพพื้นหลังเพื่อซ่อนคำสุดท้ายของบรรทัดสุดท้าย นี่คือวิธี:

รับ HTML นี้:

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

นี่คือ 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 เป็นภาพที่มีสีเดียวกันกับพื้นหลังของคุณซึ่งจะมีความกว้างประมาณ 100px และมีความสูงเท่ากับความสูงบรรทัดของคุณ

มันไม่ได้สวยมากเนื่องจากข้อความของคุณอาจถูกตัดกลางตัวอักษร แต่อาจมีประโยชน์ในบางกรณี

การอ้างอิง: http://www.css-101.org/articles/line-clamp/line-clamp_for_non_webkit-based_browsers.php


เยี่ยมมาก แต่คุณต้องแน่ใจว่าข้อความของคุณยาวพอเพราะ CSS นี้จะเพิ่ม "... " แม้ว่าข้อความจะสั้นพอให้พอดีกับพื้นที่ว่าง BTW: Apopii ให้คำตอบเดียวกันเมื่อประมาณหนึ่งเดือนที่ผ่านมา;)
BlaM

@BlaM สวยเหมือนกันแน่นอน แต่ฉันคิดว่าเคล็ดลับการไล่ระดับสีนั้นเรียบร้อยและรหัสนี้ใน CSS แทนที่จะเป็น SASS ดังนั้นฉันคิดว่ามันควรค่าที่จะเป็นคำตอบแยก
Jules Colle

3

CSS CSS หลายบรรทัดที่บริสุทธิ์สำหรับเนื้อหาข้อความ:

.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>

โปรดตรวจสอบข้อมูลโค้ดสำหรับตัวอย่างสด


2

สิ่งนี้คล้ายกับของ Alex แต่ใช้เวลาในการบันทึกแทนที่จะเป็นแบบเชิงเส้นและใช้พารามิเตอร์ 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 + "...");
    }
  }
};

2

มีวิธีแก้ปัญหา jQuery อย่างง่ายโดยDevon Govett :

https://gist.github.com/digulla/5796047

หากต้องการใช้เพียงเรียก ellipsis () บนวัตถุ jQuery ตัวอย่างเช่น:

$ ( "ช่วง") จุดไข่ปลา ().


ฉันเพิ่งจะโพสต์ลิงก์เดียวกัน :)
Gumbo

ลิงก์ในโพสต์นี้ตายแล้ว
Justin Tanner

ฉันเพิ่มลิงก์ทางเลือก
BlaM

1

ฉันเขียนฟังก์ชันของ Alex เพื่อใช้กับไลบรารี MooTools ฉันเปลี่ยนมันเป็นคำกระโดดเล็กน้อยแทนที่จะเพิ่มจุดไข่ปลาที่อยู่ตรงกลางของคำ

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

ฉันไม่พบสคริปต์ที่ทำงานตรงตามที่ฉันต้องการดังนั้นฉันจึงใช้ jQuery ด้วยตัวเอง - มีตัวเลือกไม่กี่ตัวที่จะตั้งค่าเพิ่มเติมในแบบของพวกเขา :)

https://github.com/rmorse/AutoEllipsis


1

ฉันรู้สึกประหลาดใจเล็กน้อยกับพฤติกรรมของ CSS

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

หากฉันไม่ได้กำหนดความกว้างให้กับตัวควบคุมที่ฉันต้องผูกไว้กับจุดไข่ปลาก็ไม่ได้เป็นสาเหตุของฉัน ความกว้างเป็นคุณสมบัติที่ต้องเพิ่มหรือไม่? กรุณาใส่ความคิดของคุณ


1

ทำ ELLIPSIS โดยใช้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>

* รหัสนี้ใช้ได้กับเบราว์เซอร์ส่วนใหญ่ในปัจจุบัน หากคุณประสบปัญหาใด ๆ กับ Opera และ IE (ซึ่งอาจเป็นไปได้ว่าคุณจะไม่) ให้เพิ่มสิ่งเหล่านี้ในสไตล์:

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

* คุณสมบัตินี้เป็นส่วนหนึ่งของ CSS3 ไวยากรณ์ที่สมบูรณ์ของมันคือ:

text-overflow: clip|ellipsis|string;

1

นี่คือวิดเจ็ต / ไลบรารี่ที่น่าสนใจซึ่งมีจุดไข่ปลาอยู่ในตัว: http://www.codeitbetter.co.uk/widgets/ellipsis/สิ่งที่คุณต้องทำคืออ้างอิงไลบรารีและเรียกสิ่งต่อไปนี้:

<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

คุณสามารถทำได้ง่ายขึ้นด้วย css เท่านั้นตัวอย่างเช่น: โหมด sass

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

และคุณมีจุดไข่ปลา;)


0

เช่นเดียวกับ @acSlater ฉันไม่สามารถหาสิ่งที่ฉันต้องการได้ดังนั้นฉันจึงม้วนตัวเอง การแบ่งปันในกรณีที่บุคคลอื่นสามารถใช้:

วิธี:
ellipsisIfNecessary(mystring,maxlength);
การใช้งาน:
trimmedString = ellipsisIfNecessary(mystring,50);
รหัสและลิงค์สาธิต: https://gist.github.com/cemerson/10368014

หมายเหตุประกอบสองรายการ: ก) โค้ดนี้ไม่ได้ตรวจสอบขนาดจริงขององค์ประกอบ HTML คุณต้องระบุความยาวที่กำหนด - ซึ่งอาจเป็นฟังก์ชั่นที่ต้องการ แต่จริง ๆ แล้วเป็นเรื่องเล็กน้อยที่จะทำ b) คุณเพิ่งเพิ่ม "... " ที่ส่วนท้ายของสตริง มีเครื่องหมายจุดไข่ปลา "... " ที่คุณสามารถ / ควรใช้
BlaM

เฮ้ @BlaM - รหัสจริงตรวจสอบความยาวกับพารามิเตอร์ maxlength มันทำงานให้ฉันอย่างน้อย ที่กล่าวว่า - นี่เป็นเพียงหนึ่งที่อ่อนน้อมถ่อมตนของฉันสำหรับสถานการณ์เฉพาะของฉัน อย่าลังเลที่จะใช้วิธีแก้ไขปัญหาข้างต้นหากวิธีนี้ใช้ไม่ได้กับสถานการณ์ของคุณ
Christopher D. Emerson

ใช่มันใช้งานได้กับ "ความยาว" แต่ไม่ใช่กับ "ความกว้าง" (ขนาดพิกเซล)
BlaM

แนวคิดที่น่าสนใจ - อย่าลังเลที่จะทำให้รุ่นที่อัปเดตด้วยการสนับสนุน ฉันไม่ต้องการตอนนี้ แต่อาจมีประโยชน์ในอนาคต
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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.