【JavaScript】网页轮播图

news2024/9/20 16:56:57

目录

    • HTML搭建
    • 功能实现
      • 小圆圈事件
      • 左右按钮事件
      • 自动播放

轮播图也叫焦点图,是网页中比较常见的网页特效。
功能:

  • 鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮。
  • 点击右侧按钮一次,图片往左播放一张,以此类推, 左侧按钮同理。
  • 图片播放的同时,下面小圆圈模块跟随一起变化。
  • 点击小圆圈,可以播放相应图片。
  • 鼠标不经过轮播图, 轮播图也会自动播放图片。
  • 鼠标经过,轮播图模块, 自动播放停止。

HTML搭建

分为三部分:1.左右按钮 2.图片 3.小圆圈
index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>网页轮播图</title>
    <link rel="stylesheet" href="./css/index.css">
    <script src="./js/animate.js"></script>
    <script src="./js/index.js"></script>
</head>
<body>
    <div class="main">
        <!-- 左右按钮 -->
        <a href="javascript:;" class="left"><</a>
        <a href="javascript:;" class="right">></a>
        <!-- 图片 -->
        <ul>
            <li><img src="./img/scenery1.jpg" alt=""></li>
            <li><img src="./img/scenery2.jpg" alt=""></li>
            <li><img src="./img/scenery3.jpg" alt=""></li>
            <li><img src="./img/scenery4.jpg" alt=""></li>
        </ul>
        <!-- 小圆圈 -->
        <ol class="circle">
            <li class="current"></li>
            <li></li>
            <li></li>
            <li></li>
        </ol>
    </div>
</body>
</html>

index.css

*{
  padding: 0;
  margin: 0;
}

ul,ol{
  list-style: none;
}

a{
  text-decoration: none;
}

img {
  width: 700px;
  height: 400px;
}

.main{
  position: relative;
  width: 700px;
  height: 400px;
  margin: 100px auto;
  background-color: pink;
}

/* 左右按钮 */
.left,
.right {
  position: absolute;
  top: 50%;
  transform: translate(0, -50%);
  width: 24px;
  height: 40px;
  background: rgba(0, 0, 0, .3);
  text-align: center;
  line-height: 40px;
  color: #fff;
}

.right {
  right: 0;
}

/* 图片 */
.main ul {
  width: 1000%;
}
.main ul li{
  float:left;
}

/* 小圆点 */
.circle {
  position: absolute;
  bottom: 20px;
  left: 50%;
  transform: translate(-50%, 0);
}

.circle li {
  float: left;
  width: 8px;
  height: 8px;
  border: 2px solid skyblue;
  margin-left: 3px;
  border-radius: 50%;
  cursor: pointer;
}

.current {
  background-color: skyblue;
}

效果
在这里插入图片描述

功能实现

小圆圈事件

因为小圆圈和图片的数量应该是一样的,如果小圆数量和图片的li数量是分开写,如果后期增减图片修改代码时比较麻烦,所以我们可以优化小圆代码,实现小圆数量随图片li数量一致。
方法:先清空ol里面的li,先得到有多少张图片,然后用js动态创建li,再插入到ol当中,实现自动化的效果,与此同时实现选中li,类名变为current的功能
index.js

// 主体
var main = document.querySelector('.main');

// 1.小圆圈
// 动态生成圆圈
var ul = main.querySelector('ul');
var ol = main.querySelector('.circle');

for (var i = 0; i < ul.children.length; i++) {
  var li = document.createElement('li'); 
  //插入ol
  ol.appendChild(li);

  li.addEventListener('click', function() {
    //所有li清除类名
    for (var i = 0; i < ol.children.length; i++) {
      ol.children[i].className = '';
    }
    //当前li设置current类名
    this.className = 'current';
  })
}
// 第一个小li设置为current
ol.children[0].className = 'current';

实现点击小圆图片滑动的效果,用到封装的动画函数animate.js
animate.js

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();
      }
    }
    obj.style.left = obj.offsetLeft + step + 'px';
  }, 15);
}

核心算法:点击某个小圆,让图片滚动小圆的索引号乘以图片的宽度作为ul移动距离(因为图片是向左走,所以为负值),这里索引号需要创建自定义属性来获取。

注意:因为移动的是ul整个图片集合,所以ul需要定位才能使用animate函数,不然没效果;给ul设置定位后左右按钮消失了,所以要给左右按钮再设置定位层级。

/* 图片 */
.main ul {
  position: absolute;
	left: 0;
	top: 0;
	width: 1000%;
}

index.js

	for (var i = 0; i < ul.children.length; i++) {
	        var li = document.createElement('li'); 
	        //插入ol
	        ol.appendChild(li);
            // 创建自定义属性
            li.setAttribute('index', i);

	        li.addEventListener('click', function() {
	            //所有li清除类名
	            for (var i = 0; i < ol.children.length; i++) {
	                ol.children[i].className = '';
	            }
	            //当前li设置current类名
	            this.className = 'current';
                var index = this.getAttribute('index');
                var mainWidth = main.offsetWidth;
                animate(ul, - index * mainWidth);
		})
	}

