Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Web Design
  2. Navigation Design
Webdesign

CSS और JavaScript के साथ एक स्थानांतरण अंडरलाइन होवर प्रभाव (Shifting Underline Hover Effect) कैसे बनाएं.

by
Difficulty:IntermediateLength:ShortLanguages:

Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)

आज के टुटोरिअल में, हम फैंसी मेनू होवर इफ़ेक्ट (fancy menu hover effect) बनाने के लिए कुछ CSS और JavaScript का प्रयोग करेंगे. यह कोई पेचीदा अंतिम परिणाम नहीं है, फिर भी हमारे front-end स्किल की प्रैक्टिस के लिए इसको बनाना बहुत बड़ा अवसर होगा.

आगे के परिचय के बिना, आईये हम क्या बनाएंगे इसकी जांच कर लें.

The Markup

हम कुछ बेहद ही बुनयादी मार्कअप से शुरू करेंगे: एक nav एलिमेंट जिसमे मेनू और एक खाली span एलिमेंट शामिल हैं.

The CSS

मार्कअप के तैयार होने के बाद, हम सम्बंधित एलिमेंट्स के लिए कुछ बुनयादी स्टाइल्स को specify करेंगे.

ध्यान दीजिये की span एलिमेंट (.target) की position absolute है. जैसा की हम कुछ क्षण के बाद देखेंगे, हम JavaScript का प्रयोग इसकी सटीक स्थिति पता करने के लिए करेंगे. इसके साथ-साथ, यह मेनू के लिंक के पीछे दिखना चाहिए, इसलिए हमने इसे नकारात्मक z-index दिया.

The JavaScript

इस समय, आईये हम अपना ध्यान आवश्यक JavaScript पर लगते हैं. शुरुआत के लिए, हम वांछित (desired) एलिमेंट्स को लक्ष्य बनाते हैं. हम रंगों का एक array भी बनाते हैं जिसका प्रयोग हम बाद में करेंगे.

घटनाएं (Events)

इसके बाद हम मेनू के लिंक्स के click और mouseenter इवेंट्स को सुनते हैं.

जब click इवेंट घटित होता है, हम पेज को फिर से लोड होने से रोकते हैं. बेशक यह हमारे मामले में काम करेगा क्योंकि सभी लिंक्स में खाली href ऐट्रिब्यूट्स हैं. हांलांकि असली प्रोजेक्ट में, हर एक मेनू लिंक अलग अलग पेज खोलेगा.

सबसे महत्वपुर्ण बात, जैसे ही mouseenter इवेंट चालू (fire) होता है, mouseenterFunc नाम का callback फंक्शन कार्यान्वित (execute) हो जाता है.

mouseenterFunc

mouseenterFunc फंक्शन की बॉडी इस तरह की होगी:

इस फंक्शन के अंदर हम निम्नलिखित कार्ये करेंगे:

  1. टारगेट लिंक के सबसे निकटतम पैरेंट (li) में active क्लास जोड़ेंगे.
  2. सभी मेनू लिंक्स से opacity को घटाएंगे, "active" को छोड़ के.
  3. साथ वाले लिंक का पता लगाने और इसकी पोजीशन को viewport के रिलेटिव बनाने के लिए getBoundingClientRect method का प्रयोग करेंगे.
  4. उपरोक्त array में से रैंडम रंग (color) को प्राप्त करेंगे और इसे span एलिमेंट की border-color प्रॉपर्टी की वैल्यू के तौर पर पास (pass) करेंगे. याद रखें, इसकी शुरुआती प्रॉपर्टी वैल्यू transparent सेट है.
  5. getBoundingClientRect method से निकली गयी वैल्यू को span एलिमेंट की सम्बंधित प्रॉपर्टी में दे देंगे. दूसरे शब्दो में, span tag उस लिंक के साइज और पोजीशन को inherit करेगा जिसके ऊपर hover किया जा रहा है.
  6. span एलिमेंट में दी गयी डिफ़ॉल्ट ट्रांसफॉर्मेशन (default transformation) को रिसेट (reset) करें. यह बिहेवियर (behavior) सिर्फ पहली बार लिंक पर होवर करने पर ही जरूरी है. इस स्थिति में, एलिमेंट का ट्रांसफॉर्मेशन transform: translateX(-60px) से transform: none हो जायेगा. यह हमें एक प्यारा सा slide-in इफ़ेक्ट देगा.

यदि Active हो

यह नोट करना महत्वपुर्ण है की ऊपर दिया गया कोड हर बार लिंक के ऊपर होवर करने पर एक्सेक्युट (execute) किया जाता है. इसलिए यह "active" लिंक के ऊपर होवर करने पर भी चलता है. इस बिहेवियर को रोकने के लिए, हम ऊपर दिए गए कोड को if statement के अंदर डालेंगे.

