Contents

วิธีการใช้ Infinite Scroll ในเว็บแอปพลิเคชัน

การเลื่อนแบบไม่มีที่สิ้นสุดช่วยให้สามารถโหลดเนื้อหาได้อย่างต่อเนื่องในขณะที่ผู้ใช้เลื่อนหน้าลงมา ซึ่งแตกต่างจากวิธีการคลิกเพื่อโหลดของการแบ่งหน้าแบบดั้งเดิม ฟีเจอร์นี้สามารถมอบประสบการณ์ที่ราบรื่นยิ่งขึ้น โดยเฉพาะบนอุปกรณ์มือถือ

สำรวจกระบวนการปรับใช้อินเทอร์เฟซแบบเลื่อนได้ไม่จำกัดโดยใช้ HTML พื้นฐาน, CSS สไตล์ และเทคนิค JavaScript อเนกประสงค์

การตั้งค่าส่วนหน้า

ใช้กรอบงาน HTML พื้นฐานเพื่อแสดงเนื้อหาของคุณ ตัวอย่างมีดังนี้:

 <!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="style.css" />
</head>
<body>
    <h1>Infinite Scroll Page</h1>

    <div class="products__list">
      <img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg"
           alt="Jacket" />

      <img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg"
           alt="Jacket" />

      <img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg"
           alt="Jacket" />

      <img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg"
           alt="Jacket" />

      <img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg"
           alt="Jacket" />

      <img src="https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg"
           alt="Jacket" />
    </div>

    <script src="script.js"></script>
</body>
</html>

ไฟล์ Cascading Style Sheets (CSS) และไฟล์ JavaScript (JS)

การจัดสไตล์ CSS สำหรับเนื้อหาที่เลื่อนได้

