【H2O2|全栈】JS案例章节(三)——轮播图实现

news2024/12/27 14:10:28

目录

前言

开篇语

准备工作

需求

HTML和CSS

注意事项

原生JS实现

变量设置

方法设置

自动轮播与轮播销毁

翻页按钮

li点击切换指定图片

JQuery实现

变量设置

方法设置

自动轮播与轮播销毁

翻页按钮

li点击切换指定图片

结束语


前言

开篇语

本系列为短章节,单独讲述部分特殊重点案例,本期讲述JS轮播图的原生JS实现和JQuery实现。

与HTML和CSS相比,JS加入了很多逻辑性的元素在里面,所以需要一定的逻辑思维能力,要求能够整合一些知识。如果遇到不理解之处,可以参阅同系列之前的章节。

准备工作

软件:【参考版本】Visual Studio Code

插件(扩展包):Open in browser, Live Preview, Live Server, Tencent Cloud AI Code Assistant, htmltagwrap

提示:在不熟练的阶段建议关闭AI助手

第三方JS库:jquery.min.js

提示:请站内搜索下载、引入方式

浏览器版本:Chrome

系统版本: Win10/11/其他非Windows版本

需求

本次的需求为实现轮播图的效果,要求使用原生JS和JQuery两种方式实现。

示例效果如下——

详细要求如下——

  1. 点击下方圆点,可以实现圆点高亮,并且切换对应图片;
  2. 点击左右箭头,可以实现轮播图的左右切换;
  3. 鼠标移入轮播图,轮播图停止播放,移除时恢复。

HTML和CSS

按照惯例,在学习JS时我将把无关的HTML和CSS放在这里,仅供参考。

参考HTML代码——

    <header>头部</header>
    <nav>导航</nav>
    <main>
        <section id="banner" class="w1200">
            <div id="bn-left" class="bn-btn"></div>
            <div id="bn-right" class="bn-btn"></div>
            <div id="bn-pic"></div>
            <ul id="bn-points">
                <li class="active"></li>
                <li class=""></li>
                <li class=""></li>
                <li class=""></li>
                <li class=""></li>
                <li class=""></li>
            </ul>
        </section>
        <article class="w1200">内容</article>
    </main>
    <footer>底部</footer>

参考CSS代码——

* {
    margin: 0;
    padding: 0;
    list-style: none;
    text-decoration: none;
    box-sizing: border-box;
    text-align: center;
    font-size: 30px;
}

body {
    min-width: 1500px;
}

.w1200 {
    width: 1200px;
    margin: 0 auto;
}

header {
    height: 50px;
    background: #ef8080;
}

nav {
    height: 50px;
    background: #e6af7e;
}

main {
    background: #7ed3e6;
}

#banner {
    height: 300px;
    position: relative;
    background: #7ea1e6;
}

#banner .bn-btn {
    width: 40px;
    height: 80px;
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    background: #00000077;
    background-position: center;
    background-size: contain;
    background-repeat: no-repeat;
    cursor: pointer;
}

#banner #bn-left {
    /* 左侧翻页按钮箭头图(需自备) */
    background-image: url("../images/zjt.png");
    left: 0;
}

#banner #bn-right {
    /* 右侧翻页按钮箭头图(需自备) */
    background-image: url("../images/yjt.png");
    right: 0;
}

#banner #bn-pic {
    width: 100%;
    height: 100%;
    /* 进入页面默认显示第一张图 */
    background-image: url("../images/11.png");
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
}

#banner #bn-points {
    width: 160px;
    display: flex;
    justify-content: space-between;
    position: absolute;
    bottom: 30px;
    left: 50%;
    transform: translateX(-50%);
}

#banner #bn-points li {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: #ffffffbb;
    cursor: pointer;
}

#banner #bn-points li.active {
    background: #db1a1abb;
}

article {
    height: 2000px;
    background: #e67eb4;
}

footer {
    height: 50px;
    position: fixed;
    right: 0;
    bottom: 0;
    left: 0;
    background: #e6e47e;
}

注意事项

左右侧的箭头需要自行寻找图片,可以在阿里巴巴矢量图标库中查找。

需要自备6张图片,命名为11.png~66.png,后续可以根据自己的需要修改JS代码。

或者可以在JS中设置一个数组,用来存储各图片的名称,后续用数组名加索引获取即可。

原生JS实现

变量设置

首先,获取轮播图的各组件的DOM元素——

    var banner = document.querySelector('#banner')
    var bnl = document.querySelector('#bn-left')
    var bnr = document.querySelector('#bn-right')
    var pic = document.querySelector('#bn-pic')
    var points = document.querySelector('#bn-points')
    var lis = points.querySelectorAll('li')