अब तक हमारा demo कुछ इस तरह दिखेगा:

लगभग, पर संपुर्ण तरीके से नहीं

तो, सब कुछ वैसा ही हो रहा है जैसा सोचा था, है न? पर यह सच नहीं है क्योंकि अगर हम पेज में स्क्रॉल (scroll) करेंगे, या viewport के साइज में परिवर्तन करेंगे, और उसके बाद लिंक (link) को सेलेक्ट करने की कोशिश करेंगे, तो चीज़े अव्यवस्थित हो जाएंगी. खास तौर पर span एलिमेंट की पोजीशन गलत हो जाएंगी.

मेरी बात समझने के लिए पुरे पेज के डेमो (demo) पर कार्य करो.

इसका हल करने के लिए, हमे यह हिसाब लगाना पड़ेगा की window के टॉप से हमने कितना स्क्रॉल (scroll) कर लिया है और इस वैल्यू को टारगेट एलिमेंट की वर्तमान top वैल्यू में जोड़ देंगे. इसी प्रकार से, हमें यह भी पता लगाना होगा की document को horizontally (इस मामले में) कितना स्क्रॉल किया जा चूका है. नतीजे से निकली वैल्यू को टारगेट एलिमेंट की वर्तमान left वैल्यू में जोड़ देंगे.

यह कोड की दो लाइन्स है जिन्हें हमने अपडेट (update) किया है.

ध्यान में रखें की ऊपर दिए गए सभी कोड एक्सेक्युट (execute) हो जाएंगे जैसे ही ब्राउज़र DOM बनाने की प्रक्रिया करता है और उसे उचित स्क्रिप्ट (script) मिल जाती है. फिर से, आप की खुद के कार्यान्वित और डिजाईन में आप इस कोड को पेज लोड होते वक्त चलाना चाहें या इसी तरह कुछ. इस परिदृष्य (scenario) में, आपको इसे इवेंट हैंडलर (event handler) में जोड़ना होगा (उदाहरण के लिए load इवेंट).

Viewport

अंतिम चीज, हमे यह पक्का करना पड़ेगा की ब्राउज़र विंडो के रीसाइज (resize) करने पर भी इफ़ेक्ट चलते रहे. इसे पूरा करने के लिए, हमे resize इवेंट को सुनते हैं और resizeFunc नाम के इवेंट हैंडलर (event handler) को रजिस्टर करते हैं.

यह हैंडलर की बॉडी है:

ऊपर दिए गए फंक्शन में, हम निम्नलिखित चीजे करेंगे:

  1. जाँच कीजिये यदि menu लिस्ट आइटम में कोई active क्लास है की नहीं. यदि कोई एलिमेंट ऐसा है, जो बताता है की हम पहले से ही किसी लिंक पर hovered है.
  2. "active" आइटम की left और top प्रॉपर्टीज और साथ ही साथ उससे सम्बंधित विंडो प्रॉपर्टीज को लें और उसे span एलिमेंट में असाइन कर दें. ध्यान दें की हम सिर्फ उन प्रॉपर्टीज की वैल्यूज को प्राप्त करेंगे जो resize इवेंट के दौरान परिवर्तित हो जाती है. इसका अर्थ है, menu links की width और height की फिर से गणना करने की जरूरत नहीं है.

Browser का आधार (Support)

यह डेमो सभी नए ब्राउर्स के साथ अच्छे से कार्य करेगा. हांलांकि यदि आप को कोई मुश्किल का सामना करना पड़ता है, नीचे comments में मुझे बताएं. साथ ही साथ, जैसा की आप ने ध्यान दिया होगा, हमने ES6 कोड को निचले ES5 में compile करने के लिए Babel का प्रयोग किया.

निष्कर्ष

इस फुर्ती से दी गए सलाह में हम सरल फिर भी दिलचस्प मेनू होवर (menu hover) के इफ़ेक्ट को बनाने की प्रक्रिया से गुजरे.

मुझे उम्मीद है की जो हमने बनाया उसमे आपको मजा आया होगा और आपको और अधिक शक्तिशाली मेनू इफेक्ट्स (menu effect) बनाने जैसा की एक Stripe साइट में (लिखते समय) दिख रहा है के लिए प्रेरणा मिलेगी.

क्या आपने ऐसा ही कुछ कभी बनाया है? अगर हाँ, आपने क्या क्या चुनोतियों का सामना किया यह हमसे साँझा करना सुनिश्चित करें.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.