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

概要

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前后端的那些事】开源!treeSelect树形结构数据展示

文章目录 tree-selector1. 新增表单组件2. 在父组件中引用3. 父组件添加新增按钮4. 树形组件4.1 前端代码4.2 后端代码 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&#xff0c;录视频把这些内容记录下。但这些功能太零碎&#xff0c…

qemu、virt-manager克隆虚拟机

前提 必须先关闭虚拟机&#xff0c;不然克隆按钮是灰的&#xff0c;不能点击 克隆虚拟机 选择虚拟机--克隆 点击克隆 等待完成克隆 下图说明已经克隆成功 运行虚拟机

IntelliJ IDEA安装来了

IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超…

接口interface--java学习笔记

认识接口 java提供了一个关键字interface&#xff0c;用这个关键字可以定义出一个特殊的结构&#xff1a;接口在接口里面定义的变量&#xff0c;不管加不加public static final修饰都默认为常量&#xff0c;必须赋初值在接口里面定义的方法&#xff0c;不管加不加public abstr…

Java 10_000 代表什么意思? 数字里面混夹着下划线?

先放一张图 &#xff0c;这到底是sleep了多久&#xff1f; public static void main(String[] args) {int a 10_000; System.out.println(a); // 10000} java 7 的 特性 &#xff1a;https://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals…

SCSI/UFS储存 基础

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

第一篇:node的背景及版本的检查

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 前言 Node.js 是一个基于 Chrome V8 JavaScript 引擎…

如何使用Docker一键部署WBO白板并实现固定公网地址远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

机器学习算法实战案例:VMD-LSTM实现单变量多步光伏预测

文章目录 机器学习算法实战案例系列答疑&技术交流1 数据处理1.1 导入库文件1.2 导入数据集1.3 缺失值分析 2 VMD经验模态分解3 构造训练数据4 LSTM模型训练5 预测 机器学习算法实战案例系列 机器学习算法实战案例&#xff1a;确实可以封神了&#xff0c;时间序列预测算法最…

《MyBatis》-- 流式查询内存性能优化-单条数据加工

阿丹-需求/场景&#xff1a; 在项目场景中涉及到数据二次加工。需要将单个对象数据转为按照规定的数据字典的转换。以及需要转换数据结构。从对象转换为按照规定的值和规则的数组。 因为要写入csv文件&#xff0c;涉及到文件的输出流。 之前讨论针对的解决方案&#xff1a; …

统计学R语言 实验3 点估计

统计学R语言 实验3 点估计 一、实验目的 1. 掌握理解点估计的相关概念和方法。 2. 掌握理解点估计的估计质量好坏判断方法。 3. 熟悉R语言等语言的集成开发环境。 二、实验分析与内容 某灯泡厂从某日生产的一批灯泡中抽取10个灯泡进行寿命试验&#xff0c;得到灯泡寿命&…

鸿蒙开发笔记(七):应用状态管理,LocalStorage及AppStorage的使用

开发者要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级别的状态管理的概念。ArkTS根据不同特性&#xff0c;提供了多种应用状态管理的能力&#xff1a; LocalStorage&#xff1a;页面级UI状态存储&#xff0c;通常用于UIAbility内、页面间的…

FPGA 高端项目:基于 SGMII 接口的 UDP 协议栈,提供2套工程源码和技术支持

目录 1、前言给读者的一封信免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本本协议栈的 25G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、…

JRT核心竞争力

如果说JRT业务脚本化和发部署简单和打印导出客户端都不足以抵挡Spring用的人多的优势的话。那么这一篇让DolerGet给你一个选择JRT的理由&#xff0c;借助JRT自我实现的ORM&#xff0c;JRT有能力完全把控更新数据和删除数据的口径&#xff0c;和能够准确知道哪些是热点数据&…

细说JavaScript内置对象(JavaScript内置对象详解)

一、String对象 1、简单上手 2、构造方法 3、其他方法 3.1、charAt() 3.2、indexOf() 3.3、split() 3.4、substring() 3.5、substr() 4、实际操作 二、Math对象 1、简单上手 2、对象属性 3、对象方法 4、实际操作 三、Date对象 1、简单上手 2、构造方法 3、实…

Java零基础教学文档servlet(2)

【Servlet】 1.工程结构 2.J2EE平台 Java EE&#xff0c;Java平台企业版&#xff08;Java Platform Enterprise Edition&#xff09;&#xff0c;之前称为Java 2 Platform, Enterprise Edition (J2EE)&#xff0c;2018年3月更名为Jakarta EE。是Sun公司为企业级应用推出的标准…

Java实现高校大学生创业管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创业社团模块2.4 政府政策模块2.5 创业比赛模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 系统公告表3.2.2 创业项目表3.2.3 创业社团表3.2.4 政策表 四、系统展示五、核心代码5.…

GAMES104-现代游戏引擎:从入门到实践 - 物理引擎课程笔记汇总

文章目录 0 入门资料1 物理引擎基本概念Actor & shapesRigid body dynamicsCollision DetectionCollision Resolution 应用与实践Character controllerRagdoll 0 入门资料 GAMES104-现代游戏引擎&#xff1a;从入门到实践_课程视频_bilibiliGAMES104官方账号 - 知乎课程主页…

时刻不忘为何而出发

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Linux内核架构和工作原理详解(一)

简介 作用是将应用层序的请求传递给硬件&#xff0c;并充当底层驱动程序&#xff0c;对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构&#xff0c;每个进程都依赖于一个父进程。内核启动init程序…