একটি খুব, খুব, খুব বড় ডিভ


109

আমার একটি প্রকল্পের জন্য ( বিগপিক্টু.রে বা বিগপিকচার.জেস গিটহাব প্রকল্প দেখুন ), আমাকে সম্ভাব্য একটি খুব, খুব বড় ধারকটির সাথে ডিল করতে হবে <div>

আমি জানতাম যে আমি ব্যবহার করি এমন সহজ পদ্ধতির সাথে দুর্বল পারফরম্যান্সের ঝুঁকি রয়েছে, তবে আমি এটি কেবলমাত্র Chrome ... এর সাথে উপস্থিত থাকার আশা করিনি!

আপনি যদি এই ছোট পৃষ্ঠাটি পরীক্ষা করেন (নীচের কোডটি দেখুন), প্যানিং (ক্লিক + টানুন) হবে:

  • ফায়ারফক্সে সাধারণ / মসৃণ
  • এমনকি ইন্টারনেট এক্সপ্লোরারে সাধারণ / মসৃণ
  • Chrome এ খুব ধীর (প্রায় ক্র্যাশিং)!

অবশ্যই, আমি এটি করতে কিছু কোড যুক্ত করতে পারি (আমার প্রজেক্টে) আপনি যখন অনেকটা জুম করবেন তখন খুব বড় ফন্টের আকারের টেক্সটটি লুকানো থাকবে। তবে তবুও, ফায়ারফক্স এবং ইন্টারনেট এক্সপ্লোরার ক্রম না করে কেন এটি সঠিকভাবে পরিচালনা করে?

জাভাস্ক্রিপ্ট, এইচটিএমএল, বা সিএসএসে কোনও ক্রিয়া রয়েছে যে প্রতিটি ক্রিয়াটির জন্য পুরো পৃষ্ঠাটি (যা এখানে 10000 পিক্সেল প্রশস্ত এখানে) পুরো রেন্ডার করার চেষ্টা করবেন না ? (কেবলমাত্র বর্তমান ভিউপোর্ট রেন্ডার করুন!)


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <style>
            html, body {
                overflow: hidden;
                min-height: 100%; }

            #container {
                position: absolute;
                min-height: 100%;
                min-width: 100%; }

            .text {
                font-family: "Arial";
                position: absolute;
            }
        </style>
    </head>

    <body>
        <div id="container">
            <div class="text" style="font-size: 600px; left:100px; top:100px">Small text</div>
            <div class="text" style="font-size: 600000px; left:10000px; top:10000px">Very big text</div>
        </div>

        <script>
            var container = document.getElementById('container'), dragging = false, previousmouse;
            container.x = 0; container.y = 0;

            window.onmousedown = function(e) { dragging = true; previousmouse = {x: e.pageX, y: e.pageY}; }

            window.onmouseup = function() { dragging = false; }

            window.ondragstart = function(e) { e.preventDefault(); }

            window.onmousemove = function(e) {
                if (dragging) {
                    container.x += e.pageX - previousmouse.x; container.y += e.pageY - previousmouse.y;
                    container.style.left = container.x + 'px'; container.style.top = container.y + 'px';
                    previousmouse = {x: e.pageX, y: e.pageY};
                }
            }
        </script>
    </body>
</html>

54
[ওটি] 600 কে ফন্টের আকার। খুব খারাপ চোখের দৃষ্টিশক্তিযুক্ত লোকের জন্য অবশ্যই অ্যাক্সেসযোগ্যতার বৈশিষ্ট্য হওয়া উচিত ? ;-)
geert3

61
@ জের্ট 3 আমি নিশ্চিত এটি চন্দ্র প্রদক্ষিণকারী ওয়েব ব্রাউজারের জন্য
ডেভিড উইলকিন্স

3
আপনার ডেমোটি ক্রোম 41.0.2236.0 ডিভ-এম-এ মসৃণ
পিয়ের-লুক

11
আমি ক্যানারি (41.0.2241.0 ক্যানারি) এবং আমি এখনও পিছিয়ে আছি। আপনার ছেলেরা এটি গেমিং
রগের

