【HTML】制作一个简易图片轮播器

news2024/10/10 20:31:52

1. 轮播器效果图

1. 正常状态下每 1.5秒 自动轮播下张图片,轮播结束从头开始重复

在这里插入图片描述

2. 鼠标悬停时停止轮播,可以选择左右图片切换

在这里插入图片描述

2. HTML 结构

  1. 文档类型声明<!DOCTYPE html> 声明文档类型为HTML5。
  2. HTML标签<html lang="zh-CN"> 表示这是一个中文的HTML文档。
  3. 头部<head> 标签内包含了文档的元数据。
    • <meta charset="UTF-8"> 指定文档的字符编码为UTF-8。
    • <meta name="viewport" content="width=device-width, initial-scale=1.0"> 用于优化移动设备上的显示效果。
    • <title> 标签定义了文档的标题,这里为“Picture carousel”。
  4. 样式<style> 标签内定义了CSS样式,用于美化轮播图。
  5. 主体<body> 标签内包含了页面的所有内容。
    • .slider 类定义了轮播图的整体样式和位置。
    • .slide-track 类定义了包含所有幻灯片的轨道。
    • .slide 类定义了单个幻灯片的样式。
    • .prev.next 类定义了上一张和下一张图片的控制按钮样式。
    • .indicators 类定义了轮播指示器的容器样式。
    • .indicator 类定义了单个指示器的样式。
  6. 图片和按钮
    • <div class="slide"> 标签包含了图片。
    • <span class="prev"><span class="next"> 是控制按钮,点击时调用JavaScript函数 moveSlide
  7. 指示器容器<div class="indicators"></div> 用于存放指示器。

3. CSS 样式

  • .slider:定义了轮播图容器的宽度、边距、溢出隐藏、相对定位和阴影效果。
  • .slide-track:定义了轨道的布局方式(不换行)、过渡效果和将改变的内容(优化性能)。
  • .slide:定义了幻灯片的大小、背景、文字样式和过渡效果。
  • .slide img:定义了图片的填充方式,使其覆盖整个幻灯片区域。
  • .prev, .next:定义了控制按钮的基本样式,包括指针、定位、颜色、背景和过渡效果。
  • .slider:hover .prev, .slider:hover .next:定义了鼠标悬停时控制按钮的透明度。
  • .indicators:定义了指示器容器的位置和文本对齐方式。
  • .indicator:定义了单个指示器的大小、边距、背景色、圆角和指针样式。
  • .indicator.active:定义了激活状态下的指示器背景色。

4. JavaScript 脚本

  • 变量定义:定义了当前索引、幻灯片元素、总幻灯片数、幻灯片宽度和相关DOM元素。
  • 创建指示器:循环创建指示器,并为每个指示器添加点击事件,用于切换幻灯片。
  • 更新幻灯片位置updateSlidePosition 函数根据当前索引更新幻灯片轨道的位置。
  • 更新指示器状态updateIndicators 函数用于更新指示器的激活状态。
  • 移动幻灯片moveSlide 函数用于根据传入的方向参数来更新当前索引,并调用更新函数。
  • 自动轮播:设置定时器 autoSlideInterval,每隔一定时间自动切换幻灯片。
  • 鼠标悬停事件:为轮播图容器添加鼠标悬停事件监听器,用于在鼠标悬停时停止自动轮播,在鼠标离开时重新开始。