效果在这里插入图片描述

左右按钮事件

原理与小圆圈的相似,给左右按钮添加事件,定义一个num变量,每次点击自增1,ul移动的距离为 图片的宽乘于num
此外还要设置无缝滚动,不然图片会一直滚动下去。

无缝滚动:把ul的第一个li克隆一份放到ul的后面,当图片滚动到克隆的第一个图片时,让ul快速跳到左侧(即两个瞬间同步),left为0,同时num赋值为0。
克隆:使用代码实现,自动克隆
最后给main加上overhidden
index.js

	// 切换图片
	var first = ul.children[0].cloneNode(true);
	ul.appendChild(first);
	var num = 0;
	right.addEventListener('click', function() {
		if (num == ul.children.length - 1) {
			ul.style.left = 0;
			num = 0;
		}
		num++;
		animate(ul, - num * mainWidth);
	})

效果
在这里插入图片描述

实现左右按钮与小圆圈切换同步
单独设置一个变量circle控制小圆的变化,点击右侧按钮就自加,到克隆的第一张图调回0。
index.js

	// 小圆圈变化
	var circle = 0;
	right.addEventListener('click', function() {
		if (num == ul.children.length - 1) {
			ul.style.left = 0;
			num = 0;
		}
		num++;
		animate(ul, - num * mainWidth);
		circle++;
		if (circle == ol.children.length) {
			circle = 0;
		}
		for (var i = 0; i < ol.children.length; i++) {
		    ol.children[i].className = '';
		}
		ol.children[circle].className = 'current';
	})

但是此时有个问题:
点击了小圆圈再点击右按钮图片滚动时,图片的实际位置发生错乱,图片的位置不对应。

这是因为右侧按钮点击事件时通过变量num来控制的,而num变量和小圆圈的点击事件没有任何关系,而发生错乱。
解决:
numcircle的值改为点击li的索引号的值,这一步是在创建li时加的

var index = this.getAttribute('index');
circle = num = index;

左按钮与右按钮类似,反过来即可

	left.addEventListener('click', function() {
		if (num == 0) {
			num = ul.children.length - 1;
			ul.style.left = - num * mainWidth + 'px';
		}
		num--;
		animate(ul, - num * mainWidth);
		circle--;
		if (circle < 0) {
			circle = ol.children.length - 1;
		}
		for (var i = 0; i < ol.children.length; i++) {
		    ol.children[i].className = '';
		}
		ol.children[circle].className = 'current';
	})

自动播放

添加定时器,把点击事件 right.click()放在定时器中即可,相当于自动点击右按钮播放

	// 3.自动播放
	var timer = this.setInterval(function() {
		right.click();
	}, 2000)

效果
在这里插入图片描述

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

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

相关文章

UACANet: Uncertainty Augmented Context Attention for Polyp Segmentation代码补充

上一篇看了文章创新点的代码&#xff0c;现在看一下train文件等其余的文件。 看主函数&#xff1a; import os import torch import argparse import tqdm import sysimport cv2 import torch.nn as nn import torch.distributed as distfrom torch.optim import Adam, SGD fr…

CVE-2022-21907 Microsoft Windows HTTP 协议栈远程代码执行漏洞复现

目录 0x01 声明&#xff1a; 0x02 简介&#xff1a; 0x03 漏洞概述&#xff1a; 0x04 影响版本&#xff1a; 0x05 环境搭建&#xff1a; 下载&#xff1a; 开启IIS&#xff1a; 0x06 漏洞复现&#xff1a; 利用POC&#xff1a; 0x07 流量分析&#xff1a; 客户端&am…

算法提升 (三)基础数据结构

作者&#xff1a;小萌新 专栏&#xff1a;算法提升 作者简介&#xff1a;大二学生 希望能够和大家一起进步&#xff01; 内容简介&#xff1a;简单介绍基本数据结构的简单面试题 不负韶华 链表 阅读这篇文章之前需要有初阶数据结构的基础 关于链表的结构如果还有不了解的同学…

智能AI创意图片编辑Luminar Neo

Luminar Neo是Mac上的智能AI技术编辑软件背景替换、图像层、除尘、重新照明选项等&#xff0c;从而实现精确掌控。同时在这款软件中还拥有可简化复杂的编辑程序&#xff0c;如此一来用户即可将自己大脑中想象的愿景变为现实&#xff0c;让使用者能有多大胆的想法都可以在这款软…

深度学习 卷积神经网络原理

深度学习 卷积神经网络原理一、前言二、全连接层的局限性三、卷积层3.1 如何进行卷积运算&#xff1f;3.2 偏置3.3 填充3.4 步长3.5 卷积运算是如何保留图片特征的&#xff1f;3.6 三维卷积3.7 多种特征提取四、池化层五、全连接层六、参考资料一、前言 本文分析了全连接层存在…

burpsuite利用sql注入漏洞猜解数据库名称

目录 一、前提条件 二、burpsuite猜解数据库名 &#xff08;一&#xff09;设置firefox代理 &#xff08;二&#xff09;使用burpsuite的proxy模块截取数据包 &#xff08;三&#xff09;将proxy截取的数据包右击发送到intruder模块 &#xff08;四&#xff09;设置2个变量…