3
জনপ্রিয় বিশ্বাসের বিপরীতে, আইআই বেশিরভাগ পৃষ্ঠাগুলি রেন্ডার করার জন্য ক্রোমের চেয়ে আসলে দ্রুত। যদিও এর জাভাস্ক্রিপ্ট ইঞ্জিনটি কিছুটা ধীর।
ফালানওয়ে

উত্তর:


62

পরিবর্তনগুলি position: fixedজিনিসগুলিকে গতিময় বলে মনে হচ্ছে ।


27
এটি তার প্রশ্নের সরাসরি উত্তর নয়, তবে এটি তার প্রাথমিক সমস্যার (ক্রোমে ধীর সাড়া) সম্ভাব্য সমাধান। বাক্সের বাইরে ভাবনা উত্সাহিত করা উচিত, আইএমএইচও।
geert3

এখানে এটি নিখুঁতভাবে কাজ করছে বলে মনে হচ্ছে: gget.it/e0ubdh67/big-div-test_fixed.html । তুমি কি জানো কেন ? :)
বাসজ

2
আমি কেবল অনুমান করতে পারি fixedএগুলি স্পষ্টতই কম জটিল এবং সম্ভবত তারা আরও অনুকূলিতকরণ করতে পারে। তবে আমি যদি রেন্ডারিং ইঞ্জিন উত্স
কোডটির

1
এই উত্তর, এবং ভিলিয়াসএল সরবরাহ করেছেন, উভয়েরই আলাদা লোকের দ্বারা একই "মন্তব্য করুন" মন্তব্য রয়েছে। কিভাবে শীতল হয়?
জো

2
@ জো এগুলি মডারেটরদের দ্বারা ব্যবহারের জন্য স্ট্যাকওভারফ্লো সরবরাহকৃত স্ট্যান্ডার্ড উত্তরের সেট থেকে। কিছু যদিও আরও পরিমিতভাবে মাঝারি করা প্রয়োজন।
geert3

42

এর transformপরিবর্তে ব্যবহার করুন top/left:

container.style.transform = 'translate(' + container.x + 'px, ' + container.y + 'px)';

জেএসফিডেলে একটি লাইভ ডেমো