接下来,我们需要三个全局变量,分别用于记录当前的索引index(可以同步图片索引和 li 索引)、图片数量len(底部 li 数量)和时间变量timer(用于记住轮播图使用的setInterval)。

    var index = 0
    var len = lis.length
    var timer = null

方法设置

分析案例,以是否自动进行作为依据划分,应当分为轮播操作和用户操作。

首先是轮播效果,在用户不进行任何操作时,自动进行循环播放图片,并切换底部 li 样式。

我们可以把“自动循环”和“切换图片、样式”分别封装为两个方法,便于我们在需要时调用。

图片和 li 共用index,以实现预期的同步效果。

在自动循环的方法setTimer()中,将setInterval赋值给全局的时间变量,在其回调函数中,设置index每隔1s(1000ms)自增一次,并在到达右侧边界时重新跳转回初始位置。当index发生改变之后,更新当前的图片和 li 高亮位置。

在切换图片、样式的方法change()中,利用图文公用的index换算出当前的图片地址和需要设置高亮的li(利用排他算法,在JS入门(八)章节中详述)。

两个方法的参考代码如下——

    // 自动轮播方法
    function setTimer() {
        timer = setInterval(function () {
            index++
            if (index == len) index = 0
            change()
        }, 1000)
    }

    // 图片切换和样式设置
    function change() {
        var num = (parseInt(index) + 1) * 11
        pic.style.backgroundImage = `url('./images/${num}.png')`
        for (let i = 0; i < len; i++) {
            lis[i].className = ""
        }
        lis[index].className = "active"
    }

自动轮播与轮播销毁

在未进行操作的情况下,我们需要让图片自动轮播,所以直接调用setTimer()设置轮播计时器。

    setTimer()

接下来,我们需要让鼠标移入轮播图时,自动轮播停止,否则用户的翻页指令可能会与自动轮播的效果发生冲突。

为此,我们可以在移入轮播图区域时删除计时器(利用时间变量timer),并在鼠标移出时恢复计时器

为轮播图区域添加上述的两个事件——

    // 设置鼠标移入banner图片停止移动和鼠标移出图片继续移动
    banner.addEventListener('mouseenter', function(){
        clearInterval(timer)
    })
    banner.addEventListener('mouseleave', function(){
        setTimer()
    })

翻页按钮

在点击左右两侧的分页按钮时,我们需要实现让轮播图向前或向后翻页一次的效果。

为此,我们可以利用全局变量index的自减自增,再重新调用change()方法,实现翻页的效果。

注意,在index自增自减超出边界值时,我们需要设置index值为另一侧边界值

    // 左右按钮点击切换轮播图
    bnl.addEventListener("click", function () {
        index--
        if (index == -1) index = 5
        change()
    })
    bnr.addEventListener("click", function () {
        index++
        if (index == 6) index = 0
        change()
    })

li点击切换指定图片

在这一步中,我们需要遍历lis,为底部的所有li绑定点击事件,并且获取到当前li的索引值赋值给全局index,最后调用change()实现切换操作。

但是,之前我们说过,在遍历绑定事件之后,for-i循环中的计数器i已经超出最大值,此时如果直接使用lis[i]来获取索引,将会出现溢出错误。

为此,在原生JS中我们可以使用自定义属性data-index来,在绑定事件之前记录当前li的索引值(见JS入门(八))。

    // 添加属性,并设置points激活和背景改变
    for (var i = 0; i < lis.length; i++) {
        lis[i].setAttribute("data-index", i)
        lis[i].onclick = function () {
            index = this.dataset.index
            change()
        }
    }

到此,我们已经实现最基本的轮播图的全部功能。

JQuery实现

变量设置

在使用JQuery方式时,我们直接使用$()包装原生DOM即可 ,随写随用。

但是,我们基本的三个全局变量还是得有的——

    var index = 0
    var len = $('li').length
    var timer = null

这里的$('li')具有隐式迭代,可以直接获取li的总数量。 

方法设置

JQuery的本质还是对原生的DOM进行操作,因此步骤上实际上还是与原生操作相同,但是JQuery为我们提供了更简洁的方式

setTimer()与原生DOM无差别。

change()中,设置背景图片使用css()设置background-image方式(注意驼峰命名),排他操作使用链式编程排他操作(见JS进阶(一)),利用eq(index)筛选index位置处的li。

    // 设置计时器方法
    function setTimer() {
        timer = setInterval(function () {
            if (index == len) index = 0
            change()
            index++
        }, 1000)
    }

    // 图片设置方法
    function change() {
        $('#bn-pic').css({
            backgroundImage: `url('./images/${(index + 1) * 11}.png')`
        })
        $('li').eq(index).addClass('active').siblings().removeClass('active')
    }

自动轮播与轮播销毁

