Html+Css+JavaScript实现完整的轮播图功能

news2024/12/23 23:32:33

概要

这个案例具备常见轮播图完整的功能,大家可以根据自己的需求去修改; 代码可以直接复制运行,需要安装sass

主要功能:

(1)鼠标移入轮播图,左右两边的按钮出现,离开则隐藏按钮;(CSS完成)

(2)点击左侧按钮,图片向右播放一张,右侧按钮同理;

(3)图片播放的同时,下面的小圆圈也会随之变化;

(4)点击小圆圈,播放相应的图片;

(5)鼠标移入小圆圈,播放相应的图片(看需求是要点击还是移入,把click改成mouseenter)

(6)鼠标移出轮播图自动播放图片

(7)鼠标移入轮播图暂停播放图片

页面效果:

大家觉得有帮助的话可以点个赞支持下,谢谢啦~

完整代码:

一、Css样式,使用sass预编译器

<style >
    /* 默认样式 */
    * {
        margin: 0;
        padding: 0;

        a {
            text-decoration: none;
        }
        li {
            list-style: none;
        }
    }

    /* 轮播图盒子 */
    .box {
        width: 600px;
        height: 350px;
        margin: 70px auto;
        position: relative;
        overflow: hidden;

        /* 上、下一页 */
        .prev,
        .next {
            opacity: 0;
            display: inline-block;
            cursor: pointer;
            width: 50px;
            height: 50px;
            position: absolute;
            top: 50%;
            color: #d2d0d0;
            z-index: 33;
            text-align: center;
            font-size: 40px;
            transform: translateY(-25px);
        }

        /* 上一页不同的属性 */
        .prev {
            left: 0;
            border-radius: 0 25% 25% 0;
        }

        /* 下一页不同的属性 */
        .next {
            right: 0;
            border-radius: 25% 0 0 25%;
        }

        /* 图片容器 */
        .images {
            position: absolute;
            top: 0;
            left: 0;
            width: 1000%;

            /* 图片 */
            li {
                list-style: none;
                float: left;

                img {
                    width: 600px;
                    height: 350px;
                }
            }
        }

        /* 小圆点盒子 */
        .dots {
            position: absolute;
            bottom: 10px;
            left: 50%;
            height: 13px;
            transform: translateX(-50%);
            background: rgba(255, 255, 255, .3);
            border-radius: 7px;
            display: flex;

            /* 小圆点 */
            li {
                width: 10px;
                height: 10px;
                border-radius: 50%;
                border-color: white;
                background-color: rgb(0, 0, 0, 0.2);
                margin: 2px 5px;
                cursor: pointer;
            }

            /* 选择的小圆点 */
            .active {
                background-color: rgb(247, 243, 243);
            }
        }
    }

    /* 鼠标移入盒子显示上、下按钮 */
    .box:hover .prev,
    .box:hover .next {
        opacity: 1;
    }

    /* 鼠标移入上、下按钮,背景模糊 */
    .box .prev:hover,
    .box .next:hover {
        background-color: rgba(0, 0, 0, 0.2);
    }
</style>

二、Html结构

<body>
    <div class="box">
        <!-- 左箭头 -->
        <a href="javascript:;" class="prev"> &lt;</a>
        <!-- 右箭头 -->
        <a href="javascript:;" class="next"> &gt;</a>
        <ul class="images">
            <li><a href="#"><img src="./src/assets/00.jpg" alt="轮播图图片"></a></li>
            <li><a href="#"><img src="./src/assets/11.jpg" alt="轮播图图片"></a></li>
            <li><a href="#"><img src="./src/assets/12.jpg" alt="轮播图图片"></a></li>
            <li><a href="#"><img src="./src/assets/13.jpg" alt="轮播图图片"></a></li>
            <li><a href="#"><img src="./src/assets/15.jpg" alt="轮播图图片"></a></li>
            <li><a href="#"><img src="./src/assets/16.jpg" alt="轮播图图片"></a></li>
        </ul>
        <ul class="dots">
            <!-- li 用js动态生成-->
        </ul>
    </div>
</body>

三、JavaScript

