एक बहुत, बहुत, बहुत बड़ा विभाग


109

मेरी एक परियोजना के लिए (देखें BigPictu.re या bigpicture.js GitHub परियोजना ), मुझे संभावित रूप से बहुत, बहुत, बहुत बड़े <div>कंटेनर से निपटना होगा ।

मुझे पता था कि मेरे द्वारा उपयोग किए जाने वाले सरल दृष्टिकोण के साथ खराब प्रदर्शन का खतरा था, लेकिन मुझे उम्मीद नहीं थी कि यह ज्यादातर ... क्रोम केवल के साथ मौजूद होगा!

यदि आप इस छोटे पृष्ठ का परीक्षण करते हैं (नीचे कोड देखें), पैनिंग (क्लिक + ड्रैग) होगा:

  • फ़ायरफ़ॉक्स पर सामान्य / चिकनी
  • इंटरनेट एक्सप्लोरर पर भी सामान्य / चिकनी
  • Chrome पर बहुत धीमा (लगभग दुर्घटनाग्रस्त)!

बेशक, मैं कुछ कोड (अपनी परियोजना में) यह करने के लिए जोड़ सकता हूं कि जब आप बहुत अधिक ज़ूम कर रहे हों, तो संभावित रूप से बहुत बड़े फ़ॉन्ट-आकार वाला पाठ छिपा हो। लेकिन फिर भी, फ़ायरफ़ॉक्स और इंटरनेट एक्सप्लोरर इसे सही ढंग से क्यों संभालते हैं और क्रोम नहीं?

क्या प्रत्येक कार्य के लिए पूरे पृष्ठ को रेंडर करने का प्रयास करने के लिए जावास्क्रिप्ट (HTML, या CSS) का कोई तरीका नहीं है जो ब्राउज़र को बताए ? (केवल वर्तमान व्यूपोर्ट को प्रस्तुत करें!)


<!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
[OT] 600K फ़ॉन्ट आकार। बहुत बुरी नजर वाले लोगों के लिए एक एक्सेसिबिलिटी फीचर होना चाहिए ? ;-)
जियर्ट 3

61
@ geert3 मुझे यकीन है कि यह एक लूनर परिक्रमा वेब ब्राउज़र के लिए है
डेविड विल्किंस

3
आपका डेमो क्रोम में चिकनी है 41.0.2236.0 देव-एम
पियर-ल्यूक गेंड्रेयू

11
मैं कैनरी (41.0.2241.0 कैनरी) में हूं और मैं अभी भी पिछड़ रहा हूं। आप लोग इसे गेमिंग रिग के बजाय लैपटॉप पर आज़माएं, आप इसे देखेंगे
markasoftware

3
आम धारणा के विपरीत, IE वास्तव में क्रोम से सबसे अधिक पृष्ठों के प्रतिपादन के लिए तेज है। इसका जावास्क्रिप्ट इंजन हालांकि थोड़ा धीमा है।
फालनवे

जवाबों:


62

position: fixedचीजों को गति देने के लिए बदल रहा है ।


27
यह उनके सवाल का सीधा जवाब नहीं है, लेकिन यह उनकी प्रारंभिक समस्या (क्रोम में धीमी प्रतिक्रिया) का एक संभावित समाधान है। बॉक्स के बाहर सोच को प्रोत्साहित किया जाना चाहिए, IMHO।
जियर्ट

यहाँ यह पूरी तरह से काम करता है: gget.it/e0ubdh67/big-div-test_fixed.html । तुम जानते हो क्यों ? :)
बसज

2
मैं केवल अनुमान लगा सकता हूं। fixedस्पष्ट रूप से कम जटिल है और शायद वे अधिक अनुकूलन कर सकते हैं। लेकिन अगर आप इसका मतलब है कि मैं प्रतिपादन इंजन स्रोत कोड को नहीं देखा है ;-)
geert3

1
यह उत्तर, और विलिअसल द्वारा प्रदान किया गया, दोनों में अलग-अलग लोगों द्वारा एक ही "एक टिप्पणी छोड़ दो" टिप्पणी है। कितना मजेदार था वो?
जो