进入页面,自动轮播。

    setTimer()

使用on为轮播图盒子绑定移入销毁计时器和移除重新恢复计时器的事件——

    // 设置鼠标移入banner图片停止移动和鼠标移出图片继续移动
    $('#banner').on('mouseenter', function () {
        clearInterval(timer)
    })
    $('#banner').on('mouseleave', function () {
        setTimer()
    })

翻页按钮

使用on为翻页按钮绑定前后翻页事件,当然这里的翻页按钮不需要再绑定其他事件,所以使用click()也是可以的。

    // 左右按钮点击切换轮播图
    $('#bn-left').on("click", function () {
        index--
        if (index == -1) index = 5
        change()
    })
    $('#bn-right').on("click", function () {
        index++
        if (index == 6) index = 0
        change()
    })

li点击切换指定图片

li使用事件委托,委托父级ul执行冒泡事件获取当前的点击的li,进一步获取其索引值赋值给全局index,最后使用change()方法实现切换。

注意,原生事件对象e在获取其原生DOM元素e.target后,需要使用$()包装,以便调用index()。

由于JQuery有内置的隐式迭代和对应的index()方法,所以我们不需要再设置额外的data-index了。

    // 设置points激活和背景改变
    $('ul').on({
        'click'(e) {
            index = $(e.target).index()
            change()
        }
    }, 'li')

结束语

本期的内容到这里就结束了,在后续的本系列博客中,我会继续更新js的特殊重点案例。

在全栈领域,博主也只不过是一个普通的萌新而已。本系列的博客主要是记录一下自己学习的一些经历,然后把自己领悟到的一些东西总结一下,分享给大家。

文章全篇的操作过程都是笔者亲自操作完成的,一些定义性的文字加入了笔者自己的很多理解在里面,所以仅供参考。如果有说的不对的地方,还请谅解。

==期待与你在下一期博客中再次相遇==

——还在漏气的【H2O2】

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

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

相关文章

Vivado+Vscode联合打造verilog环境

一、Vivado下载安装 详细参考我另一篇文章&#xff1a; Vivado2022.2下载安装_fpga vivado下载-CSDN博客https://blog.csdn.net/weixin_61081689/article/details/143460790?spm1001.2014.3001.5501 二、Vscode下载安装 详细参考我另一篇文章&#xff1a; VscodeAnacond…

A20红色革命文物征集管理系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

【软考】系统架构设计师-计算机系统基础(1):计算机硬件

知识点汇总 1、指令集 精简指令集RISC&#xff1a;寄存器&#xff0c;硬布线&#xff0c;效率高&#xff1b;复杂指令集CISC&#xff1a;微程序控制技术&#xff0c;效率低&#xff1b; 2、奇偶校验码&#xff1a;码距是2&#xff08;出错位校验位&#xff09;&#xff0c;只…

掌握高级 SQL 技巧:提升数据查询和管理能力

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; SQL&#xff08;Structured Query Language&#xff09;是处理和管理关系型数据库的重要工具。随着数据量的增加和业务需求的复杂…

从无音响Windows 端到 有音响macOS 端实时音频传输播放

以下是从 Windows 端到 macOS 端传输音频的优化方案&#xff0c;基于上述链接中的思路进行调整&#xff1a; Windows 端操作 安装必要软件 安装 Python&#xff08;确保版本兼容且已正确配置环境变量&#xff09;。安装 PyAudio 库&#xff0c;可通过 pip install pyaudio 命令…

Python小试牛刀:第一次爬虫,获取国家编码名称

使用场景&#xff1a; 需要初始化国家&#xff08;地区表&#xff09;&#xff0c;字段有国家名称、国家编码等等。 解决方案&#xff1a; 使用requests发送请求&#xff0c;使用bs4解析得到的HTML&#xff0c;打开F12&#xff0c;查看元素&#xff0c;&#xff08;可以Ctrl…

“倒时差”用英语怎么说?生活英语口语学习柯桥外语培训

“倒时差”用英语怎么说&#xff1f; “倒时差”&#xff0c;这个让无数旅人闻之色变的词汇&#xff0c;在英语中对应的正是“Jet Lag”。"Jet" 指的是喷气式飞机&#xff0c;而 "lag" 指的是落后或延迟。这个短语形象地描述了当人们乘坐喷气式飞机快速穿…

图书推荐 | Python金融大数据分析快速入门与案例详解(文末免费送书)

1、Python编程语言与金融大数据分析 随着信息技术的飞速发展&#xff0c;大数据分析技术应运而生&#xff0c;为各行各业带来了前所未有的变革。金融行业作为全球经济的核心&#xff0c;对数据十分依赖。因此&#xff0c;掌握大数据分析技术对于金融从业者来说具有重要的现实意…

