স্ক্রল স্ন্যাপ স্টেট সিঙ্ক

স্ক্রল করা যায় এমন কন্টেনারের স্ন্যাপ পজিশনের সাথে UI স্টেট সিঙ্ক করার জন্য সাধারণত জটিল স্ক্রল ইভেন্ট লিসেনার, স্ক্রল অফসেটের ম্যানুয়াল গণনা এবং ইন্টারসেকশন অবজারভারের প্রয়োজন হয়। scrollsnapchange ইভেন্টটি একটি নেটিভ, দক্ষ উপায় প্রদান করে যা শনাক্ত করে যে কখন একটি স্ক্রলার একটি নতুন স্ন্যাপ টার্গেটে সেটেল হয়েছে, এটি সাইডবার সিঙ্ক্রোনাইজ করার জন্য বা সূচিপত্রে সক্রিয় বিভাগটি হাইলাইট করার জন্য উপযোগী করে তোলে।

প্রয়োগ

১. CSS-এ স্ক্রল স্ন্যাপ কনফিগার করা

ব্রাউজার যাতে স্ন্যাপ টার্গেট ট্র্যাক করতে পারে, তার জন্য কন্টেনারে scroll-snap-type সংজ্ঞায়িত থাকতে হবে এবং scroll-snap-align সহ চাইল্ড আইটেম থাকতে হবে। সূচিপত্র সহ কোনও দীর্ঘ নিবন্ধে, আপনি ভিউপোর্টের উপরে সেকশন হেডার স্ন্যাপ করতে এটি ব্যবহার করতে পারেন।

main {
    /* Enable scroll snapping on the container */  
  scroll-snap-type: y proximity;
  overflow-y: auto;
}

h2 {
  /* Define how headers align when snapped */
  scroll-snap-align: start;
}

২. স্ন্যাপ পরিবর্তনের জন্য শুনুন

ব্যবহারকারী স্ক্রল করা শেষ করলে এবং ব্রাউজার নতুন এলিমেন্টে স্ন্যাপ করলে প্রতিক্রিয়া জানাতে স্ক্রল কন্টেনারে scrollsnapchange ইভেন্ট ব্যবহার করুন। আমাদের TOC ডেমোতে, সাইডবারে অ্যাক্টিভ লিঙ্ক হাইলাইট করতে আমরা এটি ব্যবহার করি।

<!-- MANDATORY: Wrap table of contents links inside a proper navigation landmark -->
<nav aria-label="Table of contents">
  <ul>
    <li><a href="#section-1" aria-current="location">Section 1</a></li>
    <li><a href="#section-2">Section 2</a></li>
  </ul>
</nav>
const main = document.getElementById('main');
const links = document.querySelectorAll('nav a');

// The event fires when the scroller settles on a new snap target
main.addEventListener('scrollsnapchange', (event) => {
  // Use snapTargetBlock for vertical or snapTargetInline for horizontal
  const snappedHeader = event.snapTargetBlock;
  
  if (snappedHeader) {
    setSelectedParagraph(snappedHeader.id);
  }
});

অ্যাক্সেসিবিলিটি

সূচিপত্রের জন্য, সাইডবার লিঙ্কগুলি অ্যাক্টিভ থাকাকালীন aria-current="true" বা aria-current="location" ব্যবহার করছে কিনা তা নিশ্চিত করুন।

এছাড়াও, scroll-snap-type-এর জন্য mandatory ভ্যালু ব্যবহার করার সময় সতর্ক থাকুন, কারণ এটি স্ক্রিনের থেকে বড় হলে স্ন্যাপ-পয়েন্টের মধ্যে থাকা কন্টেন্ট অ্যাক্সেস করা যাবে না।

ফলব্যাক স্ট্র্যাটেজি

scrollsnapchange কাজ না করলে, বর্তমানে স্ক্রলারের সবচেয়ে উপরে কোন এলিমেন্ট আছে তা শনাক্ত করতে IntersectionObserver ব্যবহার করুন। মনে রাখবেন, এটি scrollsnapchange-এর থেকে আলাদাভাবে কাজ করে, কারণ এটি স্ক্রল করার সময় ট্রিগার হবে, স্ক্রল করা বন্ধ হওয়ার পরে নয়।

// Feature detect support for scroll snap events
if (!('onscrollsnapchange' in HTMLElement.prototype)) {
  const observer = new IntersectionObserver(
    () => {
      // Each time the set of intersecting headers changes, find the top
      // header that is visible.
      const topEntry = [...headers].reduce((currentTop, header) => {
        // Use the bottom to handle scrolling up, when the top is still offscreen
        const {bottom} = header.getBoundingClientRect();
        // Don't match if the header's bottom is above the scrollport
        if (bottom < 0) return;
        if (!currentTop) return header;
        return bottom <
          currentTop.getBoundingClientRect().bottom
          ? header
          : currentTop;
      }, undefined);
      if (topEntry) setSelectedParagraph(topEntry.id);
    },
    { root: main, threshold: 0.9 // Adjust based on your use case },
  );

  // Observe all snap targets (e.g., section headers)
  document.querySelectorAll('h2').forEach(header => observer.observe(header));
}