【前端从0到1实战】第8篇:构建“轮播图/滑块” (Carousel)

news/2025/11/17 15:58:53/文章来源:https://www.cnblogs.com/Eric2pro/p/19233166

【前端从0到1实战】第8篇:构建“轮播图/滑块” (Carousel)

欢迎来到本系列的第四篇。在上一篇中,我们通过“多步骤表单”掌握了状态管理。今天,我们将把这个概念应用到动画中,构建一个专业级的“轮播图”组件。

轮播图(也称“滑块”)是网页设计的基石之一。它允许我们在一个紧凑的空间内,以富有吸引力的方式循环展示多个内容块(如产品、文章、图片)。

本篇我们将手写一个功能完备的轮播图,它将包含:

“上一张/下一张”导航按钮。

底部“导航点” (Dots) 切换。

平滑的 transform 滑动动画。

第一部分:HTML 结构搭建 (骨架)

轮播图的 HTML 结构是一种精巧的“视觉欺骗”。它包含三个关键层级:

“视口” (.carousel-viewport):一个固定大小的“窗口”,它设置了 overflow: hidden,我们只能通过这个窗口看到内容。

“胶片” (.carousel-filmstrip):一个非常宽的容器,它包含了所有幻灯片,并排成一行 (display: flex)。它将在这个“窗口”后面左右移动。

“幻灯片” (.carousel-slide):每一个单独的内容项。

第二部分:CSS 样式 (皮肤与动画)

CSS 的核心是 overflow 和 transform。

.carousel-viewport 必须设置 overflow: hidden。

.carousel-filmstrip 必须设置 display: flex,并为其 transform 属性添加 transition。

.carousel-slide 必须设置 flex-basis: 100%,以确保每个幻灯片都占满“视口”的宽度。

/* --- 1. 基础容器样式 --- */
.carousel-container {
width: 800px;
max-width: 100%;
margin: 40px auto;
border-radius: 10px;
box-shadow: 0 5px 20px rgba(0,0,0,0.1);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;

/* 核心:为导航按钮提供绝对定位的锚点 */
position: relative; 

}

/* --- 2. “视口” 样式 --- */
.carousel-viewport {
width: 100%;
border-radius: 10px;

/* 核心:隐藏所有超出“窗口”的内容 */
overflow: hidden; 

}

/* --- 3. “胶片” 样式 --- /
.carousel-filmstrip {
display: flex;
/
假设有 3 张幻灯片, 宽度就是 300% /
/
(在 JS 中动态设置会更健壮) */
width: 300%;

/* 核心:为“transform”属性添加动画 */
transition: transform 0.5s cubic-bezier(0.77, 0, 0.175, 1);

}

/* --- 4. “幻灯片” 样式 --- /
.carousel-slide {
/
核心:确保每张幻灯片占满“视口” */
width: 100%;
flex-basis: 100%;
flex-shrink: 0;

/* 仅为演示:设置高度和背景色 */
height: 400px;
display: flex;
justify-content: center;
align-items: center;
font-size: 1.5em;
color: #fff;

}
.carousel-slide .slide-content {
background-color: rgba(0,0,0,0.4);
padding: 20px;
border-radius: 8px;
text-align: center;
}
/* 演示背景色 */

slide-1

slide-2

slide-3

/* --- 5. 导航按钮样式 --- /
.carousel-btn {
/
核心:绝对定位于 .carousel-container 之上 */
position: absolute;
top: 50%;
transform: translateY(-50%);

background-color: rgba(0,0,0,0.5);
color: #fff;
border: none;
border-radius: 50%;
width: 45px;
height: 45px;
font-size: 1.5em;
font-weight: bold;
cursor: pointer;
transition: background-color 0.2s ease;
z-index: 10;

}
.carousel-btn:hover {
background-color: rgba(0,0,0,0.8);
}

carousel-btn-prev

carousel-btn-next

