使用 JavaScript 构建一个自定义的测试内容滑动器,可以让你完全控制设计、行为和性能。 与预建的插件不同,手动编码滑动器与包括Directus在内的任何CMS 的无缝融合,可以适应品牌的精确规格。 文章从头开始创建一个生产“ 准备” 测试性滑动器,覆盖 HTML 骨架、CSS 过渡、JavaScript 逻辑、导航控制、反应性考虑、可访问性,以及关键是怎样通过 REST API从De获取现场测试数据。

规划 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]] 元素, 用于语义正确和更好的访问。 [[FLT: 2] 类决定了当前可看到的幻灯片。 这个结构可以被硬编码, 或者更好, 从 JavaScript 获取的数据中动态生成 。

使用 CSS 制式滑动器

干净、现代的 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 转换或绝对定位来实现交叉或幻灯片动画。 上述方法对于最小的设置效果良好 。

核心 JavaScript 功能性

JavaScript 引擎管理幻灯片循环、点导航和用户交互。启动时选择幻灯片并初始化索引。

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);

此代码提供自动旋转和交互式点导航。 对于增强可用性, 当用户在滑动器上徘徊或与点交互时, 请暂停自动播放 。

添加上一个/ 下一个按钮

许多用户期望箭头控制器手动浏览测试,在容器内外添加两个按钮.

<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 获取证词

在像Directus这样的无头的CMS中,测试数据存储在集合(例如])中,并有字段用于,],],以及可选的图像. 使用Directus JavaScript SDK或plain,检索并动态渲染数据.

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();
}

这种方法将您的验证集中到 Directus 中, 并在内容变化时自动更新滑动器。 为了更好的性能, 请考虑缓存 API 响应, 或者使用 Directus SDK 并带有查询参数来过滤或排序验证 。

无障碍因素

包容性的滑动器确保所有用户都能与您的验证进行交互。关键做法包括:

  • 在滑动容器和]上设置(屏幕阅读器可反向)。
  • 添加,以控制按钮(例如“下一个证明”、“先前的证明”)。
  • 在非可见幻灯片上使用。
  • 在焦点或悬浮时暂停自动播放,并提供播放/暂停按钮。
  • 确保键盘导航:箭头键在幻灯片之间移动,标签焦点在部件内管理.

对于深潜,请参考WAI在木卫一上的网络无障碍教程.

响应设计与amp; 触摸支持

验证滑动器必须跨越移动设备、平板电脑和桌面。使用相对单位和媒体查询来调整粘贴、字体大小和导航布局。

@media (max-width: 600px) {
 .slide {
 padding: 1.25rem;
 }
 blockquote {
 font-size: 0.95rem;
 }
 .slider-nav button {
 width: 10px;
 height: 10px;
 }
}

对于触摸支持,请使用 ] 和 事件听器执行刷卡机制。根据刷卡方向跟踪三角洲并触发 或 ]。

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);
 }
 }
}

性能优化

为确保用户经验的顺利,遵循这些准则:

  • 懒惰装入任何图像(例如客户端头像)使用]。
  • 限制 DOM 操作的次数。 在重建 API 数据中的滑动器时, 使用文档碎片进行批次插入幻灯片 。
  • 调压或调压重排事件处理器,以避免布局的抽打.
  • 最小化 JavaScript 依赖性 – 滑动器不需要 jQuery 或重文库 。
  • 如果使用 CSS 转换,则使用 平滑动画.

浏览器渲染优化的深入观察,请参见Google Web Profiles 渲染的指南.

与构建进程相结合

当使用 Directus 作为无头的 CMS 时, 您的滑动码可能是使用 Webpack, Vite, 或 Parcel 等捆绑器构建的更大的前端工程的一部分。 将您的 JavaScript 和 CSS 分开保存, 并导入到您的主要应用程序中。 对于静态网站或 WordPress 主题, 您可以在 API 调用后直接内置代码 。

如果您正在使用 [[FLT: 0]] Directus JavaScript 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;
}

这种方法还使您在使用类型脚本时获得类型安全.

测试您的滑动器

开发后, 测试多个浏览器( Chrome, Firefox, Safari, Edge) 和设备。 请检查键盘控制有效, 自动播放悬浮暂停, 并且当 JavaScript 禁用时滑动器会优雅地退后 。 使用浏览器的 DevTools 模拟慢网络速度, 并逐步确认测试器的负载 。

自动化测试可以添加Cypress或Playwright等工具,以确保随着代码库的发展,交互性保持可靠.

结论

使用 JavaScript 构建自定义的测试滑动器,可以自由设计一个独特的、可访问的和能与Directus本地融合的表演组件。 通过构建HTML的集成,以干净的CSS为主,实施强健的 JavaScript , 并从Directus 获取活数据,你创造了一个动态功能,可以与观众建立信任。 这里所覆盖的技术 — — 点导航、箭头控制、触摸支持、可访问性和性 — — 构成了你未来可能需要的任何内容木雕的基础。