4. 源代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Picture carousel</title>
    <style>
        .slider {
            width: 600px;
            margin: 50px auto;
            overflow: hidden;
            position: relative;
            box-shadow: 0 4px 10px rgba(0,0,0,0.4);
        }
        .slide-track {
            white-space: nowrap;
            transition: transform 0.5s ease-in-out;
            will-change: transform;
        }
        .slide {
            display: inline-block;
            width: 600px;
            height: 300px;
            background: #000;
            color: #fff;
            text-align: center;
            line-height: 300px;
            font-size: 30px;
            transition: opacity 0.5s ease-in-out;
        }
        .slide img {
            width: 100%;
            height: 100%;
            object-fit: cover;
        }
        .prev, .next {
            cursor: pointer;
            position: absolute;
            top: 50%;
            transform: translateY(-50%);
            font-size: 18px;
            color: white;
            background: rgba(0, 0, 0, 0.5);
            padding: 10px;
            z-index: 100;
            opacity: 0;
            transition: opacity 0.3s ease-in-out;
        }
        .next {
            right: 0;
        }
        .slider:hover .prev,
        .slider:hover .next {
            opacity: 1;
        }
        .indicators {
            position: absolute;
            bottom: 10px;
            left: 50%;
            transform: translateX(-50%);
            text-align: center;
        }
        .indicator {
            display: inline-block;
            width: 10px;
            height: 10px;
            margin: 0 5px;
            background-color: #bbb;
            border-radius: 50%;
            cursor: pointer;
        }
        .indicator.active {
            background-color: #717171;
        }
    </style>
</head>
<body>
    <div class="slider">
        <div class="slide-track">
        <!-- 这里替换为自己的图片地址 -->
            <div class="slide"><img src="./CSS.jpg" alt="Image 1"></div>
            <div class="slide"><img src="./nginx.jpg" alt="Image 2"></div>
            <div class="slide"><img src="./ssl.jpg" alt="Image 3"></div>
            <!-- 可以继续添加更多图片 -->
        </div>
        <span class="prev" onclick="moveSlide(-1)">&#10094;</span>
        <span class="next" onclick="moveSlide(1)">&#10095;</span>
        <div class="indicators"></div>
    </div>

    <script>
        let currentIndex = 0;
        const slides = document.querySelectorAll('.slide');
        const totalSlides = slides.length;
        const slideWidth = 600; // 根据图片宽度设置
        const slideTrack = document.querySelector('.slide-track');
        const indicatorsContainer = document.querySelector('.indicators');

        // 创建指示器
        for (let i = 0; i < totalSlides; i++) {
            const indicator = document.createElement('div');
            indicator.classList.add('indicator');
            if (i === 0) indicator.classList.add('active');
            indicator.addEventListener('click', () => {
                currentIndex = i;
                updateSlidePosition();
                updateIndicators();
            });
            indicatorsContainer.appendChild(indicator);
        }

        function updateSlidePosition() {
            slideTrack.style.transform = `translateX(-${currentIndex * slideWidth}px)`;
        }

        function updateIndicators() {
            document.querySelectorAll('.indicator').forEach((indicator, index) => {
                if (index === currentIndex) {
                    indicator.classList.add('active');
                } else {
                    indicator.classList.remove('active');
                }
            });
        }

        function moveSlide(direction) {
            currentIndex += direction;
            if (currentIndex >= totalSlides) {
                currentIndex = 0;
            } else if (currentIndex < 0) {
                currentIndex = totalSlides - 1;
            }
            updateSlidePosition();
            updateIndicators();
        }

        // 自动轮播
        let autoSlideInterval = setInterval(() => {
            moveSlide(1);
        }, 2500); // 设置轮播间隔为 2秒

        // 鼠标悬停时停止自动轮播
        const slider = document.querySelector('.slider');
        slider.addEventListener('mouseenter', () => clearInterval(autoSlideInterval));
        slider.addEventListener('mouseleave', () => autoSlideInterval = setInterval(() => moveSlide(1), 2000));

        // 初始化轮播位置
        updateSlidePosition();
    </script>
</body>
</html>

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

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

相关文章

2024 闽盾杯-黑盾赛道WP

CRYPTO 签到题-学会SM https://www.json.cn/encrypt/sm3 题目要求小写所以需要转换一下 或者脚本&#xff1a; import hashlib message "heidun2024" hash_object hashlib.new(sm3) hash_object.update(message.encode(utf-8)) hash_value hash_object.hexdigest(…

