สร้างแถบเลื่อนเนื้อหาที่กําหนดเองสําหรับปรับแต่งการใช้จาวาสคริปต์ ให้คุณสามารถควบคุมการออกแบบ พฤติกรรม และการทํางานได้เต็มรูปแบบ ไม่เหมือนกับส่วนเสริมที่มีมาก่อน การนําร่องแบบมือสอง ส่วนเสริม การนําร่อง การสื่อสาร การยอมรับ และที่สําคัญ – เพื่อนําข้อมูลเข้าข้อมูลเข้าใช้ได้โดยด่วน
วางแผนโครงสร้าง HTML
แผ่น เสียง ที่ มี ชื่อ เสียง ประกอบ ด้วย กล่อง และ สไลด์ แต่ ละ แผ่น.
<div id="testimonial-slider" class="slider">
<div class="slide active">
<blockquote>
<p>“Great service that delivered exactly what we needed.”</p>
<footer>— Jane Doe, CEO of Example Inc.</footer>
</blockquote>
</div>
<div class="slide">
<blockquote>
<p>“Their team was responsive and professional from start to finish.”</p>
<footer>— John Smith, Founder of Acme Corp.</footer>
</blockquote>
</div>
<div class="slide">
<blockquote>
<p>“We saw a measurable improvement in user engagement after the redesign.”</p>
<footer>— Emily Chen, CTO of WebTech</footer>
</blockquote>
</div>
</div>
แต่ละสไลด์จะครอบคลุมองค์ประกอบ [FLT: 1) สําหรับการปรับให้ถูกต้องและเข้าถึงได้ดีขึ้น คลาส จะกําหนดว่าสไลด์ไหนที่มองเห็นได้ในปัจจุบัน โครงสร้างนี้สามารถทนทานหรือสร้างโดยไดนามิคจากข้อมูลที่ดึงผ่านจาวาสคริปต์ได้
การ ไต่ ขึ้น ไป ใน ภาพ สไลด์
สะอาด และทันสมัย CSS ทําให้แน่ใจว่าแถบเลื่อนดูเงาขัดและแสดงได้ดี ใช้ บนกล่อง และควบคุมการมองภาพ ด้วยความทึบแสงและการเปลี่ยนแปลง
.slider {
position: relative;
width: 100%;
max-width: 800px;
margin: 0 auto;
overflow: hidden;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.slide {
display: none;
padding: 2rem;
background: #f9f9f9;
transition: opacity 0.5s ease-in-out;
}
.slide.active {
display: block;
}
blockquote {
margin: 0;
padding: 0;
font-style: italic;
line-height: 1.6;
}
blockquote footer {
margin-top: 0.75rem;
font-style: normal;
font-weight: 600;
color: #333;
}
.slider-nav {
display: flex;
justify-content: center;
gap: 0.5rem;
margin-top: 1rem;
}
.slider-nav button {
width: 12px;
height: 12px;
border-radius: 50%;
border: 2px solid #007acc;
background: transparent;
cursor: pointer;
transition: background 0.3s;
}
.slider-nav button.active-dot {
background: #007acc;
}
การใช้ [FLT: 5] การสลับคลาสนั้นง่ายแต่จะขาดการปรับเปลี่ยนอย่างราบรื่นระหว่างสไลด์ สําหรับแถบเลื่อนการผลิต ให้พิจารณาใช้ตัวเลื่อนการผลิตแบบ CSS หรือตําแหน่งสัมบูรณ์เพื่อสร้างแนวขวางหรือสไลด์ภาพ แนวทางด้านบนนั้นใช้ได้ดีสําหรับการตั้งค่าน้อยที่สุด
ฟังก์ชันของจาวาสคริปต์หลัก
กลไก จาวาสคริปต์ สามารถ ทํา การ เลื่อน การ หมุน, การ นํา ร่อง จุด, และ การ ติด ต่อ กับ ผู้ ใช้ ได้.
const slides = document.querySelectorAll('.slide');
const dots = document.querySelectorAll('.slider-nav button');
let currentIndex = 0;
let intervalId;
function showSlide(index) {
slides.forEach((slide, i) => {
slide.classList.toggle('active', i === index);
});
dots.forEach((dot, i) => {
dot.classList.toggle('active-dot', i === index);
});
currentIndex = index;
}
function nextSlide() {
const next = (currentIndex + 1) % slides.length;
showSlide(next);
}
function startAutoPlay(interval = 5000) {
intervalId = setInterval(nextSlide, interval);
}
function stopAutoPlay() {
clearInterval(intervalId);
}
// Dot click handler
dots.forEach((dot, index) => {
dot.addEventListener('click', () => {
stopAutoPlay();
showSlide(index);
startAutoPlay(4000); // restart with shorter delay after manual interaction
});
});
// Initialize
showSlide(0);
startAutoPlay(5000);
รหัสนี้ให้การหมุนอัตโนมัติและใช้แบบดอตเพื่อนําร่อง สําหรับเพิ่มความง่ายในการใช้งาน ให้หยุดการเล่นอัตโนมัติ เมื่อผู้ใช้เคลื่อนตัวอยู่เหนือแถบเลื่อนหรือโต้ตอบกับจุด
กําลังเพิ่มปุ่มก่อนหน้า / ปุ่มถัดไป
ผู้ใช้หลายคนคาดหวังว่าลูกศรจะควบคุมการเรียกดูด้วยตนเอง เพิ่มปุ่ม 2 ปุ่มภายในหรือนอกคอนเทนเนอร์
<button class="prev" aria-label="Previous testimonial">❮</button>
<button class="next" aria-label="Next testimonial">❯</button>
.prev, .next {
position: absolute;
top: 50%;
transform: translateY(-50%);
background: rgba(0,0,0,0.5);
color: white;
border: none;
padding: 0.75rem;
cursor: pointer;
z-index: 10;
}
.prev { left: 0; border-radius: 0 4px 4px 0; }
.next { right: 0; border-radius: 4px 0 0 4px; }
document.querySelector('.prev').addEventListener('click', () => {
const prev = (currentIndex - 1 + slides.length) % slides.length;
showSlide(prev);
});
document.querySelector('.next').addEventListener('click', nextSlide);
การดึงข้อมูลการทดสอบจาก directus
ใน CMS ไร้หัว เช่น discus ข้อมูลเชิงลบจะถูกเก็บไว้ในคอลเลกชัน (เช่น [FLT: 10]) พร้อมทุ่ง [FLT: 11] [FLT: 12] [FLT: 12]] [FLT: 13] และเพิ่มภาพ ดูเพิ่มที่เนื้อหาเพิ่มเติมเพิ่มเติม. กํากับ จาวาสคริปต์ SDK หรือธรรมดา , และทําการแปลข้อมูลแบบไดเรชัน (FLT: 13).
async function fetchTestimonials() {
try {
const response = await fetch('https://your-project.directus.app/items/Testimonials');
if (!response.ok) throw new Error('Network response was not ok');
const data = await response.json();
return data.data;
} catch (error) {
console.error('Failed to fetch testimonials:', error);
return [];
}
}
async function renderSlider() {
const testimonials = await fetchTestimonials();
const sliderContainer = document.getElementById('testimonial-slider');
const navContainer = document.querySelector('.slider-nav');
// Clear existing content
sliderContainer.innerHTML = '';
navContainer.innerHTML = '';
testimonials.forEach((item, index) => {
const slide = document.createElement('div');
slide.className = `slide${index === 0 ? ' active' : ''}`;
slide.innerHTML = `
<blockquote>
<p>“${item.quote}”</p>
<footer>— ${item.client_name}${item.client_title ? `, ${item.client_title}` : ''}</footer>
</blockquote>
`;
sliderContainer.appendChild(slide);
const dot = document.createElement('button');
dot.className = index === 0 ? 'active-dot' : '';
dot.setAttribute('aria-label', `Go to testimonial ${index + 1}`);
dot.addEventListener('click', () => {
stopAutoPlay();
showSlide(index);
startAutoPlay(4000);
});
navContainer.appendChild(dot);
});
// Re‑initialize variables and start
slides = document.querySelectorAll('.slide');
dots = document.querySelectorAll('.slider-nav button');
showSlide(0);
startAutoPlay();
}
วิธีการนี้ จะเก็บค่าสถิติของคุณไว้ในค่ากํากับที่ถูกต้อง และปรับแถบเลื่อนให้อัตโนมัติ เมื่อไรก็ตามที่มีการเปลี่ยนแปลงของเนื้อหา โปรดพิจารณาการกดแป้นพิมพ์ API หรือใช้ dictionus SDK ด้วยพารามิเตอร์การค้นหาเพื่อกรองหรือเรียงลําดับ
การพิจารณาการช่วยใช้งาน
แถบเลื่อนที่แยกไม่ได้ ทําให้แน่ใจว่าผู้ใช้ทั้งหมดสามารถโต้ตอบกับ access ของคุณ
- ตั้งค่า [FLT: 16] บนตู้คอนเทนเนอร์ และ[FLT: 17] (มีการผิดพลาดสําหรับผู้อ่านจอ).
- เพิ่ม [FLT: 18] เพื่อควบคุมปุ่ม (เช่น "ประกาศผลล่าสุด", "ประกาศอิสรภาพ").
- ใช้ บนสไลด์ที่มองไม่เห็น
- การหมุนการเล่นอัตโนมัติบนโฟกัสหรือการยก, และให้ปุ่มเล่น/ชั่วคราว
- เปิดใช้งานการนําทางแป้นพิมพ์: ปุ่มลูกศรเคลื่อนระหว่างการเลื่อนหน้าภาพ และโฟกัสของแท็บ จะถูกจัดการภายในวิดเจ็ต
สําหรับดําน้ําลึก อ้างถึง [FLT: 0] WAI เว็บไซต์เข้าถึง ดูมนตรีบน Carulusels.
การรองรับการออกแบบแบบอัตโนมัติ
แถบเลื่อนแบบทดสอบ ต้องทํางานตลอดทั้งอุปกรณ์มือถือ, แผ่นแท็บ, และเดสก์ท็อป ใช้หน่วยสัมพัทธ์ และชุดสื่อเพื่อปรับรูปแบบการพับ, ขนาดแบบอักษร, และผังวางนําทาง
@media (max-width: 600px) {
.slide {
padding: 1.25rem;
}
blockquote {
font-size: 0.95rem;
}
.slider-nav button {
width: 10px;
height: 10px;
}
}
สําหรับการสนับสนุนการจับสัญญาณ ให้ใช้กลไกการจับข้อมูล โดยใช้ [FLT: 21] และ[FLT: 22] ผู้ฟังเหตุการณ์ ติดตามการเรียกของ delta และเรียก [FLT: 23] หรือ ตามเส้นทางการขโมยข้อมูล (FTT:24)
let touchStartX = 0;
let touchEndX = 0;
sliderContainer.addEventListener('touchstart', (e) => {
touchStartX = e.changedTouches[0].screenX;
});
sliderContainer.addEventListener('touchend', (e) => {
touchEndX = e.changedTouches[0].screenX;
handleSwipe();
});
function handleSwipe() {
const diff = touchStartX - touchEndX;
if (Math.abs(diff) > 50) {
if (diff > 0) nextSlide();
else {
const prev = (currentIndex - 1 + slides.length) % slides.length;
showSlide(prev);
}
}
}
การตั้งแนวร่วม
เพื่อ มั่นใจ ว่า ผู้ ใช้ จะ มี ประสบการณ์ ที่ เรียบ ง่าย จง ทํา ตาม คํา แนะ นํา ต่อ ไป นี้:
- Lazyzaload รูปภาพใด ๆ (เช่น, ลูกข่าย sceadshots) โดยใช้ [FLT: 26].
- จํากัดจํานวนของการจัดการ DOM เมื่อมีการสร้างแถบเลื่อนจากข้อมูล API ให้ใช้ชิ้นส่วนเอกสารเพื่อทําการใส่แผ่นสไลด์
- เครื่องมือดูเหตุการณ์หรือการลดเสียงเตือนเพื่อป้องกันการขัดเสียงจากผังแป้นพิมพ์
- ลดความขึ้นต่อกันของจาวาสคริปต์ – แถบแถบเลื่อนไม่ต้องการ j สืบค้นหรือไลบรารีที่หนัก
- ใช้ [FLT: 27] สําหรับภาพเคลื่อนไหวเรียบ หากใช้ CSS ทรานสเลชัน
สําหรับ ดู การ จัด เว็บ เว็บ กํากับ การ แปล ภาพ ของ เว็บ เว็บ เว็บ กราฟิก [FLT: 1).
การ เข้า ร่วม กับ กระบวนการ ก่อ สร้าง
เมื่อมีการใช้ dictionus เป็น CMS แบบไม่มีหัว รหัสแถบเลื่อนของคุณอาจเป็นส่วนหนึ่งของโครงการที่มีขนาดใหญ่กว่า ที่สร้างด้วยคอมแพ็กแบบเว็บแพ็ค, Vite, หรือ Parcel เก็บจาวาสคริปต์และ CSS ของคุณไว้ในแฟ้มแยกแยกและนําเข้ามันมายังโปรแกรมหลักของคุณ สําหรับเว็บไซต์แบบตายตัว หรือ WordPres คุณสามารถแทรกโค้ดได้โดยตรง หลังจาก API เรียก
หากคุณกําลังใช้ [FLT: 0] Drectuts จาวาสคริปต์ SDK[[FLT: 1], การตรวจสอบและจัดการข้อผิดพลาดจะกลายเป็นง่ายขึ้น:
import { createDirectus, rest, readItems } from '@directus/sdk';
const client = createDirectus('https://your-project.directus.app').with(rest());
async function getTestimonials() {
const testimonials = await client.request(readItems('Testimonials', {
sort: ['sort'],
limit: 10
}));
return testimonials;
}
วิธี นี้ ยัง ทํา ให้ คุณ มี ความ ปลอด ภัย ถ้า ใช้ ชนิด พิมพ์.
ทดสอบตัวเลื่อนของคุณ
หลังการพัฒนา ให้ทดสอบผ่านเว็บเบราว์เซอร์หลาย ๆ ตัว (Crome, Firefox, Saveri, Edge) และอุปกรณ์ตรวจสอบว่าคีย์บอร์ดควบคุมการทํางานได้, การเล่นอัตโนมัติหยุดการทํางานบนเมาส์ และแถบเลื่อนจะลดลงอย่างนุ่มนวลเมื่อจาวาสคริปต์ถูกปิดใช้งาน ใช้ตัวเรียกใช้งานเดเวอส์ของเบราว์เซอร์เพื่อจําลองความเร็วเครือข่ายที่ช้า และยืนยันการโหลดแบบเร็ว ๆ นี้
การ ทดสอบ แบบอัตโนมัติ สามารถ เพิ่ม เข้า ไป พร้อม กับ เครื่อง มือ ต่าง ๆ เช่น ไซ เปร ส หรือ เพลย์ ไรต์ เพื่อ ให้ แน่ ใจ ว่า การ สนทนา จะ คง ไว้ ซึ่ง ความ ไว้ วางใจ ได้ ใน ขณะ ที่ รหัส เบส พัฒนา ขึ้น.
รูปแบบการวน
การสร้างแถบเลื่อนที่กําหนดเองโดยใช้จาวาสคริปต์นั้น ให้อิสระแก่คุณในการออกแบบส่วนประกอบเฉพาะ, เข้าถึง, และดําเนินการที่ผนวกเข้ากับโปรแกรมกํากับภาษาท้องถิ่นได้โดยการสร้างโครงสร้างแบบ HTML แบบ secmantual, การตกแต่งด้วย CSS ที่สะอาด, การใช้จาวาสคริปต์อย่างรัดกุม, และการดึงข้อมูลสดจาก audiscus คุณสร้างคุณสมบัติที่สร้างสรรค์อย่างสร้างสรรค์ที่ได้รับความเชื่อถือร่วมกับผู้ชมของคุณ เทคนิคที่ครอบคลุมที่นี่ – ลูกศร, การสัมผัส, การเข้าถึง, และการแสดง – โครงสร้างของเนื้อหาใดๆ ที่คุณอาจต้องการในอนาคต