- जिन टेबल में बहुत सारी पंक्तियाँ होती हैं, उनमें स्क्रॉल करते-करते कॉलम का मतलब भूलना आसान हो जाता है, जिससे डेटा पढ़ना असुविधाजनक हो जाता है
thead में सिर्फ position: sticky; और top: 0; जोड़ने से हेडर को स्थिर किया जा सकता है
sticky को दुनिया भर में लगभग 96% ब्राउज़र सपोर्ट मिलता है, इसलिए यह किसी प्रयोगात्मक फीचर जैसा नहीं है
- 300वें आइटम जैसी नीचे की पंक्तियाँ देखते समय भी कॉलम शीर्षक दिखते रहते हैं, जिससे टेबल नेविगेशन अनुभव बेहतर होता है
- इम्प्लिमेंटेशन छोटा है लेकिन असर बड़ा है, इसलिए लंबी टेबल देने वाले वेबपेजों में इसे बेसिक usability सुधार के रूप में अपनाया जा सकता है
लंबी टेबल में हेडर गायब होने की समस्या
- बड़े dataset या सैकड़ों पंक्तियों वाली टेबल में स्क्रॉल करने के बाद टेबल हेडर स्क्रीन से बाहर चला जाता है
- 300वें आइटम तक नीचे जाने पर हर कॉलम का डेटा क्या दर्शाता है, यह दोबारा समझना मुश्किल हो सकता है
- टेबल जितनी नई या अपरिचित हो, उतना ही कॉलम के अर्थ याद रखकर पढ़ना पड़ता है, जिससे नेविगेशन का बोझ बढ़ता है
thead पर sticky लागू करना
- समाधान यह है कि
thead में दो CSS properties जोड़ी जाएँ
position: sticky;
top: 0;
position: sticky और top: 0 को साथ में उपयोग करने पर स्क्रॉल के दौरान भी हेडर को स्क्रीन के शीर्ष पर स्थिर रखा जा सकता है
sticky की वैश्विक सपोर्ट दर लगभग 96% है, इसलिए इसे कई ब्राउज़रों में इस्तेमाल किया जा सकता है
- वास्तविक व्यवहार CodePen उदाहरण में देखा जा सकता है
1 टिप्पणियां
Hacker News की राय
एक axis पर sticky header ठीक है, लेकिन अभी भी उस दिन का इंतज़ार है जब CSS दोनों axis पर इसे सपोर्ट करेगा: https://github.com/w3c/csswg-drafts/issues/8286
overflow-x: autoभी चाहते हैं, लेकिन आपको कहा जाता है कि इनमें से सिर्फ एक चुनोसच कहूँ तो CSS का ज्ञान लगभग न के बराबर होने पर भी मैं किसी तरह कामचलाऊ web app बना लेता हूँ. हाल ही में मैंने लगभग 20,000 rows वाली एक राक्षसी table में header को sticky करने की कोशिश की: https://www.datasciencemeta.com/rpackages शुरू में लगा कि Bootstrap table classes में
class="table table-header-sticky"जैसा कुछ होगा, लेकिन ऐसा नहीं था, और Stack Overflow, GPT, CodePen की सलाहों के साथ 20 मिनट छेड़छाड़ करने पर भी अजीब side effects आते रहे लेकिन इस पोस्ट के CodePen से यह 2 मिनट में चल गया, और मैं अभी इसे production में deploy कर रहा हूँTable header को sticky करना
position: sticky;से आसान लगता है, लेकिन table content में कुछ भी extra जोड़ते ही मामला जटिल हो जाता है मैंने sticky header वाली table में यह feature जोड़ा कि user body को scroll करके page छोड़ दे तो पहली दिख रही row का index save हो जाए और वापस आने पर restore हो जाए, लेकिन वह हमेशा लगभग एक row नीचे restore होती थी. बाद में पता चला कि row 5 वास्तव में table के सबसे ऊपर थी, लेकिनtheadउसके ऊपर overlap कर रहा था, इसलिए row 6 पहली row जैसी दिख रही थी इसलिए मैंनेtheadकी height को ध्यान में रखकर scroll position adjust की, लेकिन कभी-कभी कुछ pixels का फर्क रह जाता था, और table बड़ी होने की वजह से scroll events पर lazy loading भी थी, साथ ही default auto table layout इस्तेमाल हो रहा था, इसलिए header cells में line wrap होने से पूरी header height बदल जाती थी. अंत में मैंनेtheadपर ResizeObserver लगाया ताकि height बदलने पर scroll position dynamically adjust हो सके [1] https://developer.mozilla.org/en-US/docs/Web/API/ResizeObser...इसे implement करते समय अगर आप चाहते हैं कि header की borders भी sticky रहें, तो
table thead:beforeऔरtable thead:afterपरposition: absolute,width: 100%,top: 0/bottom: 0,border-top/border-bottomदेकर यह किया जा सकता हैअच्छा होता अगर table header अपने-आप ऐसे काम करता. अगर developer ने संबंधित tags का इस्तेमाल करके extra काम किया है, तो अक्सर वही behavior उसकी मंशा होती है
की जगह500 बार और हरके अंदर 45 स्तर nestedलगाकर table बनाती हैं, तो वहाँ शायद यह काम न करेcommand line में header को stderr पर और body को stdout पर भेज दें ऐसा नहीं करेंगे तो
heights | sort -k2 -nrका resultGeorge 186,Wally 173,NAME HEIGHTहोगा, लेकिन अगर header stdout को bypass करे तो resultNAME HEIGHT,George 186,Wally 173होगाheights | (sed -u 1q; sort -k2 -nr)ठीक से काम करता है स्रोत: https://stackoverflow.com/a/56151840heightsएक file है, तो% head -1 heights ; sed 1,1d heights | sort -k2 -nrजैसा कर सकते हैं, और अगरheightsकोई ऐसा executable है जिसे दो बार चलाना महँगा पड़ता है, तो% heights > /tmp/heights ; head -1 /tmp/heights ; sed 1,1d /tmp/heights | sort -k2 -nrजैसा कर सकते हैं.awkकी pipe भी इस्तेमाल की जा सकती है दूसरे विकल्प कम सुविधाजनक हैं, लेकिन कम चौंकाने वाले हैं, और executable लिखने वाले की अलग सोच होने पर भी काम करेंगेयह काफ़ी समय तक काम नहीं करता था. Chrome पहले
theadऔरtrelements परposition: stickyको disable करता था: https://issues.chromium.org/issues/41303743 browser support table लगभग पूरी हरी दिखती थी, लेकिन याद है कि Chrome की tables में यह वास्तव में काम नहीं करता थाकुछ लोग तो बल्कि कहना चाहेंगे, “कृपया ऐसा मत कीजिए”: https://news.ycombinator.com/item?id=32998091
stickyproperty में बुरा क्या है?CodePen में अगर
topको border जितना offset कर दें तो और बेहतर दिखता है. उदाहरण के लिए0की जगह-1pxरखने से table body header के ऊपर से झलकती नहीं है तुलना: https://codepen.io/bradleytaunt/pen/bGZyJBj संशोधित संस्करण: https://codepen.io/alokmenghrajani/pen/ExMBQowsticky header की जगह सीमित viewport height इस्तेमाल करने का सुझाव दिया गया ताकि header हमेशा दिखता रहे DataGridXL(https://datagridxl.com) की तरह यह किया जा सकता है. वैसे, यह मैंने बनाया है