【STM32单片机_(HAL库)】4-5-3【定时器TIM】【感应开关盖垃圾桶项目】项目实现

1.项目需求 以下几个事件触发时&#xff0c;垃圾桶自动开盖&#xff0c;并伴随蜂鸣器短响一声&#xff0c;同时 LED 灯闪烁一下&#xff0c;2秒后自动关盖&#xff1a; 检测到有人靠近检测到有震动按下按键 KEY1 2.硬件 STM32单片机最小系统震动传感器模块蜂鸣器模块&#…

对象比较工具类:实现对业务的修改记录保存(对象字段差异对比)

测试 1&#xff1a;User类 Data NoArgsConstructor AllArgsConstructor public class User {FieldLabel("姓名")private String name;FieldLabel("年龄")private Integer age;FieldLabel("手机")private String phone;FieldLabel("手机号…

宠物空气净化器哪个牌子吸毛好?希喂、IAM、352真实测评

前段时间忙活了个大工程——热门宠物空气净化器大横评&#xff0c;通过多方位的测试&#xff0c;帮助不少朋友解决了宠物空气净化器的选购难题。 但我们还不局限于此&#xff0c;在从事家电行业这些年间&#xff0c;我们还花费大价钱购置一堆产品实测体验过各类大小家电产品&a…

Spring Boot教学资源库:从入门到精通

1绪 论 1.1研究背景 目前&#xff0c;在网络大环境下&#xff0c;越来越多高校开始实行网络教学&#xff0c;利用网络教学方式有利于学生更好的学习。 网络教学是指以计算机及网络为基础&#xff0c;来实现教学资源的上传、存储、传播和共享的教学手段。它是一种教学活动&#…

PyQt5 基于paho-mqtt库 实现MQTT通信

PyQt5 基于paho-mqtt库 实现MQTT通信 paho-mqtt安装paho-mqtt库综合示例错误处理 paho-mqtt paho-mqtt官网文档 安装paho-mqtt库 pip install paho-mqtt 综合示例 封装MQTT类订阅消息发布消息信号方式接收处理MQTT消息 import paho.mqtt.client as mqtt import sys import …

在线绘图工具drawio,visio的平替

Draw.io&#xff1a;灵活高效的在线绘图工具推荐 在工作和项目管理中&#xff0c;流程图、架构图和思维导图等可视化图表是非常重要的沟通工具。Draw.io&#xff08;现更名为diagrams.net&#xff09;是一个强大且免费的在线绘图工具&#xff0c;适用于创建各种类型的图表。它功…

YOLOv11训练自己的数据集,YOLOv11网络解析

1 训练自己的数据集 在github搜索ultralytics并下载。 GitHub - ultralytics/ultralytics: Ultralytics YOLO11 &#x1f680; 环境配置不再赘述&#xff0c;本地配置自行搜索教程&#xff0c;若使用云服务器配置更为简单。 数据标注 pip install labelimg启动标注工具 la…

【PGCCC】在 Postgres 上构建图像搜索引擎

我最近看到的最有趣的电子商务功能之一是能够搜索与我手机上的图片相似的产品。例如&#xff0c;我可以拍一双鞋或其他产品的照片&#xff0c;然后搜索产品目录以查找类似商品。使用这样的功能可以是一个相当简单的项目&#xff0c;只要有合适的工具。如果我们可以将问题定义为…

Pycharm设置相同变量的背景颜色

在 PyCharm 中设置鼠标点击某个变量时&#xff0c;代码其他地方相同变量的背景颜色&#xff0c;可以通过调整颜色方案中的相关设置来实现。以下是详细步骤&#xff1a; 打开 PyCharm&#xff0c;选择 File -> Settings&#xff08;在 Windows/Linux 上&#xff09;或 PyChar…

