【JavaScript】网页轮播图


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

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

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,.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', - 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)

效果

在这里插入图片描述

原文地址:https://blog.csdn.net/btufdycxyffd

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Css常用的排序方式权重分配 排序方式: 1、按类型&#160;如,显示和浮动、定位、尺寸、字体等 2、按字母&#160;按字母顺序排列,优点是规则简单 3、按定义长度&#160;按照样式定义的字符长度排列 各有优劣,实际应用中,推荐使用第一种。&#160;但是如果单靠前端工程师在编写过程中这么做的
原文:https://www.cnblogs.com/wenruo/p/9732704.html 先上效果 基本是用CSS实现的,没有用图片,加一丢丢JS。不过没有考虑太多兼容性。 首先画一个 &lt;!DOCTYPE html&gt;&lt;html lang=&quot;en&quot;&gt;
css属性:word-wrap:break-word; 与 word-break:break-all 的用法; zhangq0123 于 2016-10-19 11:06:12 发布 6475 收藏 9分类专栏: CSS HTML 文章标签: html css版权 CSS同时被 2 个专栏收录8 篇
https://destiny001.gitee.io/color/
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; &l
css之background的cover和contain的缩放背景图 对于这两个属性,官网是这样解释的: contain 此时会保持图像的纵横比并将图像缩放成将适合背景定位区域的最大大小。 等比例缩放图象到垂直或者水平其中一项填满区域。 cover 此时会保持图像的纵横比并将图像缩放成将完全覆盖背景
.CSS.MAP文件作用 https://blog.csdn.net/qq_36441169/article/details/102575563 1、简介在写前端代码,使用bootstrap时,发现同一个目录下,不仅仅有.css文件的同时,还存在.css.map文件的存在。在前端页面调试时也发现,映
Jquery mobile 写html时文字太长无法自动换行。 Jquery mobile 1 篇文章0 订阅 订阅专栏 加上这个 style=&quot;word-wrap:break-word;word-break:break-all;&quot; 或者 style=&quot;word-wra
详见:http://www.shagua.wiki/project/3 layui图标:http://www.shagua.wiki/project/3?p=85 JQ手册 :https://www.jc2182.com/jquery/jquery-jiaocheng.html css样式手册:ht
css里面圆形的代码,如何使用纯css实现圆形图像或叶子图像?(代码实例) 网易美学于&#160;2021-08-03 22:15:22&#160;发布946&#160;收藏 文章标签:&#160;css里面圆形的代码 有没有想过如何制作那些各式各样的圆形图像而无需用ps,本篇文章就来给你介绍一下如
css文字超出一行就显示省略号 1,css超出一行用点表示 white-space:nowrap; overflow:hidden; text-overflow:ellipsis; 2,css超出二行用点表示 overflow:hidden; text-overflow:ellipsis; disp
js动态追加数据单独设置某一个元素的样式。 在开发时,我们有很多数据是从后台获取然后展示的,例如列表,最近开发碰到个需求是获取到列表信息之后,不仅仅是拼接展示出来,还需要将其中的第一个li元素设置成其他的样式类,在网上找了一堆的办法都和自身业务需求不一致,没办法自己通过chrome控制台一点点调试,
css3手机端h5商品列表页,两列等分排列技巧 .picture_list {&#x9;width: 100%;&#x9;overflow: hidden}.picture_list&gt;li {&#x9;width: 50%; min-height: 120px;&#x9;float: left;&#x9;padding: 0px 3
css3 transform:scale(x)实现字体的缩放: css3 transform:scale(x)字体的缩放: transform:scale(x),针对于整体的缩放,缩放的整体包括宽,高,背景。这自然对于内联元素就无法使用此属性,最好使用无属性的span转换成块元素或者行内块元素进行设
jq获取第一个子元素并添加class &lt;div class=&quot;main&quot;&gt; &lt;div class=&quot;tit&quot;&gt;颜色&lt;/div&gt; &lt;ul&gt; &lt;li&gt;银色&lt;/li&gt; &lt;li&gt;深灰色
设置背景图片的两种方式,并解决手机端背景图片高度自适应问题 赵世婷&#160;2017-09-19 15:59:43 14372 收藏&#160;5 1 设置背景图片的两种方式: 方式一: .back{undefinedposition: fixed;width: 100%;height: 100%
css层级选择器理论{#ek) E:first-child : 匹配的是E元素,E元素是父元素的第一个子元素 说明:利用 :first-child 这个伪类,只有当元素是另一个元素的第一个子元素时才能匹配。例如,p:first-child 会选择作为另外某个元素第一个子元素的所有 p 元素。一般可能
Css多行字符截取方法详解 时间:2021-07-01 10:21:17 相信有很多同学在写前端页面的时候,都会遇到字符长了需要截取的问题,最简单的方法就是手动去截取,可这样又感觉太low了,今天晚上就来讲讲利用css进行字符的截取,不了解css是如何截取的同学可以和我们一起看看哦! 前言 最近在做
css中content可以用到的字符编码 项目中用到的一些特殊字符和图标 html代码 &lt;div class=&quot;cross&quot;&gt;&lt;/div&gt; css代码.cross{width: 20px;height: 20px;border-radius: 10px;b
CSS 计算属性 calc()的完整指南(上) 2020-05-03 CSS tricks上有一系列的完整指南文章,我后面会翻译这些内容,更新不会一下子完成,而是会分成几个,防止自己因看到文章过长而放弃翻译,一步一个脚印。 CSS有一个特殊的calc()函数,用于做基本的数学运算。下面是一个例子: