এইচটিএমএল ট্যাগে উপবৃত্তাকার (…) contentোকান যদি সামগ্রী খুব প্রশস্ত থাকে


148

আমার কাছে একটি ইলাস্টিক লেআউট সহ একটি ওয়েবপৃষ্ঠা রয়েছে যা ব্রাউজার উইন্ডোটিকে পুনরায় আকার দেওয়া হলে এর প্রস্থ পরিবর্তন করে।

এই বিন্যাসে শিরোনামগুলি রয়েছে ( h2) যার একটি পরিবর্তনশীল দৈর্ঘ্য হবে (আসলে আমার ব্লগপোস্টগুলির শিরোনাম হ'ল যেগুলি আমার নিয়ন্ত্রণে নেই)। বর্তমানে - যদি তারা জানালার চেয়ে প্রশস্ত হয় - তবে সেগুলি দুটি লাইনে বিভক্ত।

এখানে কি একটি মার্জিত, পরীক্ষিত (ক্রস ব্রাউজার) সমাধান রয়েছে - উদাহরণস্বরূপ jQuery সহ - যা সেই শিরোনাম ট্যাগটির অভ্যন্তরীণ এইচটিএমএলকে সংক্ষিপ্ত করে এবং "..." যোগ করে যদি বর্তমান স্ক্রিনে পাঠ্যটি একটি লাইনে ফিট না করে থাকে তবে / ... ধারক প্রস্থ?



আমি এই থ্রেডের উপর ভিত্তি করে প্লাগইন তৈরি করেছি যা পাঠ্য ফর্ম্যাট করতে CSS বৈশিষ্ট্য সাদা-স্থান এবং শব্দ-মোড়ানো ব্যবহার করে। github.com/nothrem/jQuerySmartEllipsis
রাদেক পেচ

উত্তর:


119

আমি একক এবং মাল্টলাইন পাঠ্য সহ এফএফ 3, সাফারি এবং আই 6 + এ কাজ করার একটি সমাধান পেয়েছি

.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
ভাল, আমি একাধিক লাইনের সাথে ওভারফ্লো কীভাবে পরিচালনা করব তা দেখছিলাম। একটি উন্নতি: তিনটি পিরিয়ড যুক্ত করার পরিবর্তে উপবৃত্তাকার অক্ষর যুক্ত করুন, '…'।
সাইমন লাইশকে

4
এটি খুব ভাল কাজ করে। আপনার এটি jQuery সাইটে প্রকাশ করা উচিত।
এডগার

1
যদিও IE তে যদি এলিপসিস ফাংশনটি একটি ডিভের সাথে প্রয়োগ করা হয় যা স্রেফ একটি লিঙ্ক রয়েছে তবে উপবৃত্তির পরে লিঙ্কটি অদৃশ্য হয়ে যায়। এটির কোন পয়েন্টার?
চ্যান্টজ

6
আপনি কর্ম এই দেখতে চাই, তাহলে আপনি এটি এখানে দেখতে পারেন (দুঃখিত বাতিকগ্রস্ত প্লাগইন কোডের উপর বিন্যাস জন্য) jsfiddle.net/danesparza/TF6Rb/1
ড্যান মধ্যে Esparza

22
কর্মক্ষমতা উন্নত করতে, "যখন" লুপটিতে একবারে 1 টি অক্ষর মুছে ফেলার পরিবর্তে বাইনারি অনুসন্ধান করুন। যদি পাঠের 100% মানানসই না হয় তবে 50% পাঠ্যের চেষ্টা করুন; তারপর যদি 50% মাপসই টেক্সট যদি 50% তড়কা 75%, বা 25% না, ইত্যাদি
StanleyH

182

ফায়ারফক্স .0.০ ব্যতীত লেখার জন্য http://www.caniuse.com এ তালিকাভুক্ত সমস্ত ব্রাউজারের সাথে একটি একক লাইনে পাঠ্য কেটে দেওয়ার জন্য নিম্নলিখিত সিএসএসের সমাধানটি সমাধান করে । নোট করুন জাভাস্ক্রিপ্ট সম্পূর্ণ অপ্রয়োজনীয় যদি না আপনি ফায়ারফক্সের মাল্টলাইন পাঠ্য বা পূর্ববর্তী সংস্করণগুলিকে মোড়ানো সমর্থন করতে পারেন।

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

ফায়ারফক্সের পূর্ববর্তী সংস্করণগুলির জন্য আপনার যদি সমর্থন প্রয়োজন হয় তবে এই উত্তরটিতে আমার উত্তরটি দেখুন


2
এটি দ্রুততার পরে জিকুয়েরি পদ্ধতির ক্রমগুলির অর্ডার। আই 7 + এবং ক্রোমে দুর্দান্ত কাজ করে।
জেডিবি এখনও মনিকা

3
এটি প্রাচীন ব্রাউজারগুলিতেও ভাল কাজ করে। আমরা ২০০৪ সালে গুগলে এটি সফলভাবে ব্যবহার করছিলাম, যেখানে আমাদের কিছু সত্যিকারের কর্নার-কেস ব্রাউজারগুলিতে কৃপণভাবে সমর্থন বা অবজ্ঞার প্রয়োজন হয়েছিল।
এলবেল

2
যারা ব্রাউজারে এটি নমুনা করতে চান তাদের জন্য জেএস ফিডল - jsfiddle.net/r39 বিজ্ঞাপন
দীপক বাল

@ দিলিপরাজকুমার আপনাকে আরও বিশদ সরবরাহ করতে হবে যেমন একটি জেএসফিডাল উদাহরণ এটি 8 এর মধ্যে কাজ করছে না তা
বোঝায়

1
পছন্দ করুন যেখানে পাঠ্য কেটে ফেলা হয়েছে এটি উপাদান যুক্ত উপাদানগুলির প্রস্থ দ্বারা নির্ধারিত হয়, অর্থাত্ যখন এটি উপাদানটির প্রস্থকে উপচে ফেলে।
সাইমন লিয়েস্কে

40

নিম্নলিখিত কোডগুলি সহ আমি আরও কয়েকটি পোস্ট ব্যবহার করে এই কোডটি তৈরি করেছি:

  1. এটি ঠিক সঠিক পাঠ্যের দৈর্ঘ্য সন্ধান করতে একটি বাইনারি অনুসন্ধান ব্যবহার করে।
  2. এটি এমন ক্ষেত্রে পরিচালনা করে যেখানে উপবৃত্ত উপাদান (গুলি) প্রথমে একটি শট শো ইভেন্ট স্থাপন করে লুকানো থাকে যা আইটেমটি প্রথম প্রদর্শিত হওয়ার পরে উপবৃত্ত কোডটি পুনরায় চালায়। এটি মাস্টার-বিশদ দর্শন বা গাছের দর্শনগুলির জন্য কার্যকর যেখানে কিছু আইটেম প্রাথমিকভাবে প্রদর্শিত হয় না।
  3. এটি overচ্ছিকভাবে একটি হোভারওর প্রভাবের জন্য মূল পাঠ্যের সাথে একটি শিরোনাম বৈশিষ্ট্য যুক্ত করে।
  4. যোগ করা হয়েছে display: blockশৈলী, তাই ধারন কাজ
  5. এটি 3 পিরিয়ডের পরিবর্তে উপবৃত্তাকার চরিত্রটি ব্যবহার করে।
  6. এটি .ellipsis বর্গ সহ যে কোনও কিছুর জন্য স্ক্রিপ্টটি স্বয়ংক্রিয়ভাবে চালিত করে

সিএসএস:

.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
সুন্দর। বাইনারি অনুসন্ধানের আমার পরামর্শ বাস্তবায়নের জন্য ব্র্যাভো।
স্ট্যানলিএইচ

2
কেবলমাত্র একটি দ্রুত নোট ... এটি টেম্প্লেমেন্ট ভারে .css ('সর্বাধিক প্রস্থ', 'কিছুই নয়') যুক্ত করার মতো ... এইভাবে আপনি আপনার সিএসএসে সর্বাধিক প্রস্থের ঘোষণাটি ব্যবহার করতে পারবেন, প্লাগইনটিকে আরও নমনীয় করে তুলবে making (আমার কাছে কমপক্ষে বেশিরভাগ ব্যবহারের ক্ষেত্রে) যাইহোক ভাল কাজ। :)
গর্ডার

3
এটি উপরোক্ত গৃহীত উত্তরের চেয়ে অনেক দ্রুত বাস্তবায়ন। আপনার যদি একাধিক .ellipsis উপাদান থাকে এবং সেগুলি দিয়ে ডায়নামিক কিছু করে থাকেন তবে এটি একটি আরও ভাল সম্পাদন করে।
mjvotaw

আপনি একটি উদাহরণ প্রদান করতে পারেন? : আমার প্রশ্ন এখানে stackoverflow.com/questions/26344520/...
SearchForKnowledge

বাইনারি অনুসন্ধান অগ্রাধিকারযোগ্য তবে খুব ছোট ডেটাসেটের সাথে নয় এবং এই ক্ষেত্রে এটি সরাসরি
সূচিযুক্ত

20

আমার উত্তরটি কেবল একক লাইনের পাঠ্যকে সমর্থন করে। মাল্টি-লাইনের কাঁটাচামচের জন্য নীচে গুলফ্লামের মন্তব্য দেখুন, এটি বেশ আশাব্যঞ্জক বলে মনে হচ্ছে।

আমি প্রথম উত্তরটি থেকে কয়েকবার কোডটি পুনরায় লিখেছি এবং আমি মনে করি এটি দ্রুত হওয়া উচিত।

এটি প্রথমে একটি "আনুমানিক" পাঠ্য দৈর্ঘ্য খুঁজে পায় এবং তারপরে প্রস্থটি সঠিক না হওয়া পর্যন্ত একটি অক্ষর যুক্ত বা সরিয়ে দেয়।

এটি ব্যবহার করে যুক্তিটি নীচে দেখানো হয়েছে:

এখানে চিত্র বর্ণনা লিখুন

একটি "আনুমানিক" পাঠ্য দৈর্ঘ্য সন্ধানের পরে, পছন্দসই প্রস্থ পৌঁছানো অবধি অক্ষরগুলি যুক্ত বা সরিয়ে ফেলা হবে।

আমি নিশ্চিত যে এটির জন্য কিছু টুইট করা দরকার তবে কোডটি এখানে রয়েছে:

(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 :)
ফ্ল্যাটার

2
আমি টেক্সারিয়াস এবং মাল্টলাইনের ( উল্লম্ব) উপবৃত্তাকার কাণ্ডের জন্য সমর্থন যুক্ত করার জন্য এটি জোর দিয়েছি : jsfiddle.net/gfullam/j29z7381 (আমি আনুমানিক যুক্তির বিটিডব্লিউ পছন্দ করি)
গফুলাম

19

কেবলমাত্র 2013 এর মধ্যে আপনার এখানেই শেষ - এখানে আমি একটি খাঁটি সিএসএস পন্থা পেয়েছি: 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 সংশোধন করে বা এর কাঁটাচামচ ব্যবহার করে এটি অর্জন করতে পারেন ।
গফুল্লাম

18

সমস্ত ধরণের উপবৃত্তের পাঠ্য হ্যান্ডল করার জন্য আমি একটি দুর্দান্ত শীতল jQuery প্লাগইন তৈরি করেছি যার নাম থ্রিডটস @ http://tpgblog.com/threedots

এটি সিএসএসের পদ্ধতির চেয়ে অনেক বেশি নমনীয়, এবং আরও অনেক উন্নত, কাস্টমাইজযোগ্য আচরণ এবং মিথস্ক্রিয়াকে সমর্থন করে।

উপভোগ করুন।


8

একটি আরও নমনীয় jQuery প্লাগইন আপনাকে উপবৃত্তির পরে একটি উপাদান রাখতে সক্ষম করে (উদাহরণস্বরূপ "আরও পড়ুন" বোতাম) এবং উইন্ডোআরসিজে আপডেট করুন। এটি মার্কআপ সহ পাঠ্যের চারপাশেও কাজ করে:

http://dotdotdot.frebsite.nl


আমি এই প্লাগইনটি কেবল পরীক্ষা করেছি, তবে আমি এটি কার্যকর করতে পারিনি couldn't ট্রাঙ্ক 8 আমার জন্য আরও ভাল পছন্দ ছিল।
গিলহার্ম গার্নিয়ার 21

8

ট্রাঙ্ক 8 জিকুয়ারি প্লাগইন একাধিক লাইন সমর্থন করে এবং কাটা প্রত্যয়টির জন্য কেবল উপবৃত্তাকার অক্ষর নয়, যে কোনও এইচটিএমএল ব্যবহার করতে পারে: https://github.com/rviscomi/trunk8

ডেমো এখানে: http://jrvis.com/trunk8/


হ্যাঁ তবে এটি এখন প্রাচীন। দেখে মনে হচ্ছে এটি সমর্থিত নয়?
ব্যবহারকারী 2513846

1
দেখে মনে হচ্ছে এটি সক্রিয়ভাবে সমর্থিত - লেখার সময় (মার্চ ২০১)), সমস্যাগুলি এবং জনগণ প্রকল্প স্রষ্টাকে জড়িত সাম্প্রতিক ক্রিয়াকলাপ দেখায়।
এলিয়ট

5

বাস্তবে এমন কোনো একটি চমত্কার সহজবোধ্য উপায় CSS এ এই কাজ সত্য যে ইন্টারনেট অ মান ও মুক্তিযোদ্ধা সমর্থন সঙ্গে এই প্রসারিত শোষণ:after

আপনি এটিও করতে পারেন জাতীয় এই কাজটি যদি আপনি লক্ষ্য scrollWidth পরিদর্শন এবং এটি বাবা তা তুলনা করে ইচ্ছুক প্রস্থ, কিন্তু এই প্রোগ্রামটিতে এই কম জোরালো হয়।

সম্পাদনা: এটি দৃশ্যত আমার ধারণা থেকে আরও উন্নত। CSS3 সমর্থন শীঘ্রই উপস্থিত হতে পারে এবং আপনার চেষ্টা করার জন্য কিছু অসম্পূর্ণ এক্সটেনশন উপলব্ধ available

যে শেষটি ভাল পড়া।


আসলে আমি জেএস সমাধানটিকেই পছন্দ করি - কারণ এটি কেবল "..." যুক্ত করে যদি পাঠ্যটি উপলব্ধ জায়গার চেয়ে প্রশস্ত হয়।
14-18

3

আমি সম্প্রতি একটি ক্লায়েন্টের জন্য অনুরূপ কিছু করেছি। আমি তাদের জন্য যা করেছি তার একটি সংস্করণ এখানে রয়েছে (উদাহরণটি উইন ভিস্টায় সর্বশেষতম ব্রাউজার সংস্করণে পরীক্ষিত)। বোর্ডের চারপাশে নিখুঁত নয়, তবে খুব সহজেই টুইট করা যেতে পারে।

ডেমো: 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> কে দুটি লাইনে বিভক্ত হওয়া থেকে বিরত রাখবে এই বিএসএসের বিটটি যুক্ত করা হবে:

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

আমি এটিকে আরও কিছু চিন্তা দিয়েছিলাম এবং আমি এই সমাধানটি নিয়ে এসেছি, আপনাকে আপনার এইচ 2 ট্যাগের পাঠ্য বিষয়বস্তু অন্য একটি ট্যাগের (যেমন একটি স্প্যান) দিয়ে মুড়ে ফেলতে হবে (অথবা বিকল্পভাবে প্রদত্ত উচ্চতাযুক্ত কোনও জিনিস দিয়ে 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;
                }
            }
        }
    }

আসলে আমি এটি একটি সম্ভাব্য সমাধানের ভিত্তি হিসাবে ব্যবহার করার বিষয়ে ভেবেছিলাম, তবে - এই ভিত্তিতে - পুরো লেখাটি এখন প্রদর্শিত হয়েছে বা আমার এটি সংক্ষিপ্ত করে সংযোজন করতে হবে কিনা তা খুঁজে পাওয়া সম্ভব হবে কিনা " ... "। এটি কেটে ফেললে অদ্ভুত লাগবে।
ব্লেম

3

এখানে আরও একটি জাভাস্ক্রিপ্ট সমাধান রয়েছে। খুব ভাল এবং খুব দ্রুত কাজ করে।

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

উইন্ডোজ এবং ম্যাকের ক্রোম, এফএফ, আইই পরীক্ষিত।


যদিও এটি কম স্বয়ংক্রিয়, আমি এটি অ্যাডাম টেগেনের উত্তরের চেয়ে আরও সঠিক সমাধান বলে মনে করেছি । এই স্ক্রিপ্টটির প্রয়োজন অনুমানের পরিবর্তে সর্বাধিক সংখ্যক পাঠ্য রেখা নির্দিষ্ট করা উচিত।
ডোনাট

3

খাঁটি সিএসএস সহ মাল্টি-লাইন পাঠ্যের একটি সমাধান রয়েছে। এটি বলা হয় line-clamp, তবে এটি কেবল ওয়েবকিট ব্রাউজারগুলিতে কাজ করে। সমস্ত আধুনিক ব্রাউজারে এটি নকল করার একটি উপায় রয়েছে (আইই 8 এর চেয়ে সাম্প্রতিক সব কিছু)) এছাড়াও, এটি কেবলমাত্র শক্ত পটভূমিতে কাজ করবে কারণ শেষ লাইনের শেষ শব্দগুলি লুকানোর জন্য আপনার ব্যাকগ্রাউন্ড-চিত্রের প্রয়োজন। এটি কিভাবে যায় তা এখানে:

এইচটিএমএল দেওয়া হয়েছে:

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

সিএসএস এখানে:

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- বেসড_ব্রোজার্স.এফপি