基于 CSS Grid 的简易拖拉拽 Vue3 组件,从代码到NPM发布(1)- 拖拉拽交互

基于特定的应用场景&#xff0c;需要在页面中以网格的方式&#xff0c;实现目标组件在网格中可以进行拖拉拽、修改大小等交互。本章开始分享如何一步步从代码设计&#xff0c;最后到如何在 NPM 上发布。 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug…

全网最详细k8s搭建部署

目录 Kubernetes的功能&#xff1a; Kubernetes的特点&#xff1a; 1. 安装要求 2. 部署内容 1、系统环境准备 2、所有禁用swap和本地解析 3、仓库配置&#xff0c;所有安装docker 4、所有节点设定docker的资源管理模式为systemd 5、所有阶段复制harbor仓库中的证书并…

一款电子产品图册转换器

​随着科技的不断发展&#xff0c;电子产品已经成为我们生活中不可或缺的一部分。无论是手机、平板电脑还是智能家居&#xff0c;它们都离不开电子图册的支撑。一款优秀的电子产品图册转换器&#xff0c;可以帮助我们轻松实现电子图册的转换&#xff0c;为我们的生活和工作带来…

AlphaFold加冕诺奖,DeepMind CEO获奖感言:最优秀的科学家与AI配合,将完成令人难以置信的工作

继「AI 教父」摘冠 2024 年诺贝尔物理学奖后&#xff0c;AI 再下一城&#xff0c;获得了今年的诺贝尔化学奖。 北京时间 10 月 9 日&#xff0c;瑞典皇家科学院宣布了 2024 年诺贝尔化学奖的归属&#xff0c;一半授予 David Baker&#xff0c; 以表彰其在计算蛋白设计方面的贡…

python实现音频文件mp3/m4a转.wav + windows安装ffmpeg

近期在尝试使用大模型进行音频降噪、人声分离。抱脸上的模型几乎统一输入需求都是.wav&#xff0c;直接贴代码吧 ps:使用这段代码需要提前安装好ffmpeg(安装教程请往下拉) from pydub import AudioSegment# 加载.m4a文件 audio AudioSegment.from_file(r"你文件的路径&…

Pycharm使用CV2

1、windows下已经安装好python3以及opencv2 2、安装并打开pycharm 环境中装好的包就能显示出来了&#xff0c;就可以去调用cv2的接口了

TCP/IP相关

1、关于三次握手、四次挥手和TCP的11种状态&#xff1a; 记住这张图就行了&#xff1a; 2、关于慢启动、拥塞避免、超时重传、快速重传、快速恢复 记住这张图就行了&#xff1a; 一些名词解释&#xff1a; MSS&#xff1a;Maximum Segment Size&#xff0c;最大报文长度 RT…

力扣 1206. 设计跳表

Problem: 1206. 设计跳表 &#x1f469;‍&#x1f3eb; 参考题解 class Skiplist {// 定义跳表的最大层数int level 10;// 定义跳表节点类class Node {int val; // 节点值Node[] ne new Node[level]; // 节点的下一跳节点数组&#xff0c;支持多级索引// 构造函数&#xf…

深度学习之卷积CONV2D

文章目录 1.学习目的2.填充与步幅2.1填充2.2 步幅 3.总结 1.学习目的 卷积听起来简单&#xff0c;事实上不简单&#xff0c;需要多加练习 2.填充与步幅 在前面的例子 图6.2.1中&#xff0c;输入的高度和宽度都为3&#xff0c;卷积核的高度和宽度都为2&#xff0c;生成的输出…

用Python将HTML转换为Excel文件

在数据处理和分析的过程中&#xff0c;经常需要从网页上抓取信息&#xff0c;并将其转换为更易于操作的格式。HTML表格作为一种常见的数据展示方式&#xff0c;在线报告、统计资料等场景中广泛存在&#xff0c;但其结构化程度较低&#xff0c;不利于进一步的数据清洗和分析。将…