2
@ जो ये मध्यस्थों द्वारा उपयोग के लिए StackOverflow द्वारा प्रदान किए गए मानक उत्तरों के एक सेट से हैं। हालांकि कुछ को अधिक संयत करने की आवश्यकता है।
जियर्ट 3

42

transformइसके बजाय का उपयोग करें top/left:

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

JsFiddle पर एक लाइव डेमो


2
एक बहुत ही अजीब बात: अपने jsFiddle में, यह वास्तव में क्रोम के साथ तेज है। मैंने ठीक वही संशोधन किया जो आपने मेरे मूल कोड में यहां प्रस्तावित किया है: gget.it/1owxq8kr/big-div-test_transform.html , और यह अंतिम लिंक Chrome पर धीमा है :( यह कैसे संभव है? यह आपके jsFiddle के समान दिखता है? [नोट: चमत्कारिक ढंग से, geert3 के जवाब काम करने लगता है, मैं क्यों नहीं पता है, लेकिन यह काम करता है: gget.it/e0ubdh67/big-div-test_fixed.html]
Basj

@Basj हो सकता है कि यह संस्करण पर निर्भर हो, मेरा Chrome (39.0.2171.71 m) आपकी टिप्पणी में लिंक किए गए पृष्ठ को FF के रूप में सुचारू और तेज़ है। वैसे भी, fixedतत्व को टेक्स्ट-फ्लो से बाहर निकालने के लिए स्थिति सेट करना और बहुत सारे री-रेंडरिंग को सहेजता है। transformएमडीएन के प्रलेखन में कहते हैं: "... एक स्टैकिंग संदर्भ बनाया जाएगा। उस स्थिति में ऑब्जेक्ट स्थिति के लिए एक ब्लॉक के रूप में कार्य करेगा: इसमें शामिल निश्चित तत्व।"
तैमू

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
@AlfonsoRubalcava ओह ठीक है ... यह बताता है कि क्यों jsfiddle चिकनी है और सीधा लिंक चिकनी नहीं है (Chrome): gget.it/1owxq8kr/big-div-test_testform.html ! धन्यवाद! तो प्रदर्शन में सुधार position:relative, प्रोब्लेम्स से आता है , जो कि जियर्ट 3 के जवाब के समान है
बसज

22
  1. पहले खोज का उत्तर "क्यों"। समस्याओं में से एक फ़ॉन्ट आकार है । आपके पास फ़ॉन्ट का आकार 600000px है, अधिकांश ब्राउज़र इसे बहुत अधिक देखेंगे और छोटे रेंडर करेंगे, जबकि क्रोम मूल आकार को रेंडर करने की कोशिश करता है। ऐसा लगता है कि क्रोम आपके अनुरोधित शैलियों के साथ इस तरह के बड़े अक्षरों को बहुत तेजी से नहीं दोहरा सकता है।

लेकिन तेमू और जियर्ट 3 के उत्तर - परिवर्तन और स्थिति का उपयोग करना: निश्चित, क्रोम बड़े फोंट के साथ बहुत अधिक तेजी से काम करता है।

  1. 2 वें प्रश्न का उत्तर: "क्या कोई रास्ता है ... पूरे पृष्ठ को रेंडर करने का प्रयास नहीं करना है" - आप कंटेनर में तत्वों के लिए माउस कार्रवाई को लागू करने की कोशिश कर सकते हैं, पूरे कंटेनर के लिए नहीं।

अधिकतम फ़ॉन्ट आकार: 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
यह वास्तव में करता है। ओपी दो प्रश्न पूछता है, जिनमें से पूर्व में उत्तर दिया गया है: "एफएफ, आईई इसे सही ढंग से क्यों संभालता है और क्रोम नहीं?"
हंस रोअरडिंकहोल्डर

दिलचस्प। क्या आपके पास कुछ तत्व हैं जो यह दर्शाते हैं कि फ़ायरफ़ॉक्स 10k पर बंद हो जाता है और क्रोम मूल आकार प्रदान करने की कोशिश करता है? (यह भविष्य के संदर्भ के लिए दिलचस्प होगा)। अग्रिम धन्यवाद @ViliusL!
बसज

1
@Basj ने प्रत्येक ब्राउज़र के लिए अधिकतम फ़ॉन्ट आकार जोड़ा (आज परीक्षण किया गया), और यह फ़ायरफ़ॉक्स के लिए 2k है।
वाइलूएसएल

बहुत बहुत धन्यवाद @ViliusL! वास्तव में, एफएफ सीमित है font-sizeऔर यह एफएफ पर कोई सुस्ती का कारण हो सकता है। लेकिन तब यह IE पर भी बहुत धीमा होना चाहिए था, लेकिन यह नहीं है ... अजीब!
बसज

4

तेमु के अनुवाद का उपयोग करने के जवाब के अलावा:

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

जिसे आपको अन्य विक्रेता उपसर्गों का उपयोग करना चाहिए, आप इसे शरीर पर इसका उपयोग करके ठीक कर सकते हैं:

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

और यह HTML पर:

height: 100%;

हालाँकि, यह स्क्रॉल करना अक्षम कर देगा। तो मैं क्या करूंगा, mousedownशरीर में एक घटना जोड़ें और उन शैलियों को लागू करें जब भी mousedownट्रिगर हो, और उस वर्ग को हटाकर एक सीएसएस क्लास का उपयोग किया जाए mouseup


मैंने आपके द्वारा यहां बताई गई बातों को जोड़ने का प्रयास किया: gget.it/0ufheqmt/big-div-test_prisonersolution.html , क्या यह आपका मतलब है? यहां क्रोम के साथ घसीटना अभी भी धीमा है। आपके निमित्त भी ऐसी ही कामना? (पुनश्च: मैं समझता हूँ कि नहीं था: यदि आप इन सीएसएस संशोधनों करने के लिए सुझाव है कि बजाय का उपयोग करने का style.transformया साथ का उपयोग कर transform?)। आपके उत्तर के लिए धन्यवाद @ कैदी!
बसज 13

2

@ टाइटस का जवाब लगभग यह सब करता है।

transform केtranslate3d बजाय के साथ प्रयोग करें top/left

translate3d हार्डवेयर त्वरण सक्षम करता है।

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

JsFiddle पर एक लाइव डेमो


1

मैंने इसका विश्लेषण किया और मैंने पाया कि पृष्ठ को रेंडर करने के लिए क्रोम डिस्प्ले आर्किटेक्चर से संबंधित मूल समस्या, और बैकग्राउंड थ्रेड्स का उपयोग।

यदि आप तेजी से प्रतिपादन करना चाहते हैं, तो क्रोम में जाएं: झंडे, सेटिंग को इम्प्लांट-साइड पेंटिंग पर स्क्रॉल करें, और "अक्षम" सेट करें, फिर ब्राउज़र को पुनरारंभ करें - मूसमव चिकना होगा।

मैंने जो पाया वह यह है कि यदि आप एफपीएस काउंटर को सक्षम करते हैं, तो इस परिदृश्य में एफपीएस की रिपोर्ट अभी भी बहुत अधिक है, भले ही वास्तविक ऑनस्क्रीन प्रदर्शन बहुत कम है। मेरी अस्थायी व्याख्या (क्रोम डिस्प्ले आर्किटेक्चर विशेषज्ञ नहीं होना) यह है कि अगर यूआई थ्रेड और डिस्प्ले अलग-अलग थ्रेड पर हैं, तो div के रेंडरिंग में विवाद हो सकता है - उस स्थिति में जहां UI थ्रेड और रेंडरिंग थ्रेड पर है एक ही धागा, यूआई धागा यूआई थ्रेड रेंडर की तुलना में तेजी से संदेश नहीं भेज सकता है।

मेरा सुझाव है कि इसे क्रोम बग के रूप में दायर किया जाना चाहिए।


1

का प्रयोग करें display: tableऔर table-layout:fixeddiv पर, या div लपेटकर एक मेज। HTML में:

HTML तालिका मॉडल को इसलिए डिज़ाइन किया गया है कि, लेखक सहायता के साथ, उपयोगकर्ता एजेंट रेंडर करने के लिए शुरुआत से पहले सभी डेटा के लिए प्रतीक्षा करने के बजाय (यानी, टेबल पंक्तियों के आने के रूप में) टेबल प्रस्तुत कर सकते हैं।

उपयोगकर्ता एजेंट के लिए एक पास में एक तालिका बनाने के लिए, लेखकों को उपयोगकर्ता एजेंट को बताना होगा:

तालिका में स्तंभों की संख्या। इस जानकारी की आपूर्ति कैसे करें, इसके विवरण के लिए कृपया किसी तालिका में स्तंभों की संख्या की गणना करने पर अनुभाग से परामर्श करें। इन स्तंभों की चौड़ाई। इस जानकारी की आपूर्ति कैसे करें, इसके विवरण के लिए स्तंभों की चौड़ाई की गणना करने पर अनुभाग से परामर्श करें।

अधिक सटीक रूप से, एक उपयोगकर्ता एजेंट एकल पास में एक तालिका प्रस्तुत कर सकता है जब कॉलम चौड़ाई COLGROUP और COL तत्वों के संयोजन का उपयोग करके निर्दिष्ट की जाती है। यदि स्तंभों में से कोई भी सापेक्ष या प्रतिशत शब्दों में निर्दिष्ट है (स्तंभों की चौड़ाई की गणना करने पर अनुभाग देखें), लेखकों को तालिका की चौड़ाई भी निर्दिष्ट करनी होगी।

वृद्धिशील प्रदर्शन के लिए, ब्राउज़र को कॉलम की संख्या और उनकी चौड़ाई की आवश्यकता होती है। तालिका की डिफ़ॉल्ट चौड़ाई वर्तमान विंडो आकार (चौड़ाई = "100%") है। TABLE तत्व की चौड़ाई विशेषता सेट करके इसे बदला जा सकता है। डिफ़ॉल्ट रूप से, सभी स्तंभों की चौड़ाई समान होती है, लेकिन आप तालिका डेटा प्रारंभ होने से पहले कॉलम चौड़ाई एक या अधिक COL तत्वों के साथ निर्दिष्ट कर सकते हैं।

शेष अंक कॉलम की संख्या है। कुछ लोगों ने मेज की पहली पंक्ति प्राप्त होने तक प्रतीक्षा करने का सुझाव दिया है, लेकिन यदि कोशिकाओं में बहुत अधिक सामग्री है तो यह एक लंबा समय ले सकता है। समग्र रूप से यह अधिक समझ में आता है, जब वृद्धिशील प्रदर्शन वांछित है, लेखकों को TABLE तत्व में स्तंभों की संख्या स्पष्ट रूप से निर्दिष्ट करने के लिए।

लेखकों को अभी भी उपयोगकर्ता एजेंटों को यह बताने की ज़रूरत है कि क्या वृद्धिशील प्रदर्शन का उपयोग करें या सेल सामग्री को फिट करने के लिए तालिका को स्वचालित रूप से आकार दें। दो पास ऑटो-साइजिंग मोड में, कॉलमों की संख्या पहले पास से निर्धारित होती है। वृद्धिशील मोड में, स्तंभों की संख्या को सामने (COL या COLGROUP तत्वों के साथ) बताया जाना चाहिए।

और सीएसएस:

17.5.2.1 फिक्स्ड टेबल लेआउट

इस (तेज) एल्गोरिथ्म के साथ, तालिका का क्षैतिज लेआउट कोशिकाओं की सामग्री पर निर्भर नहीं करता है; यह केवल तालिका की चौड़ाई, स्तंभों की चौड़ाई और सीमाओं या सेल रिक्ति पर निर्भर करता है।

तालिका की चौड़ाई 'चौड़ाई' संपत्ति के साथ स्पष्ट रूप से निर्दिष्ट की जा सकती है। 'ऑटो' का मान ('डिस्प्ले: टेबल' और 'डिस्प्ले: इनलाइन-टेबल' दोनों के लिए) का अर्थ है ऑटोमैटिक टेबल लेआउट एल्गोरिदम। हालाँकि, यदि तालिका सामान्य प्रवाह में एक ब्लॉक-स्तरीय तालिका ('डिस्प्ले: टेबल') है, तो एक UA चौड़ाई की गणना करने और निश्चित तालिका लेआउट लागू करने के लिए 10.3.3 के एल्गोरिथ्म का उपयोग कर सकती है, भले ही निर्दिष्ट चौड़ाई 'ऑटो' है।

संदर्भ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.