- Anchor link का ढांचा बस इतना है: बटन क्लिक → शीर्षक तक scroll, लेकिन असली implementation में समस्याएँ आती हैं
- नीचे मौजूद शीर्षक viewport के ऊपरी हिस्से तक ठीक-ठीक scroll नहीं होते, जिससे UX खराब होता है
- इसे हल करने के लिए कई तरह के approaches आज़माए गए, और तरीका धीरे-धीरे अधिक परिष्कृत और जटिल होता गया
सरल समाधान: padding जोड़ना
- नीचे वाले शीर्षक scroll में आ जाएँ, इसके लिए extra space जोड़ने का तरीका
- delta निकालकर padding जोड़ने से समस्या हल हो सकती है
- लेकिन design team को अनावश्यक खाली जगह पसंद न आए
व्यावहारिक समाधान: trigger line को खिसकाना
- trigger line को viewport के निचले हिस्से की ओर खिसकाकर ऐसा adjust करना कि नीचे वाला शीर्षक उससे टकराए
- समस्या यह है कि शीर्षक viewport के बिल्कुल नीचे आ जाता है, जिससे पढ़ने में आसानी घटती है
सुधारित विकल्प: virtual trigger point बनाना
- असल शीर्षक की जगह वही रहने देते हुए, सिर्फ trigger होने की position को ऊपर की ओर shift की गई virtual position के रूप में बनाया जाता है
- इससे हर शीर्षक पर अलग adjustment लागू करने की flexibility मिलती है
- लेकिन पहला शीर्षक बहुत ऊपर shift हो जाता है और नई समस्या पैदा होती है → अलग से adjustment चाहिए
और बेहतर तरीका: trigger position को proportionally shift करना
- सभी triggers को एक जैसा shift नहीं किया जाता; पहला शीर्षक जैसा है वैसा, आख़िरी शीर्षक सबसे ज़्यादा shift
- बीच के शीर्षक अपनी position के अनुसार अनुपातिक रूप से shift होते हैं
- यह शीर्षकों का क्रम बनाए रखने और scroll से वहाँ तक पहुँच संभव रहने जैसी शर्तें पूरी करता है
- यह तरीका सरल और उपयोगी है, और ज़्यादातर मामलों में ठीक से काम करता है
उन्नत approach: custom mapping function से optimization
- trigger position को मनमाने ढंग से 25% स्थान पर रखा गया था, इसलिए virtual position असली position से बहुत दूर जा सकती है
- इसे हल करने के लिए MSE(Mean Squared Error) आधारित optimization approach लाई गई
loss function की रचना
- Anchor Penalty: virtual शीर्षक position का असली position से कितना विचलन है
- Section Penalty: sections के बीच दूरी (scroll length) में कितना बदलाव आता है
- इन दोनों मानों को weights के साथ adjust करके सबसे उपयुक्त trigger position निकाली जाती है
constraints
- page की सीमा के भीतर रहना
- पहला शीर्षक ऊपर की ओर shift न हो
- शीर्षकों का क्रम बना रहे
insight: simple proportional shifting की सीमा
- बहुत लंबे pages (जैसे पूरी Bible) में पूरे page पर छोटे-छोटे shifts जमा करके लागू करने जैसी अक्षमता आती है
- page जितना लंबा होगा, error उतनी बढ़ सकती है और UX पर बुरा असर पड़ सकता है
अंतिम समाधान: Smoothstep आधारित variable mapping function
- हर शीर्षक की position को 0~1 के बीच normalize किया जाता है, और उसी के आधार पर adjustment ratio निकाला जाता है
- Smoothstep function(S(x) = 3x² - 2x³) का उपयोग कर smooth transition लागू किया जाता है
- adjustment शुरू होने की position
a सेट की जाती है, ताकि एक निश्चित बिंदु तक कोई shift न हो और उसके बाद धीरे-धीरे बढ़े
- उदाहरण:
a = 0.4 हो तो ऊपर के 40% शीर्षकों में कोई बदलाव नहीं, नीचे के 60% में क्रमिक adjustment
- नतीजतन, ऊपर के शीर्षक अपनी मूल जगह पर रहते हैं, नीचे के शीर्षकों पर अधिकतम adjustment लागू होता है → स्वाभाविक UX मिलता है
सत्यापन और समापन
- अंतिम implementation को डिज़ाइन की बारीकी और व्यावहारिकता के संतुलन वाली solution माना जा सकता है
- बेशक, designer का feedback शायद बस इतना हो: “...बस ठीक से काम करना चाहिए”
- लेकिन कम-से-कम यह ब्लॉग पोस्ट बारीक engineering के ऐसे रिकॉर्ड के रूप में रहेगी जिसे लंबे समय तक याद रखा जाएगा
1 टिप्पणियां
Hacker News राय
बैकएंड डेवलपर के रूप में फ्रंटएंड काम को देखते समय कभी-कभी उसकी जटिलता देखकर हैरानी होती है
साइड नेविगेशन में "active anchor" संकेतक के UX उद्देश्य पर सवाल
anchor link की सबसे महत्वपूर्ण UX विशेषता यह है कि उसे दूसरों को भेजा जा सके और bookmark के रूप में सहेजा जा सके
Jira के anchor/permalink से चिढ़कर क्लिक किया, लेकिन यह मिलता-जुलता होते हुए भी अलग तरीका है
मुख्य पेज content के नीचे padding जोड़ना आदर्श होगा
आधुनिक browser में text fragments का उपयोग करके पेज के किसी खास हिस्से को highlight किया जा सकता है
कई "active" states की अनुमति देना भी संभव है
दूसरे comments पढ़ना मज़ेदार है
Firefox डेस्कटॉप में "सुंदर समाधान" "मध्य सेक्शन" को highlight करता है
लेख साफ़-सुथरा है और ब्लॉग का डिज़ाइन उससे भी ज़्यादा दिलचस्प है