หากต้องการนำเสนอกราฟิกตัวยึดตำแหน่งในรูปแบบตาราง ให้รวมกฎสไตล์ต่อไปนี้ไว้ในไฟล์ “style.css” ของคุณ:

 * {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html { font-size: 62.5%; }

body {
  font-family: Cambria, Times, "Times New Roman", serif;
}

h1 {
  text-align: center;
  font-size: 5rem;
  padding: 2rem;
}

img {
  width: 100%;
  display: block;
}

.products__list {
  display: flex;
  flex-wrap: wrap;
  gap: 2rem;
  justify-content: center;
}

.products__list > * {
  width: calc(33%-2rem);
}

.loading-indicator {
  display: none;
  position: absolute;
  bottom: 30px;
  left: 50%;
  background: #333;
  padding: 1rem 2rem;
  color: #fff;
  border-radius: 10px;
  transform: translateX(-50%);
}

ในปัจจุบัน ลักษณะที่ปรากฏของหน้าเว็บของคุณควรมีลักษณะคล้ายกับเค้าโครงและการออกแบบที่ให้ไว้ด้านล่าง:

/th/images/initial-page-after-html-and-css-added.jpg

การใช้งานหลักด้วย JS

เพื่อรวมฟังก์ชันการเลื่อนแบบไม่มีที่สิ้นสุดไว้ในเว็บแอปพลิเคชันของคุณอย่างมีประสิทธิภาพ การตรวจสอบความใกล้ชิดของผู้ใช้ไปยังฐานของพื้นที่เนื้อหาหรือหน้าเว็บทั้งหมดเป็นสิ่งสำคัญ ซึ่งสามารถทำได้โดยใช้ JavaScript และ CSS เพื่อสังเกตตำแหน่งของเหตุการณ์การเลื่อนที่สัมพันธ์กับความสูงของวิวพอร์ต และทริกเกอร์การดำเนินการที่เหมาะสมตามนั้น

 "use strict";

window.addEventListener("scroll", () => {
  if (
    window.scrollY \+ window.innerHeight >=
      document.documentElement.scrollHeight-100
  ) {
    // User is near the bottom, fetch more content
    fetchMoreContent();
  }
});

ในการเริ่มต้น เราจะพัฒนาฟังก์ชันที่ดึงข้อมูลตัวยึดตำแหน่งเพิ่มเติม ซึ่งสามารถทำได้โดยการใช้การเรียก API หรือใช้การสืบค้นฐานข้อมูล ขึ้นอยู่กับข้อกำหนดเฉพาะของแอปพลิเคชันของคุณ ข้อมูลที่ดึงมาจะถูกใช้เป็นอินพุตสำหรับการประมวลผลเพิ่มเติมและแสดงภายในอินเทอร์เฟซผู้ใช้

 async function fetchMoreContent() {
  try {
    let response = await fetch("https://fakestoreapi.com/products?limit=3");

    if (!response.ok) {
      throw new Error("Network response was not ok");
    }

    let data = await response.json();
    console.log(data);
  } catch (error) {
    console.error("There was a problem fetching new content:", error);
  } finally {
    console.log("Fetch function fired");
  }
}

สำหรับโปรเจ็กต์นี้ คุณสามารถใช้ API จาก fakestoreapi

เพื่อตรวจสอบว่าข้อมูลของคุณถูกดึงมาในขณะที่คุณเลื่อนดูหน้าต่างๆ ขอแนะนำให้ตรวจสอบคอนโซลนักพัฒนาซอฟต์แวร์ของเบราว์เซอร์เพื่อดูผลลัพธ์หรือข้อบ่งชี้ความสำเร็จในการดึงข้อมูล ข้อมูลนี้สามารถให้ข้อมูลเชิงลึกที่เป็นประโยชน์และข้อเสนอแนะเกี่ยวกับการทำงานของสคริปต์

/th/images/confirming-the-fetch-function-was-called-on-scroll.jpg

เพื่อบรรเทาปัญหาด้านประสิทธิภาพที่อาจเกิดขึ้นจากการดึงข้อมูลซ้ำๆ ขณะเลื่อน ขอแนะนำให้สร้างสถานะการโหลดเริ่มต้นสำหรับข้อมูล เพื่อให้มั่นใจว่าการทำงานของอุปกรณ์มีประสิทธิภาพ

 let isFetching = false;

เพื่อให้แน่ใจว่าการดึงข้อมูลดำเนินการอย่างมีประสิทธิภาพ จำเป็นต้องแก้ไขการใช้งานฟังก์ชัน ดึงข้อมูล เพื่อดำเนินการดึงข้อมูลต่อเมื่อฟังก์ชันรุ่นก่อนเสร็จสมบูรณ์เท่านั้น ซึ่งสามารถทำได้โดยการแนะนำตรรกะเพิ่มเติมภายในโค้ดเพื่อตรวจสอบและจัดการโฟลว์การดำเนินการของคำขอหลายรายการพร้อมกัน ดังนั้นจึงป้องกันปัญหาคอขวดหรือความล่าช้าที่อาจเกิดขึ้นเนื่องจากการดำเนินการพร้อมกันบนทรัพยากรที่ใช้ร่วมกัน

 async function fetchMoreContent() {
  if (isFetching) return; // Exit if already fetching

  isFetching = true; // Set the flag to true

  try {
    let response = await fetch("https://fakestoreapi.com/products?limit=3");

    if (!response.ok) {
      throw new Error("Network response was not ok");
    }

    let data = await response.json();
  } catch (error) {
    console.error("There was a problem fetching new content:", error);
  } finally {
    console.log("Fetch function fired");
    isFetching = false; // Reset the flag to false
  }
} 

การแสดงเนื้อหาใหม่

หากต้องการอัปเดตการแสดงภาพฟีดข่าวแบบไดนามิกในขณะที่ผู้ใช้เลื่อนดู แนวทางหนึ่งคือการกำหนดฟังก์ชันที่แก้ไของค์ประกอบหลักที่มีรายการซึ่งเป็นตัวแทนของแต่ละโพสต์ในฟีด ซึ่งสามารถทำได้โดยการต่อท้ายองค์ประกอบรูปภาพใหม่ลงในคอนเทนเนอร์นี้ในขณะที่ผู้ใช้เลื่อนหน้าลงไปอีก และปรับปรุงส่วนที่แสดงของฟีดด้วยโพสต์ที่ใหม่กว่าอย่างมีประสิทธิภาพ

ขั้นแรก ให้เลือกองค์ประกอบหลัก:

 const productsList = document.querySelector(".products__list");

จากนั้นสร้างฟังก์ชันเพื่อผนวกเนื้อหา

 function displayNewContent(data) {
  data.forEach((item) => {
    const imgElement = document.createElement("img");
    imgElement.src = item.image;
    imgElement.alt = item.title;
    productsList.appendChild(imgElement); // Append to productsList container
  });
}

โดยสรุป จำเป็นต้องแก้ไขฟังก์ชัน fetch และส่งต่อข้อมูลที่ดึงมาไปยังเมธอด append

 async function fetchMoreContent() {
  if (isFetching) return;

  isFetching = true;

  try {
    let response = await fetch("https://fakestoreapi.com/products?limit=3");

    if (!response.ok) {
      throw new Error("Network response was not ok");
    }

    let data = await response.json();
    displayNewContent(data);
  } catch (error) {
    console.error("There was a problem fetching new content:", error);
  } finally {
    console.log("Fetch function fired");
    isFetching = false;
  }
}

อันที่จริง การใช้งานฟังก์ชันการเลื่อนแบบไม่มีที่สิ้นสุดได้รับการบูรณาการเรียบร้อยแล้ว ซึ่งช่วยให้สามารถนำทางได้อย่างราบรื่นผ่านเนื้อหาที่ดูเหมือนไม่มีที่สิ้นสุดเมื่อดำเนินไปในหน้าเว็บ

/th/images/infinite-scroll-working.jpg

การปรับปรุงการเลื่อนที่ไม่มีที่สิ้นสุด

เพื่อปรับปรุงประสบการณ์ของผู้ใช้ ขอแนะนำให้แสดงตัวบ่งชี้การโหลดในขณะที่ดึงเนื้อหาใหม่ ซึ่งสามารถทำได้โดยการรวมโค้ด HTML ต่อไปนี้

 <h1 class="loading-indicator">Loading...</h1>

จากนั้นเลือกองค์ประกอบการโหลด

 const loadingIndicator = document.querySelector(".loading-indicator");

โดยสรุป ใช้งานสองฟังก์ชันที่ควบคุมสถานะการแสดงผลของตัวบ่งชี้การโหลดโดยใช้ JavaScript

 function showLoadingIndicator() {
  loadingIndicator.style.display = "block";
  console.log("Loading...");
}

function hideLoadingIndicator() {
  loadingIndicator.style.display = "none";
  console.log("Finished loading.");
}

จากนั้นเพิ่มลงในฟังก์ชันการดึงข้อมูล

 async function fetchMoreContent() {
  if (isFetching) return; // Exit if already fetching

  isFetching = true;
  showLoadingIndicator(); // Show loader

  try {
    let response = await fetch("https://fakestoreapi.com/products?limit=3");

    if (!response.ok) {
      throw new Error("Network response was not ok");
    }

    let data = await response.json();
    displayNewContent(data);
  } catch (error) {
    console.error("There was a problem fetching new content:", error);
  } finally {
    console.log("Fetch function fired");
    hideLoadingIndicator(); // Hide loader
    isFetching = false;
 }
}

ซึ่งจะช่วยให้:

เบราว์เซอร์ของคุณไม่รองรับแท็กวิดีโอ

แนวทางปฏิบัติที่ดีสำหรับ Infinite Scroll

แนวทางปฏิบัติที่ดีที่สุดที่ควรปฏิบัติตาม ได้แก่:

ขอแนะนำให้หลีกเลี่ยงการร้องขอรายการมากเกินไปในคราวเดียว เนื่องจากอาจทำให้เบราว์เซอร์ค้างและทำให้ประสิทธิภาพโดยรวมลดลง

เพื่อบรรเทาปัญหาคำขอเครือข่ายบ่อยครั้งที่เกิดจากการดึงเนื้อหาทันทีเมื่อตรวจพบเหตุการณ์การเลื่อน วิธีหนึ่งคือการใช้กลไกการดีเด้ง เมื่อใช้เทคนิคนี้ การดำเนินการดึงเนื้อหาจะล่าช้าไปช่วงระยะเวลาหนึ่งหลังจากเหตุการณ์การเลื่อนเกิดขึ้น เป็นผลให้ช่วยลดจำนวนคำขอเครือข่ายที่ไม่จำเป็นและปรับปรุงประสิทธิภาพโดยรวม

แม้ว่าผู้ใช้บางคนอาจชื่นชอบความสะดวกสบายของการเลื่อนแบบไม่มีที่สิ้นสุด แต่สิ่งสำคัญคือต้องตระหนักว่าไม่ใช่ทุกคนจะแชร์การตั้งค่านี้ การจัดหาตัวเลือกอื่นในรูปแบบขององค์ประกอบการแบ่งหน้าจะเป็นประโยชน์สำหรับผู้ที่พบว่ามีประสิทธิภาพมากกว่าหรือใช้งานง่ายกว่า ท้ายที่สุดแล้ว การนำเสนอทั้งสองตัวเลือกทำให้แต่ละบุคคลสามารถปรับแต่งประสบการณ์การท่องเว็บได้ตามความต้องการและความชอบส่วนบุคคล

การแจ้งเตือนผู้ใช้เมื่อไม่มีเนื้อหาเพิ่มเติมที่จะโหลดจะเหมาะสมกว่า แทนที่จะพยายามดึงข้อมูลเพิ่มเติมซ้ำๆ

การเรียนรู้การโหลดเนื้อหาที่ไร้รอยต่อ

การผสมผสานการเลื่อนแบบไม่มีที่สิ้นสุดในการออกแบบเว็บไซต์มอบประสบการณ์ผู้ใช้ที่ราบรื่นโดยเฉพาะบนอุปกรณ์มือถือ ซึ่งกำลังแพร่หลายมากขึ้นในโลกดิจิทัลในปัจจุบัน โดยการปฏิบัติตามหลักเกณฑ์ที่ให้ไว้ในบทความนี้ นักพัฒนาสามารถรวมฟังก์ชันการทำงานนี้เข้ากับโครงการเว็บของตนได้อย่างมีประสิทธิภาพ

เมื่อออกแบบเว็บไซต์ สิ่งสำคัญคือต้องคำนึงถึงอารมณ์ของผู้ใช้ที่จะโต้ตอบด้วย เพื่ออำนวยความสะดวกให้กับประสบการณ์เชิงบวก แสดงตัวบ่งชี้ความคืบหน้าและแสดงข้อความแสดงข้อผิดพลาดที่ชัดเจนซึ่งแจ้งให้ผู้ใช้ทราบถึงปัญหาใดๆ ที่อาจเกิดขึ้นระหว่างการโต้ตอบกับไซต์