<script>
    /* 功能需求
    (1)当鼠标经过轮播图,左右两边的按钮出现,离开则隐藏按钮;(CSS完成)
    (2)点击左侧按钮,图片向右播放一张,右侧同理;
    (3)图片播放的同时,下面的小圆圈也会随之变化;
    (4)点击小圆圈,可以播放相应的图片;
    (5)鼠标移入小圆圈,可以播放相应的图片(看需求是要点击还是移入,把click改成mouseenter)
    (6)鼠标移出轮播图会自动播放图片
    (7)鼠标移入轮播图会暂停播放图片
    */
    window.addEventListener('load', function () {
        // 图片的下标
        var slideIndex = 0;
        //circle 控制小圆圈的播放
        var circle = 0;
        //获取小圆圈盒子
        var dots = document.querySelector('.dots');
        //获取所有图片
        var images = document.querySelector('.images');
        //获取轮播图容器
        var box = document.querySelector('.box')
        //获取轮播图容器宽度
        var box_width = box.offsetWidth;

        //1.获取上、下一页并添加点击事件
        var prev = document.querySelector(".prev")
        var next = document.querySelector(".next")
        //上一页
        prev.addEventListener("click", function () {
            if (slideIndex == 0) {//已经第一页了,再上一页就该是最后一页
                slideIndex = images.children.length - 1
                images.style.left = -slideIndex * box_width + 'px';
            }
            slideIndex--;
            animate(images, -slideIndex * box_width)
            // 小圆圈跟随一起变化
            circle--;
            circle = circle < 0 ? dots.children.length - 1 : circle;
            //调用函数
            circleChange();
        });
        //下一页
        next.addEventListener("click", function () {
            if (slideIndex == images.children.length - 1) {//已经最后一页了,再下一页就该是第一页
                images.style.left = 0;
                slideIndex = 0;
            }
            slideIndex++;
            animate(images, -slideIndex * box_width);
            // 小圆圈跟随一起变化
            circle++;
            if (circle == dots.children.length) {
                circle = 0;
            }
            circleChange();
        });

        // 2.动态生成小圆圈 有几张图片,就生成几个小圆圈
        var dots = document.querySelector('.dots');
        for (var i = 0; i < images.children.length; i++) {
            //创建一个小li
            var li = document.createElement('li');
            //记录当前小圆圈的索引号 通过创建自定义属性来做
            li.setAttribute('index', i);
            dots.appendChild(li);
            //小圆圈的排他思想 在生成小圆圈的同时绑定点击事件
            li.addEventListener('click', function () {
                for (var i = 0; i < dots.children.length; i++) {
                    dots.children[i].className = ' '; //清空样式
                }
                this.className = 'active';
                //点击小圆圈,移动图片,本质移动的是ul
                //ul 的移动距离 就是小圆圈的索引号 * 图片的宽度 注意是负值
                // 当我们点击了某个小li 就拿到它的index属性
                var index = this.getAttribute('index');
                //当我们点击了某个小li 就要把这个小li 的index给slideIndex
                slideIndex = index;
                circle = index;
                animate(images, -slideIndex * box_width);
            })
        }
        //把dots 里面的第一个小li设置类名为 active
        dots.children[0].className = 'active';
        // 实现滑动到最后一张照片时 可以平滑地过渡到第一张,克隆第一张图片 放在ul最后面,在其后克隆小圆点不会多
        var first = images.children[0].cloneNode(true);
        images.appendChild(first);

        //3.点击小圆圈添加激活样式
        function circleChange() {
            for (var i = 0; i < dots.children.length; i++) {
                dots.children[i].className = '';
            }
            dots.children[circle].className = 'active';
        }

        //定时器自动播放3S
        var timer = setInterval(function () {
            next.click();
        }, 3000);

        //3.绑定鼠标移入移出事件
        //鼠标移入,停止播放,清除计时器
        box.addEventListener('mouseenter', function () {
            clearInterval(timer);
            timer = null;//清除计时器
        });
        //鼠标离开,轮播图自动切换 相当于点击右箭头
        box.addEventListener('mouseleave', function () {
            timer = setInterval(function () {
                // 手动调用事件
                next.click();
            }, 3000);
        });

        //轮播图播放动画
        function animate(obj, target, callback) {
            //让元素只有一个定时器在执行,需要清除以前的定时器
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                var step = (target - obj.offsetLeft) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                if (obj.offsetLeft == target) {
                    //停止动画 本质是停止定时器
                    clearInterval(obj.timer)
                    //回调函数写到定时器结束位置
                    if (callback) {
                        callback();
                    }
                }
                //把每次加1这个步长值改为一个慢慢变小的值
                obj.style.left = obj.offsetLeft + step + 'px';
            }, 15);
        }

        next.click();
    })