易泊车牌识别相机:4S 店的智能之选

在当今数字化时代&#xff0c;科技的进步不断为各个行业带来更高效、便捷的解决方案。对于 4S 店来说&#xff0c;易泊车牌识别相机的出现&#xff0c;无疑为其运营管理带来了全新的变革。 一、易泊车牌识别相机的强大功能 易泊车牌识别相机以其卓越的性能和精准的识别能力&…

Docker平台搭建方法

Docker平台搭建方法 1.1在VMware中创建两个虚拟机&#xff0c;只需要1个网卡&#xff0c;连接192.168.200.0网络。 虚拟机分配2个CPU,2G内存&#xff0c;60G硬盘&#xff0c;主机名分别为server和client,IP地址分别为192.168.200.137和192.168.200.138。server节点还兼做regis…

云计算在教育领域的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算在教育领域的应用 云计算在教育领域的应用 云计算在教育领域的应用 引言 云计算概述 定义与原理 发展历程 云计算的关键技…

紫光展锐携手上赞随身Wi-Fi,让5G触手可及

近年来&#xff0c;随着各类移动应用层出不穷&#xff0c;人们对随时随地上网的需求日益增强&#xff0c;随身 Wi-Fi 设备以其便捷性、灵活性和相对较低的成本&#xff0c;成为用户满足办公、社交、娱乐等多元化需求的重要工具。5G技术的逐步普及为随身Wi-Fi市场注入了新的活力…

Spring资源加载模块,原来XML就这,活该被注解踩在脚下 手写Spring第六篇了

这一篇让我想起来学习 Spring 的时&#xff0c;被 XML 支配的恐惧。明明是写Java&#xff0c;为啥要搞个XML呢&#xff1f;大佬们永远不知道&#xff0c;我认为最难的是 XML 头&#xff0c;但凡 Spring 用 JSON来做配置文件&#xff0c;Java 界都有可能再诞生一个扛把子。 <…

【C++】AVL树的了解和简单实现

目录 AVL树的概念 AVL树介绍 平衡因子 AVL树的插入 平衡因子的更新 【1】平衡因子为0 【2】平衡因子为1/-1 【3】平衡因子为2/-2 选择的处理 旋转的原则 右单旋 具体的三种情况&#xff1a; ​编辑 所有情况的概念图&#xff1a; 对于父亲指针的处理 &…

使用 PageHelper 在 Spring Boot 项目中实现分页查询

目录 前言1. 项目环境配置1.1 添加 PageHelper 依赖1.2 数据库和 MyBatis 配置 2. 统一的分页响应类3. 使用 PageHelper 实现分页查询3.1 Service 层分页查询实现3.2 PageHelper 分页注意事项 4. 控制层调用示例5. 常见问题与解决方案5.1 java.util.ArrayList cannot be cast t…

丹摩征文活动 | 丹摩智算:大数据治理的智慧引擎与实践探索

丹摩DAMODEL&#xff5c;让AI开发更简单&#xff01;算力租赁上丹摩&#xff01; 目录 一、引言 二、大数据治理的挑战与重要性 &#xff08;一&#xff09;数据质量问题 &#xff08;二&#xff09;数据安全威胁 &#xff08;三&#xff09;数据管理复杂性 三、丹摩智算…

彻底理解ARXML中的PDU

文章目录 一、DBC报文信号的发送二、ARXML报文信号的发送2.1 什么是PDU2.2 PDU的类型2.3 Container-I-PDU的发送 三、小结 在CANFD支持可变速率和更大的数据长度&#xff08;64字节&#xff09;的情况下&#xff0c;可以使用DBC和ARXML两种数据库格式来进行报文通信&#xff0c…

探索MoviePy:Python视频编辑的瑞士军刀

文章目录 &#x1f3ac; 探索MoviePy&#xff1a;Python视频编辑的瑞士军刀第一部分&#xff1a;背景介绍第二部分&#xff1a;MoviePy是什么&#xff1f;第三部分&#xff1a;如何安装MoviePy&#xff1f;第四部分&#xff1a;MoviePy的基本函数使用方法1. 视频剪辑2. 视频拼接…

前端请求后端php接口跨域 cors问题

只需要后端在网站的入口文件 一般都是 index.php 加上 这几行代码就可以了 具体的参数可以根据需要去修改 header("Access-Control-Allow-Origin: *"); header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS); header(Access-Control-Allow-Heade…

C++11的一些特性

1、列表初始化&#xff0c;对内置类型和自定义类型都可以使用列表进行初始化——一切都可以用列表初始化 不要和初始化列表混了 std::initializer_list临时对象作为函数的参数&#xff0c;用来接收{}括起来的的初始化列表 容器中有用initializer_list作为参数的构造函数&…