【Spring】快速入门Spring框架

文章目录1. 对Spring的理解2. Spring IoC3. DI4. 如何创建一个Spring项目4.1 创建一个Maven项目4.2 添加Spring框架支持4.3 添加启动类5. 存储Bean对象5.1 添加配置文件5.2 创建Bean对象5.3 注册Bean6. 获取并使用Bean对象7. 更简单存储Bean对象的方式7.1 前置工作7.2 添加存储…

python爬虫1

1.1 网络爬虫概述 网络爬虫&#xff08;又被称为网络蜘蛛、网络机器人&#xff0c;在某社区中经常被称为网页追逐者&#xff09;&#xff0c;可以按照指定的规则&#xff08;网络爬虫的算法&#xff09;自动浏览或抓取网络中的信息&#xff0c;通过 Python 可以很轻松地编写爬…

二叉搜索树+二叉进阶oj

索引二叉搜索树1.二叉搜索树概念与性能分析2.二叉树的应用3.二叉树的实现细节4.类中函数递归调用5.二叉树实现总体代码6.二叉进阶oj7.二叉树三种遍历非递归实现二叉搜索树 1.二叉搜索树概念与性能分析 什么是二叉搜索树 二叉搜索树也被称为二叉排序树&#xff0c;其也可以是一…

热视觉2:使用Python和OpenCV从图像中测量温度

热视觉2:使用Python和OpenCV从图像中测量温度 这篇博客将介绍学习热/中远红外视觉的基础知识,gray8 和 gray16 图像(即最常见的热成像格式)之间的差异,学习如何使用Python和OpenCV从热图像中的每个像素点测量温度,并以不同的调色板显示结果。以及如何实时计算视频流和UV…

2022高频经典前端面试题(vue2+vue3+typescript+nodejs下篇,含答案)

vue2篇 1.vue的生命周期&#xff08;重点&#xff09; 2.父子组件的钩子函数顺序 页面初次渲染的时候&#xff1a; 父beforeCreate-> 父created -> 父beforeMount 子beforeCreate-> 子created ->子beforeMount-> 子mounted 父mounted 页面更新的时候&#xff…

大数据之Hive

文章目录前言一、数据仓库介绍&#xff08;一&#xff09; 数据仓库的基本概念&#xff08;二&#xff09;数据仓库的主要特征&#xff08;三&#xff09;数据仓库与数据库的区别二、Hive的概念&#xff08;一&#xff09;Hive的介绍&#xff08;二&#xff09;Hive的架构总结前…

4种方法!怎么把电脑上的音频传到苹果手机上?

案例分享 我新买了iphone13&#xff0c;想把macbook上下载的音乐传输一份到手机上&#xff0c;怎么把电脑上的音频传到苹果手机上&#xff1f;能否通过网络实现将电脑音乐传输到手机播放&#xff1f;” 很多果粉在刚拿到心爱的苹果手机后&#xff0c;都先把之前收藏的歌曲传到…

Grpc简介

博主在5月份已经从上一家公司辞职了&#xff0c;七月份已经到现在的公司了&#xff0c;能在整个互联网大环境都不好的前提下&#xff0c;还能找到工作&#xff0c;待遇还不错&#xff0c;已经很知足了。grpc是进到公司的第一个项目用到的技术&#xff0c;已经用了很久也总结了&…

三菱FX5U系列PLC内置高速计数器的使用方法示例

三菱FX5U系列PLC内置高速计数器的使用方法示例 三菱FX5U系列PLC内置高速计数器如何使用? 具体的使用方法可参考如下: 如下图所示,打开GX-WORKS3编程软件,在左侧的项目树中找到参数—FX5U—模块参数—高速I/O, 如下图所示,在弹出的右侧窗口中双击高速计数器—详细设置,…

没有十几年的积累,你还真写不出什么好的代码

如标题所说&#xff0c;我不知道大家怎么看待这句话&#xff1f; 拿一个正常的程序员举个例子&#xff0c;18开始上大学学习写代码&#xff0c;22岁大学毕业&#xff0c;一直干到30岁就需要考虑程序员的中年危机。 小编身边很多程序员都不喜欢写代码&#xff0c;感觉写代码没有…

C · 进阶 | 指针的进阶

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

数电学习(六、时序逻辑电路)(一)

文章目录引言概述特点时序电路的一般结构形式与功能描述方法时序电路分类时序电路的分析方法同步时序电路的分析方法状态转换表状态转换图&#xff08;回顾&#xff09;在现在的场景下看触发器的动态特性&#xff08;四个时间&#xff09;&#xff08;举例&#xff09;分析下面…

计算机毕设(附源码)JAVA-SSM佳音大学志愿填报系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

python有哪些编译器

python有哪些编译器 1、Brython把Python转换成Javascript代码。 是一个流行的Python编译器&#xff0c;它可以把Python转换成Javascript代码。该软件支持所有网络浏览器(包括手机网络浏览器)。 它还支持最新的Html5/CSS3标准&#xff0c;可以使用流行的CSS框架&#xff0c;如…