</script>

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

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

相关文章

maven私有仓库和公有仓库混合使用

<?xml version"1.0" encoding"UTF-8"?> <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/SETTINGS/1…

测量鼠标DPI的三种方法,总有一种适合你

DPI(dots per inch)代表每英寸点数,是一种用于各种技术设备(包括打印机)的测量方法,但对于鼠标来说,指的是鼠标在桌面上移动1英寸的距离的同时,鼠标光标能够在屏幕上移动多少“点”。 许多游戏鼠标都有按钮,可以让你在玩游戏时动态切换DPI,但如果你不知道鼠标的DPI怎…

黑马程序员——javase基础——day01——Java入门IDEA基础语法

目录&#xff1a; Java入门 Java简介JDK的下载和安装第一个程序常见问题常用DOS命令Path环境变量IDEA IDEA概述和安装IDEA中HelloWorldIDEA中基本配置&注释IDEA中常用快捷键IDEA中模块操作基础语法 字面量数据类型变量变量的案例 手机信息描述疫情防控信息采集表变量的注意…

引领未来:话务数据展示大屏助力企业决策

在当今信息爆炸的时代&#xff0c;企业需要一个直观、高效的数据展示平台来帮助他们快速获取、分析和决策。山海鲸可视化话务数据展示大屏&#xff0c;就是这样一款引领企业迈向高效决策新纪元的产品。 一、什么是山海鲸可视化话务数据展示大屏&#xff1f; 山海鲸可视化是一款…

Androidmanifest文件加固和对抗

前言 恶意软件为了不让我们很容易反编译一个apk&#xff0c;会对androidmanifest文件进行魔改加固&#xff0c;本文探索androidmanifest加固的常见手法以及对抗方法。这里提供一个恶意样本的androidmanifest.xml文件&#xff0c;我们学完之后可以动手实践。 1、Androidmanife…

LLM:Scaling Laws for Neural Language Models (中)

核心结论 1&#xff1a;LLM模型的性能主要与计算量C&#xff0c;模型参数量N和数据大小D三者相关&#xff0c;而与模型的具体结构 (层数/深度/宽度) 基本无关。三者满足: C ≈ 6ND 2. 为了提升模型性能&#xff0c;模型参数量N和数据大小D需要同步放大&#xff0c;但模型和数…

这三款内网管理监控软件让你事半功倍

在当今高度信息化的时代&#xff0c;企业内部网络&#xff08;内网&#xff09;已经成为企业运营和发展的重要支撑。 然而&#xff0c;随着内网规模的扩大和复杂性的增加&#xff0c;内网的管理和监控也变得越来越困难。 为了提高内网的管理效率和工作效率&#xff0c;许多企…

在Linux上使用PHP-FPM与Nginx实现高效的HTTP处理

当谈到高效的HTTP处理时&#xff0c;PHP-FPM&#xff08;FastCGI进程管理器&#xff09;与Nginx的结合是许多web开发者的首选。这种组合提供了出色的性能、可扩展性和稳定性&#xff0c;尤其适用于高流量的网站和应用程序。 1. 为什么选择PHP-FPM与Nginx&#xff1f; 性能优化…

excel(vab)删除空行

删除第一、二、三列位空的所有行&#xff08;8000)行范围以内 代码如下&#xff1a; Sub Macro1()Dim hang As Integer For hang 8000 To 1 Step -1If Sheet1.Cells(hang, 1) "" And Sheet1.Cells(hang, 2) "" And Sheet1.Cells(hang, 3) "&quo…

2024 基于 Rust 的 linter 工具速度很快

2024 年 Web 工具的一大趋势是使用 Rust 重写现有工具。Rust 是一种出色的编程语言&#xff0c;能生成运行速度惊人的二进制文件&#xff0c;且与其它 Web 工具的互操作性极佳&#xff0c;这得益于 WebAssembly 的帮助。swc 和 Turbopack 等工具的速度提升为快速开发体验带来了…