এটি দুর্দান্ত, তবে আপনার অবশ্যই নিশ্চিত হওয়া দরকার যে আপনার পাঠ্যটি যথেষ্ট দীর্ঘ because বিটিডব্লিউ: একই উত্তর প্রায় এক মাস আগে অপোপি সরবরাহ করেছেন;)
ব্লেম

@ ব্ল্যাম প্রিটি অনেকটা সত্যই একই রকম। তবে আমি মনে করি গ্রেডিয়েন্ট ট্রিকটি পরিষ্কার এবং এসএএসএসের পরিবর্তে সিএসএসে এই কোডটি রয়েছে, তাই আমি মনে করি এটি পৃথক উত্তর হওয়ার উপযুক্ত।
জুলস কল

3

পাঠ্য সামগ্রীর জন্য খাঁটি সিএসএস মাল্টি-লাইন উপবৃত্তাকার:

.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

এটি অ্যালেক্সের অনুরূপ তবে লিনিয়ার পরিবর্তে লগ টাইমে এটি করে এবং একটি সর্বোচ্চ হাইট প্যারামিটার নেয়।

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

ডিভন গোভেটের একটি সহজ জিকুয়ের সমাধান রয়েছে :

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

ব্যবহার করতে, কেবল jQuery অবজেক্টে উপবৃত্তাকার () কল করুন। উদাহরণ স্বরূপ:

$ ( "বিঘত") ঊহ্য শব্দ ()।


আমি ঠিক একই লিঙ্কটি পোস্ট করতে চলেছিলাম। :)
গম্বো

এই পোস্টে লিঙ্কটি মারা গেছে।
জাস্টিন ট্যানার

আমি একটি
ফ্যালব্যাক

1

আমি 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

যদিও সিএসএসের আচরণ দেখে আমি কিছুটা অবাক হয়েছিলাম।

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

যদি না আমি এলিপিসিসকে আবদ্ধ করার জন্য যে নিয়ন্ত্রণটি প্রযোজনীয় করেছিলাম তার প্রস্থটি সরবরাহ না করে আমার কারণটি মনে করে না। প্রস্থটি কি যুক্ত করা দরকার? আপনার চিন্তাভাবনা রাখুন।


1

শুধুমাত্র সিএসএস ব্যবহার করে এললিপসিস করুন

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

* এই কোডটি বেশিরভাগ বর্তমান ব্রাউজারগুলিতে কাজ করে। আপনি যদি অপেরা এবং আইই (যা সম্ভবত আপনি করবেন না) নিয়ে কোনও সমস্যা অনুভব করেন তবে এগুলি স্টাইলে যুক্ত করুন:

-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

আপনি কেবল সিএসএস দিয়ে এটি আরও সহজ করতে পারেন, উদাহরণস্বরূপ: সাস মোড

.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

দুটি টিকা: ক) এই কোডটি এইচটিএমএল উপাদানটির আসল আকার পরীক্ষা করে না। আপনাকে একটি নির্দিষ্ট দৈর্ঘ্য নির্দিষ্ট করতে হবে - যা প্রয়োজনীয় কার্যকারিতা হতে পারে তবে এটি করার জন্য আসলে তুচ্ছ। খ) আপনি কেবল স্ট্রিংয়ের শেষে "..." যুক্ত করুন। একটি উপবৃত্ত চিহ্ন আছে "…" আপনি ব্যবহার করতে পারেন / করা উচিত।
ব্লেম

আরে @ ব্লেম - কোডটি সর্বোচ্চ দৈর্ঘ্যের প্যারামিটারের বিপরীতে দৈর্ঘ্যটি পরীক্ষা করে। এটি আমার পক্ষে কমপক্ষে কাজ করছে। এটি বলেছিল - এটি আমার বিশেষ পরিস্থিতির জন্য কেবল আমার নম্র এক-অফ। যদি এটি আপনার পরিস্থিতির জন্য সঠিকভাবে কাজ না করে তবে উপরের যে কোনও সমাধানটি নির্দ্বিধায় ব্যবহার করুন।
ক্রিস্টোফার ডি এমারসন

হ্যাঁ, এটি একটি "দৈর্ঘ্য" দিয়ে কাজ করে তবে "প্রস্থ" (পিক্সেল আকার) দিয়ে নয়।
14

আকর্ষণীয় ধারণা - তার জন্য একটি আপডেট সংস্করণ ডাব্লু / সমর্থন করতে নির্দ্বিধায়। আমার এখনকার দরকার নেই তবে ভবিষ্যতে কার্যকর হতে পারে।
ক্রিস্টোফার ডি এমারসন

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.