چگونه یک افکت اسکرول نامحدود برای تصاویر بسازیم؟

infinite scroll images using intersection observer
11 آذر 1403

در دنیای امروز وب، اسکرول‌های نامحدود یکی از راه‌های متداول برای بهبود تجربه کاربری در نمایش محتواهای طولانی و مستمر مثل فیدهای رسانه‌های اجتماعی است. این تکنیک به کاربران اجازه می‌دهد بدون نیاز به بارگذاری صفحه جدید، محتواهای بعدی را به صورت پویا ببینند. در این بین، تصاویر یکی از عناصری هستند که می‌توانند با استفاده از اسکرول نامحدود به شکلی زیبا و روان به نمایش درآیند.

پیاده‌سازی افکت اسکرول نامحدود برای تصاویر می‌تواند چالش‌برانگیز باشد، مخصوصاً اگر به دنبال حفظ کیفیت عملکرد و تجربه کاربری هستید. ابزارها و کتابخانه‌های مختلفی در JavaScript وجود دارند که می‌توانند این فرآیند را آسان‌تر کنند. یکی از این روش‌ها استفاده از Intersection Observer API می‌باشد. این API به شما اجازه می‌دهد بدون استفاده از رویدادهای اسکرول، المان‌هایی که به نمایش کاربر نزدیک می‌شوند را شناسایی کنید.

برای شروع، ابتدا یک ساختار HTML ساده برای تصاویر خود ایجاد کنید. سپس از JavaScript و API ذکر شده برای تشخیص انتهای لیست تصاویر و بارگذاری تصاویر جدید استفاده کنید. در نهایت، استایل CSS مناسب را برای نمایش بهتر تصاویر اعمال کنید.

در اینجا یک نمونه کد ساده برای ایجاد چنین افکتی را مشاهده می‌کنید:


<!-- HTML Structure -->
<div id="image-container">
  <img src="image1.jpg" alt="Image 1">
  <img src="image2.jpg" alt="Image 2">
  <!-- More images -->
</div>

<!-- JavaScript Code -->
<script>
const imageContainer = document.getElementById('image-container');
let imageCounter = 3; // Starting from 3 as 1 and 2 are loaded initially

const loadImage = () => {
  for(let i = 0; i < 2; i++) {
    const img = document.createElement('img');
    img.src = `image${imageCounter}.jpg`;
    img.alt = `Image ${imageCounter}`;
    imageContainer.appendChild(img);
    imageCounter++;
  }
};

const observer = new IntersectionObserver((entries) => {
  if(entries[0].isIntersecting) {
    loadImage();
  }
});

observer.observe(document.querySelector('#image-container img:last-child'));
</script>

<!-- CSS Styles -->
<style>
  #image-container {
    display: flex;
    flex-direction: column;
    align-items: center;
  }
  #image-container img {
    max-width: 100%;
    margin: 10px 0;
  }
</style>

توضیحات کد خط به خط:

<div id="image-container"> ‹div› اصلی برای نگهداری تصاویر است.
<img src="image1.jpg" alt="Image 1"> یک تصویر با مسیر و توضیحات اول.
const imageContainer = document.getElementById('image-container'); عنصر JSON برای نگهداری و مدیریت تصاویر را تعریف می‌کنیم.
const loadImage = () => { ... } تابعی برای بارگذاری تصاویر جدید.
const observer = new IntersectionObserver((entries) => { ... }); ایجاد یک ناظر برای شناسایی وقتی که انتهای تصاویر به صفحه نزدیک می‌شود.
observer.observe(document.querySelector('#image-container img:last-child')); مشاهدهٔ آخرین تصویر موجود برای تصمیم‌گیری و بارگذاری تصاویر بیشتر.

سوالات متداول

؟

آیا استفاده از Intersection Observer API سخت است؟

؟

آیا اسکرول نامحدود برای وبسایت‌های همه‌کار مناسب است؟