代码随想录算法训练营第24天 | 理论基础 77. 组合

目录 理论基础 什么是回溯法 回溯法的效率 回溯法解决的问题 如何理解回溯法 回溯法模板 77. 组合 &#x1f4a1;解题思路 &#x1f4bb;实现代码 理论基础 什么是回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。 回溯法的效率 虽然回溯法很难&#xff…

Nestjs 笔记

一、模块添加版本 1、添加如下代码 2、访问方式 http://localhost:3000/v1/list 二、跨域处理 1、安装依赖 npm install corsnpm install types/cors -D 2、app.module.ts 添加代码 import { NestFactory } from nestjs/core; import { AppModule } from ./app.module; i…

QQ视频聊天怎么录制

虽然微信几乎成为主流的聊天工具&#xff0c;但是不可否认的是QQ视频聊天仍有他的趣味所在&#xff0c;多种特效在视频的时候增加乐趣&#xff0c;那么如果QQ视频聊天的时候可以录制聊天内容吗&#xff1f;当然是可以的。可以使用电脑自带的视频录制工具&#xff0c;或者QQ自带…

k8s的存储卷、数据卷---动态PV创建

当发布PVC之后可以生成PV&#xff0c;还可以在动态服务器上直接生成挂载目录。PVC直接绑定和使用PV。 动态PV需要两个组件 存储卷插件&#xff1a;Provisioner(存储分配器)根据定义的属性创建PV StorageClass&#xff1a;定义属性 存储卷插件 存储卷插件&#xff1a;k8s本…

电脑安装 Python提示“api-ms-win-crt-process-l1-1-0.dll文件丢失,程序无法启动”,快速修复方法,完美解决

在windows 10系统安装完python后&#xff0c;启动的时候&#xff0c;Windows会弹出错误提示框“无法启动此程序&#xff0c;因为计算机中丢失了api-ms-win-crt-process-l1-1-0.dll&#xff0c;尝试重新安装该程序以解决此问题。” api-ms-win-crt-process-l1-1-0.dll是一个动态…

SCSI/UFS储存 基础

一、UFS协议 UniPro 的上面就是 UTP 和 SCSI 命令集&#xff0c;由于涉及的 SCSI 命令是很大一块需要单独来讲&#xff0c;所以这里只简单两笔。正如最开始提到的&#xff0c;UTP 和 SCSI 是属于 SCSI 这部分&#xff0c;在 JEDEC 的标准里能找到它们的具体说明。 UTP&#xf…

仅用三张图片实现任意场景三维重建:ReconFusion

论文题目&#xff1a; ReconFusion: 3D Reconstruction with Diffusion Priors 论文作者&#xff1a; Rundi Wu, Ben Mildenhall, Philipp Henzler, Keunhong Park, Ruiqi Gao, Daniel Watson, Pratul P. Srinivasan, Dor Verbin, Jonathan T. Barron, Ben Poole, Aleksande…

Java - Lombok的添加和使用详解

目录 &#x1f436;6.1 lombok介绍 &#x1f436;6.2 lombok使用 1. &#x1f959;添加方法一 2. &#x1f959;添加方法2 3. 使用 &#x1f436;6.3 lombok常用注解 1. &#x1f959;Getter和Setter 2. &#x1f959;ToString 3. &#x1f959;NoArgsConstructor和Al…

随笔03 笔记整理

图源&#xff1a;文心一言 关于我的考研与信息安全类博文整理~&#x1f95d;&#x1f95d; 第1版&#xff1a;整理考研类博文~&#x1f9e9;&#x1f9e9; 第2版&#xff1a;提前列出博文链接&#xff0c;以便小伙伴查阅~&#x1f9e9;&#x1f9e9; 第3版&#xff1a;整理We…

光彩耀新年,戴森美发科技品类,见证成长美一面

龙年将至&#xff0c;祥瑞满天&#xff0c;新年曙光寓意着好运从「头」开始&#xff0c;同时也承载着人们对新一年的期许。值此之际&#xff0c;戴森中国美发科技品类正式发布全新蓝彩朱红色系列产品&#xff0c;为新年注入活力与希望&#xff0c;携手消费者一起开启护发造型新…