2
একটি খুব আশ্চর্যের জিনিস: আপনার জেএসফিডেলে এটি ক্রোমের সাথে সত্যই দ্রুত। আপনি এখানে আমার মূল কোডটিতে প্রস্তাব করেছিলেন ঠিক সেই পরিবর্তনটি করেছিলাম: gget.it/1owxq8kr/big-div-test_transfor.html , এবং এই শেষ লিঙ্কটি ক্রোমে ধীর :( এটি কীভাবে সম্ভব? এটি আপনার জেএসফিডেলের মতোই দেখাচ্ছে [দ্রষ্টব্য: অলৌকিকভাবে, গিয়ার 3 এর উত্তরগুলি কাজ করে বলে মনে হচ্ছে, আমি জানি না তবে এটি কেন কাজ করে: gget.it/e0ubdh67/big-div-test_fixed.html]
বাসজ

@ বাসজ সম্ভবত এটির সংস্করণ নির্ভর, আমার ক্রোম (39.0.2171.71 মি) আপনার মন্তব্যে লিঙ্কযুক্ত পৃষ্ঠাটিকে এফএফ হিসাবে মসৃণ এবং দ্রুততর করে। যাইহোক, অবস্থান নির্ধারণের fixedজন্য উপাদানটি পাঠ্য-প্রবাহের বাইরে নিয়ে যায় এবং প্রচুর পুনরায় রেন্ডারিং করে। transformএমডিএন এর ডকুমেন্টেশনে বলা হয়েছে: "... একটি স্ট্যাকিং প্রসঙ্গ তৈরি করা হবে that সেক্ষেত্রে বস্তুটি অবস্থানের জন্য একটি সমন্বিত ব্লক হিসাবে কাজ করবে: এটিতে থাকা নির্দিষ্ট উপাদানসমূহ।"
টিমু

2
আজব, আমার কাছে ক্রোম 39.0.2171.71 মিটারও ... এবং gget.it/1owxq8kr/big-div-test_transform.html প্যানগুলি আমার আসল সংস্করণ হিসাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে রয়েছে (প্রশ্নে নিজেই)। ওহহ সম্ভবত এটি হার্ডওয়্যার ত্বরণের উপর নির্ভর করে: আমার কাছে সম্ভবত কোনও হার্ডওয়্যার ত্বরণ নেই, কারণ আমার কাছে একটি ল্যাপটপ একটি দুর্বল গ্রাফিক চিপ সহ ...
বাসজ

1
@ বাসজ একটি জড়াল জেএসফিডেল যুক্ত করুন<div style="position:relative;min-height: 900px;">Your's divs</div>
আলফোনসো

1
@ আলফোনসো রুবালকাভা ওহ ঠিক আছে ... এটি ব্যাখ্যা করে যে জাসফিডেলটি মসৃণ এবং সরাসরি লিঙ্কটি মসৃণ নয় (ক্রোম): gget.it/1owxq8kr/big-div-test_transfor.html ! ধন্যবাদ! সুতরাং পারফরম্যান্সের উন্নতি সম্ভবত আসে position:relative, যা গের্ট 3 এর উত্তরের অনুরূপ
বাসজ

22
  1. প্রথম অনুসন্ধান "কেন" এর উত্তর। সমস্যার একটি হরফ আকার । আপনার ফন্টের আকার 600000px রয়েছে, বেশিরভাগ ব্রাউজার এটিকে খুব বেশি হিসাবে দেখবে এবং আরও ছোট আকারে উপস্থাপন করবে, যখন ক্রোম মূল আকারটি রেন্ডার করার চেষ্টা করে। দেখে মনে হচ্ছে ক্রোম আপনার অনুরোধ করা শৈলীর সাথে খুব বড় আকারে এত বড় অক্ষর পুনরায় রঙ করতে পারে না।

তবে টিমু এবং গিয়ার 3 উত্তরগুলির সংমিশ্রণ - ট্রান্সফর্ম এবং অবস্থান ব্যবহার করে: স্থির করা হয়েছে, বড় ফন্টের সাথেও ক্রোম আরও বেশি দ্রুত কাজ করে।

  1. ২ য় প্রশ্নের উত্তর: "এমন কোনও উপায় আছে ... পুরো পৃষ্ঠাটি রেন্ডার করার চেষ্টা করার চেষ্টা করা উচিত নয়" - আপনি পুরো ধারকটির জন্য নয়, পাত্রে উপাদানগুলির জন্য মাউস ক্রিয়া প্রয়োগ করার চেষ্টা করতে পারেন।

সর্বাধিক ফন্টের আকার: http://jsfiddle.net/74w7yL0a/

firefox 34 - 2 000 px
chrome 39 - 1 000 000 px
safari 8 - 1 000 000 px
ie 8-11 - 1 431 700 px

6
এটা আসলে হয়। ওপি দুটি প্রশ্ন জিজ্ঞাসা করে, যার মধ্যে প্রথমটির উত্তর দেওয়া হয়: "এফএফ, আইই কেন এটি সঠিকভাবে পরিচালনা করে না ক্রোমকে?"
হান্স রয়েরডিনকোল্ডার

মজাদার. আপনার মনে কি এমন কিছু উপাদান রয়েছে যা দেখায় যে ফায়ারফক্স 10 কে থামে এবং ক্রোম মূল আকারটি রেন্ডার করার চেষ্টা করে? (এটি ভবিষ্যতের রেফারেন্সের জন্য আকর্ষণীয় হবে)। অগ্রিম ধন্যবাদ @ উইলিয়াসল!
বাসজ

1
@ বাসজ প্রতিটি ব্রাউজারের জন্য সর্বাধিক ফন্টের আকার যুক্ত করেছে (আজ পরীক্ষা করা হয়েছে), এবং এটি ফায়ারফক্সের জন্য 2k।
ভিলিয়াসএল

অনেক ধন্যবাদ @ উইলিয়াসল! প্রকৃতপক্ষে, এফএফ সীমিত করে font-sizeএবং এফএফ-তে কোনও অলসতার কারণ হতে পারে। তবে তারপরে আইই তেও এটি খুব ধীরে হওয়া উচিত ছিল, তবে এটি ... অদ্ভুত নয়!
বসজ

4

অনুবাদ ব্যবহারের বিষয়ে টিমুর উত্তর ছাড়াও:

container.style.transform = 'translate(' + container.x + 'px, ' + container.y + 'px)';

যা আপনার অন্যান্য বিক্রেতার উপসর্গগুলিও ব্যবহার করা উচিত, আপনি কেবল এটি শরীরে ব্যবহার করে এটি ঠিক করতে পারেন:

height: 100%;
width: 100%;
position: relative;
overflow: hidden;

এবং এটি এইচটিএমএলে:

height: 100%;

এটি তবে স্ক্রোলিং অক্ষম করবে। সুতরাং আমি যা করব তা হল, mousedownশরীরে একটি ইভেন্ট যুক্ত করুন এবং যখনই mousedownট্রিগার করা হবে তখন এই সিএসএস ক্লাস ব্যবহার করে সেই স্টাইলগুলি প্রয়োগ করুন এবং সেই ক্লাসটি সরিয়ে ফেলুন mouseup


আপনি এখানে যা উল্লেখ করেছেন তা আমি যুক্ত করার চেষ্টা করেছি: gget.it/0ufheqmt/big-div-test_prisonersolution.html , এটি কি আপনি বোঝাতে চেয়েছেন? এখানে এটি ক্রমের সাথে টেনে আনতে এখনও ধীর। আপনার জন্য একই? (দ্রষ্টব্য: আমি বুঝি না: এইসব সিএসএস পরিবর্তন করতে সুপারিশ পরিবর্তে ব্যবহার করার style.transformবা সঙ্গে ব্যবহার transform?)। আপনার উত্তর @ প্রিসনারের জন্য ধন্যবাদ!
বাসজ

2

@ টিমাসের উত্তর প্রায়শই এটি করে দেয়।

পরিবর্তে transform সঙ্গেtranslate3d ব্যবহার করুন top/left

translate3d হার্ডওয়্যার ত্বরণ সক্ষম করে।

container.style.transform = 'translate3d(' + container.x + 'px, ' + container.y + 'px, 0)';

জেএসফিডেলে একটি লাইভ ডেমো


1

আমি এটি বিশ্লেষণ করে দেখেছি যে Chrome সমস্যা আর্কিটেকচার সম্পর্কিত মূল সমস্যা এবং পৃষ্ঠাটি রেন্ডার করতে এর পটভূমি থ্রেডের ব্যবহার।

যদি আপনি দ্রুত রেন্ডারিং করতে চান তবে ক্রোম: ফ্ল্যাগগুলিতে যান, সেটিংটি ইমপ্ল-সাইড পেইন্টিং এ স্ক্রোল করুন এবং "অক্ষম" সেট করুন, তারপরে ব্রাউজারটি পুনরায় চালু করুন - মাউসমোভটি মসৃণ হবে।

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

আমি পরামর্শ দেব যে এটি ক্রোম বাগ হিসাবে ফাইল করা উচিত।


1

ডিভ ব্যবহার করুন display: tableএবং table-layout:fixedডিভিতে, অথবা ডিভটি মোড়ানো একটি টেবিল। এইচটিএমএলে:

এইচটিএমএল টেবিল মডেলটি এমনভাবে নকশা করা হয়েছে যাতে লেখকের সহায়তায় ব্যবহারকারী এজেন্টগুলি রেন্ডার শুরু করার আগে সমস্ত ডেটার জন্য অপেক্ষা না করে বরং টেবিলগুলি ক্রমবর্ধমান (যেমন টেবিল সারিগুলি উপস্থিত হওয়ার সাথে সাথে) রেন্ডার করতে পারে।

কোনও ব্যবহারকারী এজেন্টকে একটি পাসে একটি টেবিল ফর্ম্যাট করার জন্য, লেখকদের অবশ্যই ব্যবহারকারী এজেন্টকে বলতে হবে:

সারণীতে কলামের সংখ্যা। এই তথ্যটি কীভাবে সরবরাহ করতে হবে তার বিশদ জন্য দয়া করে একটি সারণীতে কলামগুলির সংখ্যা গণনা করার বিভাগটি পরামর্শ করুন। এই কলামগুলির প্রস্থ। এই তথ্যটি কীভাবে সরবরাহ করতে হবে সে সম্পর্কে বিশদ জানতে দয়া করে কলামগুলির প্রস্থ গণনা করার বিভাগটির সাথে পরামর্শ করুন।

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

বর্ধিত প্রদর্শনের জন্য, ব্রাউজারের কলাম এবং তাদের প্রস্থের সংখ্যা প্রয়োজন। সারণির ডিফল্ট প্রস্থটি হ'ল বর্তমান উইন্ডোর আকার (প্রস্থ = "100%")। এটি টেবল উপাদানটির প্রস্থের বৈশিষ্ট্যটি সেট করে পরিবর্তন করা যেতে পারে। ডিফল্টরূপে, সমস্ত কলামের প্রস্থ একই থাকে তবে আপনি টেবিলের ডেটা শুরু হওয়ার আগে এক বা একাধিক সিওএল উপাদানগুলির সাথে কলামের প্রস্থগুলি নির্দিষ্ট করতে পারেন।

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

ঘরের বিষয়বস্তুগুলি ফিট করার জন্য লেখকগুলিকে এখনও ব্যবহারকারী এজেন্টদের বলার একটি উপায় প্রয়োজন যা বর্ধিত প্রদর্শন ব্যবহার করতে হবে বা টেবিলটি স্বয়ংক্রিয়ভাবে আকার করতে হবে। দুটি পাস অটো-সাইজিং মোডে, কলামগুলির সংখ্যাটি প্রথম পাস দ্বারা নির্ধারিত হয়। ইনক্রিমেন্টাল মোডে, কলামগুলির সংখ্যা অবশ্যই সামনে (COL বা COLGROUP উপাদান সহ) অবশ্যই বর্ণিত হবে।

এবং সিএসএস:

17.5.2.1 নির্দিষ্ট টেবিল বিন্যাস

এই (দ্রুত) অ্যালগরিদম দিয়ে, সারণির অনুভূমিক বিন্যাসটি কোষের সামগ্রীর উপর নির্ভর করে না; এটি কেবলমাত্র টেবিলের প্রস্থ, কলামগুলির প্রস্থ এবং সীমানা বা ঘরের ব্যবধানের উপর নির্ভর করে।

টেবিলের প্রস্থটি 'প্রস্থ' বৈশিষ্ট্য সহ স্পষ্টভাবে নির্দিষ্ট করা যেতে পারে। 'অটো' এর একটি মান (উভয়ই 'প্রদর্শন: টেবিল' এবং 'প্রদর্শন: ইনলাইন-টেবিল' এর অর্থ) স্বয়ংক্রিয় টেবিল বিন্যাস অ্যালগরিদম ব্যবহার করুন। তবে, টেবিলটি যদি সাধারণ প্রবাহে একটি ব্লক-স্তরের টেবিল ('ডিসপ্লে: টেবিল') হয় তবে কোনও সংযুক্ত আরবিক সংস্থার প্রস্থ গণনা করতে 10.3.3 এর অ্যালগরিদম ব্যবহার করতে পারে এবং নির্দিষ্ট টেবিল বিন্যাস প্রয়োগ করতে পারে এমনকি যদি নির্দিষ্ট প্রস্থটি 'অটো'।

তথ্যসূত্র

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.