স্ক্রলস্পাই নেভিগেশন হল একটি সাধারণ UI প্যাটার্ন যা ভিউপোর্টে বর্তমানে পৃষ্ঠার বিভাগের সাথে সম্পর্কিত নেভিগেশন লিঙ্ক অটোমেটিক হাইলাইট করে। এর ফলে, ব্যবহারকারী স্ক্রল করার সময় কোনও বড় ডকুমেন্টের ঠিক কোন জায়গায় আছেন তা স্পষ্টভাবে বুঝতে পারেন।
এই প্যাটার্নটি দুটি পরিস্থিতিতে সাধারণ:
- সিঙ্গেল-পেজ ওয়েবসাইট: যেখানে প্রাইমারি সাইট নেভিগেশন আলাদা URL-এর পরিবর্তে একটি পৃষ্ঠার বিভিন্ন বিভাগে লিঙ্ক করে।
- বড়-ফর্মের কন্টেন্ট: যেখানে সূচিপত্র বা সাইডবার নেভিগেশন কোনও নিবন্ধ, নির্দেশিকা বা ডকুমেন্টেশন জুড়ে ব্যবহারকারীর অগ্রগতি ট্র্যাক করে।
কীভাবে প্রয়োগ করতে হয়
সাধারণত, scrollspy প্যাটার্নের জন্য JavaScript এবং IntersectionObserver API প্রয়োজন হয়। আধুনিক CSS, scroll-target-group প্রপার্টি ও :target-current সিউডো-ক্লাস ব্যবহার করে এটি করার নেটিভ উপায় প্রদান করে।
- নেভিগেশন লিঙ্ক ফ্র্যাগমেন্ট আইডেন্টিফায়ার ব্যবহার করছে কিনা তা নিশ্চিত করুন: আপনার নেভিগেশনে অবশ্যই অ্যাঙ্কর লিঙ্ক (
<a>) থাকতে হবে যা ফ্র্যাগমেন্ট আইডেন্টিফায়ার (যেমন,<a href="#section-1">) ব্যবহার করে একই পৃষ্ঠার বিভাগগুলিকে নির্দেশ করে যা আপনার কন্টেন্ট বিভাগেরid-এর সাথে মেলে। - স্ক্রল টার্গেট গ্রুপিং চালু করুন: আপনার নেভিগেশন লিঙ্কের কন্টেনারে
scroll-target-group: autoপ্রপার্টি প্রয়োগ করুন। এটি ব্রাউজারকে এইসব লিঙ্ককে মার্কার হিসেবে বিবেচনা করতে বলে যা তাদের সংশ্লিষ্ট টার্গেট ট্র্যাক করে। - অ্যাক্টিভ লিঙ্কের স্টাইল ঠিক করা: স্ক্রল কন্টেনারে টার্গেট বিভাগ দেখা গেলে স্টাইল প্রয়োগ করতে আপনার নেভিগেশন লিঙ্কে
:target-currentসিউডো-ক্লাস ব্যবহার করুন। - সিম্যান্টিক স্টেট: স্ক্রল করা বন্ধ হয়ে গেলে অ্যাক্টিভ লিঙ্কে
aria-current="true"আপডেট করতে স্ক্রিপ্ট ব্যবহার করুন যাতে স্টেটটি সহায়ক প্রযুক্তিতে সঠিকভাবে কমিউনিকেট করা হয়।
কোডের উদাহরণ
ব্যবহারকারী বিভিন্ন বিভাগের মধ্যে স্ক্রল করার সময় এই উদাহরণটি ফিক্সড নেভিগেশন মেনুতে অ্যাক্টিভ লিঙ্ক হাইলাইট করে।
/* MANDATORY: The container of markers must have scroll-target-group: auto */
nav {
/* Enables automatic tracking of fragment links */
scroll-target-group: auto;
}
/* MANDATORY: Use :target-current to style the link whose target is in view. */
nav a:target-current {
color: var(--accent, #007bff);
border-bottom-color: var(--accent, #007bff);
}
<nav>
<a href="#intro">Introduction</a>
<a href="#features">Features</a>
<a href="#pricing">Pricing</a>
</nav>
<main>
<!-- MANDATORY: Each section must have a unique ID matching a link fragment in the <nav>. -->
<section id="intro">
<h2>Introduction</h2>
<!-- content -->
</section>
<section id="features">
<h2>Features</h2>
<!-- content -->
</section>
<section id="pricing">
<h2>Pricing</h2>
<!-- content -->
</section>
</main>
<script type="module">
if (CSS.supports('scroll-target-group: auto')) {
const syncAriaCurrent = () => {
const currentLink = document.querySelector('nav a:target-current');
document.querySelectorAll('nav a').forEach(link => {
link.setAttribute('aria-current', link === currentLink ? 'true' : 'false');
});
};
// Update the aria on initial page load. Ensure the DOM content is loaded, either by using `<script type="module">` or an event listener for `DOMContentLoaded`.
syncAriaCurrent();
// Update the aria after scroll ends
document.addEventListener('scrollend', syncAriaCurrent);
}
</script>
পেশাদার পদ্ধতি
- নেভিগেশন লিঙ্কের জন্য নির্দিষ্ট কন্টেনারে
scroll-target-group: autoব্যবহার করুন: এটি নিশ্চিত করে যে ব্রাউজার জানে কোন লিঙ্কগুলি ট্র্যাক করা উচিত। - নিশ্চিত করুন যে টার্গেটের অনন্য
idঅ্যাট্রিবিউট আছে যা লিঙ্কেরhrefঅ্যাট্রিবিউটের সাথে মেলে। - অবশ্যই বিভাগগুলির জন্য পর্যাপ্ত উল্লম্ব স্পেস প্রদান করুন:
scroll-target-groupবিভাগগুলি যথেষ্ট বড় হলে দৃশ্যমান টার্গেটটি সবচেয়ে স্পষ্টভাবে শনাক্ত করে যাতে একবারে মাত্র একটি বা দুটি দৃশ্যমান হয়। - বাধ্যতামূলক: অ্যাক্সেসিবিলিটির জন্য, ভিজ্যুয়াল স্টেট অবশ্যই
aria-current-এর সাথে মিরর করতে হবে।:target-currentভিজ্যুয়াল দিকটি ম্যানেজ করলেও, এটি স্ক্রিন রিডারে দেখানো হয় না। - অ্যাক্টিভ স্টেট বোঝাতে শুধুমাত্র রঙের উপর নির্ভর করা AVOID: ফন্ট ওয়েট, আন্ডারলাইন বা ইন্ডিকেটর ডটের মতো অন্যান্য ভিজ্যুয়াল ইঙ্গিত অন্তর্ভুক্ত করুন অথবা রঙের মধ্যে পর্যাপ্ত কনট্রাস্ট আছে কিনা তা নিশ্চিত করুন যাতে বর্ণান্ধতা আছে এমন ব্যবহারকারীরাও পার্থক্য বুঝতে পারেন।
ফলব্যাক স্ট্র্যাটেজি
যেসব ব্রাউজার scroll-target-group সাপোর্ট করে না, সেগুলির ক্ষেত্রে আপনাকে IntersectionObserver API-এর উপর ভিত্তি করে ফলব্যাক ব্যবহার করতে হবে।
<script>
// Feature detection for scroll-target-group
const supportsScrollTargetGroup = CSS.supports('scroll-target-group: auto');
if (!supportsScrollTargetGroup) {
const navLinks = document.querySelectorAll('nav a');
const sections = document.querySelectorAll('main section');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const id = entry.target.getAttribute('id');
navLinks.forEach(link => {
const isActive = link.getAttribute('href') === `#${id}`;
// Use the escaped colon class for consistent styling
link.classList.toggle('\:target-current', isActive);
link.setAttribute('aria-current', isActive);
});
}
});
}, { rootMargin: '-50% 0px -50% 0px', threshold: 0 });
sections.forEach(section => observer.observe(section));
}
</script>
<style>
/* Fallback style if :target-current is not supported.
Use :is() to combine the native pseudo-class with a fallback class for older browsers. DO NOT use `nav a:target-current, nav a.\:target-current, as the unrecognized pseudoselector invalidates the entire rule in older browsers. */
nav a:is(:target-current, .\:target-current) {
color: var(--accent, #007bff);
border-bottom-color: var(--accent, #007bff);
font-weight: bold;
}
</style>