/* --- 6. 导航点样式 --- /
.carousel-dots {
/
定位在“视口”之外,但在主容器之内 /
text-align: center;
padding: 15px 0;
}
.carousel-dot {
display: inline-block;
width: 12px;
height: 12px;
background-color: #dfe4ea;
border-radius: 50%;
margin: 0 5px;
cursor: pointer;
transition: background-color 0.2s ease;
}
.carousel-dot:hover {
background-color: #57606f;
}
/
激活状态 */
.carousel-dot.is-active {
background-color: #007bff;
}

第三部分:JS 交互逻辑 (状态管理)

JS 是轮播图的“大脑”。它必须始终追踪一个核心状态:currentIndex (当前幻灯片的索引)。所有的移动和“导航点”的更新都依赖这个状态。

document.addEventListener('DOMContentLoaded', () => {

// --- 1. DOM 元素获取 ---
const filmstrip = document.querySelector('.carousel-filmstrip');
const allSlides = document.querySelectorAll('.carousel-slide');
const totalSlides = allSlides.length;const btnPrev = document.getElementById('carousel-btn-prev');
const btnNext = document.getElementById('carousel-btn-next');const allDots = document.querySelectorAll('.carousel-dot');// --- 2. 状态管理 ---
let currentIndex = 0; // 当前幻灯片的索引 (从 0 开始)
let slideWidthPercent = 100 / totalSlides;// (健壮性) 动态设置胶片宽度
filmstrip.style.width = `${100 * totalSlides}%`;// --- 3. 核心功能函数:移动到指定索引的幻灯片 ---
const goToSlide = (slideIndex) => {// 边界检查 (确保索引在 0 和 totalSlides - 1 之间)if (slideIndex < 0) {slideIndex = totalSlides - 1; // 循环到最后一张} else if (slideIndex >= totalSlides) {slideIndex = 0; // 循环到第一张}// (A) 计算需要偏移的百分比const offsetPercent = -(slideIndex * slideWidthPercent);// (B) 应用 transform 来移动“胶片”filmstrip.style.transform = `translateX(${offsetPercent}%)`;// (C) 更新当前的索引状态currentIndex = slideIndex;// (D) 更新导航点的激活状态allDots.forEach((dot, index) => {if (index === currentIndex) {dot.classList.add('is-active');} else {dot.classList.remove('is-active');}});
};// --- 4. 事件绑定 ---// “下一步”按钮
btnNext.addEventListener('click', () => {goToSlide(currentIndex + 1);
});// “上一步”按钮
btnPrev.addEventListener('click', () => {goToSlide(currentIndex - 1);
});// “导航点”
allDots.forEach((dot) => {dot.addEventListener('click', (e) => {// 从 data-index 属性读取点击的是哪个点const dotIndex = parseInt(e.target.dataset.index);goToSlide(dotIndex);});
});// --- 5. (可选) 自动播放 ---
// let autoPlayInterval = setInterval(() => {
//    goToSlide(currentIndex + 1);
// }, 3000);// (可选) 鼠标悬停时停止自动播放
// const container = document.getElementById('hero-carousel');
// container.addEventListener('mouseenter', () => clearInterval(autoPlayInterval));
// container.addEventListener('mouseleave', () => {
//    autoPlayInterval = setInterval(() => {
//        goToSlide(currentIndex + 1);
//    }, 3000);
// });// --- 6. 初始化 ---
// 确保页面加载时,UI 处于正确的第一张幻灯片状态
goToSlide(0);

});

总结

恭喜!我们完成了一个功能丰富、交互平滑的轮播图。

我们学到了:

HTML: 如何使用“视口 (viewport)” + “胶片 (filmstrip)”的嵌套结构来搭建舞台。

CSS:

如何使用 overflow: hidden 来“裁切”舞台。

如何使用 transform: translateX() 来移动“胶片”,并配合 transition 实现动画。

如何使用 flex-basis: 100% 来确保每个幻灯片占满“视口”。

JS (核心):

如何使用 currentIndex 变量来管理状态。

如何编写一个 goToSlide(index) 的中央函数来驱动所有 UI 变化(胶片移动、导航点更新)。

如何通过 data-* 属性将导航点与幻灯片索引关联起来。

在下一篇文章中,我们将迎来本系列第一个真正“动态”的挑战:异步数据加载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/968040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月教育资源优质学习机品牌哪家好?基于多维评估与行业数据解析

在当今教育信息化浪潮中,优质学习机品牌已成为家庭教育的核心工具,其教育资源的质量直接关系到学生的学习效果与发展潜力。本文面向广大家长、教育工作者及采购决策者,深入剖析其在教育资源整合、学习效率提升、成本…

2025年11月学习机品牌哪家好?基于多维度评估与行业数据解析

在数字化教育浪潮的推动下,学习机已成为现代家庭不可或缺的智能教育工具。本文主要面向中小学生家长、教育从业者及关注智慧教育发展的群体,深入分析其在教育资源均衡化、个性化学习及效率提升方面的核心需求。当前教…

【前端从0到1实战】第6篇:构建“手风琴折叠菜单” (Accordion)

【前端从0到1实战】第6篇:构建“手风琴折叠菜单” (Accordion) 欢迎来到本系列的第二篇。在上一篇中,我们掌握了“Tab 选项卡”的横向切换。今天,我们将构建它的“垂直”版本——手风琴折叠菜单。 这个组件的交互非…

2025年11月小学生学习机品牌哪家好?基于教育科技趋势与用户需求深度解析

在当今注重教育品质的时代,为孩子选择一款合适的学习工具成为许多家庭的关切。对于正处于学习习惯养成关键期的小学生而言,一款专业可靠的学习机至关重要。本文针对家长、教育工作者等目标用户群体,深入分析其核心需…

流固热力学耦合仿真机构优选蓝图心算

项目案例分享 本项目旨在通过高保真度的数值模拟,研究一个燃烧装置在甲烷-氧气非预混燃烧工况下的综合性能。分析重点在于燃烧过程对金属室壁的热影响以及由此引发的结构响应。 项目分析机构》》》蓝图心算成都科技有…

2025/11/16 分享

分享一个有意思的问题 给定一个整数序列 \(a_{1}, a_{2}, \cdots, a_{n}\) ,询问至少需要修改多少个元素,可以使得 \(\forall i \in [2, n],\ a_{i} > a_{i - 1}\) 。 有意思的是由整数的离散性,我们可以看出这实…

教育资源优质学习机品牌全面解析与实用指南:2025年11月最新版TOP5推荐榜单

一、2025年11月TOP5推荐对象全景速览 1、读书郎 推荐星级:★★★★★ 口碑评分:9.9分 核心优势及特点:读书郎学习机以优质教育资源为核心竞争力,拥有二十六年教育领域深耕经验,其教育资源与新课改教材保持权威同步…

小学生学习机品牌全面解析与选购指南:2025年11月最新版TOP10权威推荐

在当今教育信息化快速发展的背景下,小学生学习机作为辅助教育的重要工具,其选择关系到学生的学习效果与身心健康发展。本文针对家长、教育工作者等目标群体,深入分析其核心需求包括学习资源质量、护眼功能、互动体验…

Rust: 面向生产的 hex 替代方案

主流替代方案详解追求迁移便利:选择 base16,API 兼容性最佳 需要丰富功能:选择 data-encoding,支持流式和批量操作 要求极致性能:选择 faster-hex,专为高性能场景优化 嵌入式/编译时需求:选择 const-hex,减少运…

银河麒麟服务器版 TigerVNC 远程桌面完整安装配置指南

银河麒麟服务器版 TigerVNC 远程桌面完整安装配置指南银河麒麟服务器版 TigerVNC 远程桌面完整安装配置指南 1. 安装TigerVNC服务器 # 更新yum仓库 sudo yum update# 安装TigerVNC服务器 sudo yum install tigervnc-se…

2025年塑胶跑道厂家推荐:湖北中奥特体育,预制型塑胶跑道/EPDM塑胶跑道/环保塑胶跑道/混合型塑胶跑道/专业打造环保运动场地

随着全民健身意识不断提升、体育场馆建设加速推进及校园运动设施升级需求增加,塑胶跑道作为核心运动场地设施,已从专业体育场馆逐步普及至学校、社区、公园等多个场景,2025 年市场规模预计持续扩大。但市场增长也带…

十八、sed命令

1、sed 流编辑器 根据事先设计好的一组规则编辑数据流。 sed编辑器根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 sed编辑器会执行下列操作。一次从输入中读取一行数据。 …

别再被VO、BO、PO、DTO、DO绕晕!今天用一段代码把它们讲透

一、先放结论 它们都是“为了隔离变化”而诞生的马甲 缩写英文全称中文直译出现位置核心目的POPersistent Object持久化对象数据库 ↔ 代码一张表一行记录的直接映射DODomain Object领域对象核心业务逻辑层充血模型,封…

2025 最新推荐!装盒机厂家权威榜单发布,覆盖多行业专用设备及创新解决方案内外盒 / 面膜 / 电子产品 / 玩具 / 日用品装盒机厂家推荐

一、装盒机优质品牌推荐榜推荐一:广州科万智能装备有限公司品牌介绍:集设计研发、生产制造、销售服务于一体的综合型企业,拥有 5000 平方厂房及 50 人以上团队,其中技术人员 28 名,具备强大的研发与生产实力。秉持…

2025 年试验仪厂家最新推荐榜:乳化沥青 / 沥青混合料 / 高低温等全品类检测设备权威品牌排行榜马歇尔稳定度/沥青动力黏度/高低温试验仪公司推荐

在工程质量检测领域,试验仪的精准度直接决定数据可靠性与工程安全,而全球市场品牌繁杂、质量参差不齐的现状,让采购方面临严峻挑战。本次推荐榜依托国际测试仪器协会(ITA)2025 年度测评数据(参与测评品牌超 200 …

2025少儿免费编程体验课怎么选?5大优质机构推荐,家长收藏

2025少儿免费编程体验课怎么选?5大优质机构推荐,家长收藏随着人工智能时代的加速到来,少儿编程教育已成为提升孩子核心素养的重要方向,免费编程体验课则成为家长考察机构实力的关键窗口。优质的免费编程体验课不仅…

2025年11月复合型塑胶跑道厂家最新推荐,透气型塑胶跑道/自结纹塑胶跑道/老国标塑胶跑道/全塑型塑胶跑道/综合表现突出厂家推荐

当前学校、体育场馆等场景对塑胶跑道设备的需求日益精细化,环保标准、耐久性、安全性能等核心诉求不断提升,但市场上设备厂家资质参差不齐,部分产品存在环保不达标、物理性能不足、使用寿命短等问题,导致采购方在选…

2025 最新推荐折盒机制造厂家权威排行榜:半自动 / 全自动 / 定制型设备优选,国际测评认证实力品牌全解析

引言 折盒机作为现代包装工业的核心设备,其技术水平与稳定性直接决定生产效率与包装品质。据国际包装机械协会(IPMA)最新测评数据显示,全球折盒机市场中,仅 32% 的品牌能满足 “连续 800 小时无故障运行”“自动化…

2025 最新推荐!自动包装生产线厂家权威榜单:食品 / 日化 / 智能 / 柔性等多场景高效解决方案测评发布

引言 在全球制造业智能化转型浪潮下,自动包装生产线作为提升生产效率、保障品质一致性的核心装备,市场需求持续攀升。然而行业乱象仍存,产品质量良莠不齐、场景适配性不足、售后服务滞后等问题,严重制约企业产能升…

2025年11月国内旧房翻新公司权威排行:专业服务商综合实力大比拼

摘要 随着城市化进程加速和居民生活品质提升,旧房翻新行业在2025年迎来爆发式增长。据统计,我国旧房翻新市场规模已突破万亿,年增长率达18.7%。本文基于行业数据、用户口碑和服务能力,对国内优质旧房翻新服务商进行…