原生js实现轮播图特效


Posted in Javascript onMay 04, 2020

轮播图也称为焦点图,是网页中比较常见的网页特效。

功能需求:

​ 1.鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮。

​ 2.点击右侧按钮一次,图片往左播放一张,以此类推,左侧按钮同理。

​ 3.图片播放的同时,下面小圆圈模块跟随一起变化。

​ 4.点击小圆圈,可以播放相应图片。

​ 5.鼠标不经过轮播图,轮播图也会自动播放图片。

​ 6.鼠标经过,轮播图模块, 自动播放停止。

此文章的代码为一个完整的轮播图的实现代码,复制即可运行

实现效果由于大小问题无法上传,可自行观看淘宝或京东首页轮播图效果

html文件:

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <link rel="stylesheet" href="css/index.css" rel="external nofollow" >
 <script src="js/animate.js"></script>
 <script src="js/index.js"></script>

</head>

<body>
 <div class="box">
 <ul>
  <li><img src="img/focus.jpg" alt=""></li>
  <li><img src="img/focus1.jpg" alt=""></li>
  <li><img src="img/focus2.jpg" alt=""></li>
  <li><img src="img/focus3.jpg" alt=""></li>
 </ul>
 <ol>
 </ol>
 <div class="arr-l"> < </div>
 <div class="arr-r"> > </div>
 </div>
</body>

</html>

css文件:

* {
 margin: 0;
 padding: 0;
 outline: none;
}
.box {
 overflow: hidden;
 position: relative;
 height: 455px;
 width: 721px;
 background-color: pink;
 margin: 50px auto;
}
.box ul {
 position: absolute;
 top: 0;
 left: 0;
 width: 600%;
}
.box ul li {
 list-style: none;
 float: left;
}
.box ol {
 position: absolute;
 bottom: 10px;
 left: 100px;
 background-color: rgba(255, 255, 255, .3);
 border-radius: 8px;
 list-style: none;
 height: 10px;
 padding: 2px 5px;
}
.box ol li {
 cursor: pointer;
 float: left;
 height: 8px;
 width: 8px;
 border: 1px solid #fff;
 border-radius: 50%;
 margin: 0 5px;
}
.arr-l,
.arr-r {
 display: none;
 color: #fff;
 cursor: pointer;
 position: absolute;
 height: 40px;
 width: 30px;
 background-color: rgba(0, 0, 0, .3);
 line-height: 40px;
 text-align: center;
}
.arr-l {
 top: 50%;
 left: 0;
 transform: translateY(-50%);
}
.arr-r {
 right: 0;
 top: 50%;
 transform: translateY(-50%);
}
.current {
 background-color: #fff;
}

动画实现js文件animate.js:

function animate(obj, target, callback) {
 clearInterval(obj.timer);
 obj.timer = setInterval(function () {
 if (target - obj.offsetLeft > 0) {
  var step = Math.ceil((target - obj.offsetLeft) / 10);
 } else {
  var step = Math.floor((target - obj.offsetLeft) / 10);
 }

 if (obj.offsetLeft == target) {
  clearInterval(obj.timer);
  callback && callback();
 }
 obj.style.left = obj.offsetLeft + step + 'px';
 }, 15)
}

index.js:

window.addEventListener('load', function () {
 var arrl = this.document.querySelector('.arr-l');
 var arrr = this.document.querySelector('.arr-r');
 var box = this.document.querySelector('.box');
 var boxWidth = box.offsetWidth;
 box.addEventListener('mouseenter', function () {
 arrl.style.display = 'block';
 arrr.style.display = 'block';
 clearInterval(timer);
 timer = null;
 })
 box.addEventListener('mouseleave', function () {
 arrl.style.display = 'none';
 arrr.style.display = 'none';
 timer = setInterval(function () {
  arrr.click();
 }, 2000);
 });


 var ul = box.querySelector('ul');
 var ol = box.querySelector('ol');
 for (var i = 0; i < ul.children.length; i++) {
 var li = document.createElement('li');
 li.setAttribute('data-index', i);
 ol.appendChild(li);
 ol.children[0].className = 'current';
 li.addEventListener('click', function () {
  for (var i = 0; i < ol.children.length; i++) {
  ol.children[i].className = '';
  }

  this.className = 'current';
  var dateindex = this.getAttribute('data-index');
  num = dateindex;
  circle = dateindex;
  animate(ul, -dateindex * boxWidth);
 });
 }

 var first = ul.children[0].cloneNode(true);
 ul.appendChild(first);

 var num = 0;
 var circle = 0;
 var flag = true;
 arrr.addEventListener('click', function () {
 if (flag) {
  flag = false;
  if (num == ul.children.length - 1) {
  ul.style.left = 0;
  num = 0;
  }
  num++;
  animate(ul, -num * boxWidth, function () {
  flag = true;
  });
  circle++;
  if (circle == ol.children.length) {
  circle = 0;
  }
  circleChange();
 }

 });
 arrl.addEventListener('click', function () {
 if (flag) {
  flag = false;
  if (num == 0) {
  num = ul.children.length - 1;
  ul.style.left = -num * boxWidth + 'px';
  }
  num--;
  animate(ul, -num * boxWidth, function () {
  flag = true;
  });
  circle--;
  if (circle < 0) {
  circle = ol.children.length - 1;
  }
  circleChange();

 }
 });
 function circleChange() {
 for (var i = 0; i < ol.children.length; i++) {
  ol.children[i].className = '';
 }
 ol.children[circle].className = 'current';
 }

 var timer = setInterval(function () {
 arrr.click();
 }, 2000);
})

注意事项

引用两个js文件时,animate.js要在index.js之前引用,因为index.js中要用到animate.js里的函数。

精彩专题分享:jQuery图片轮播 JavaScript图片轮播 Bootstrap图片轮播

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript Accessor实现说明
Dec 06 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
Dec 08 Javascript
IE6下拉框图层问题探讨及解决
Jan 03 Javascript
javascript十六进制及二进制转化的方法
May 06 Javascript
js生成随机数的过程解析
Nov 24 Javascript
整理一下常见的IE错误
Nov 18 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
Feb 08 Javascript
详解angularjs 学习之 scope作用域
Jan 15 Javascript
深入理解Node module模块
Mar 26 Javascript
js传递数组参数到后台controller的方法
Mar 29 Javascript
vue-for循环嵌套操作示例
Jan 28 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
Mar 20 Javascript
jquery实现手风琴案例
May 04 #jQuery
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
May 03 #Javascript
解决React在安装antd之后出现的Can't resolve './locale'问题(推荐)
May 03 #Javascript
vue自定义标签和单页面多路由的实现代码
May 03 #Javascript
JavaScript函数重载操作实例浅析
May 02 #Javascript
有趣的JavaScript隐式类型转换操作实例分析
May 02 #Javascript
react-router-dom 嵌套路由的实现
May 02 #Javascript
You might like
PHP 危险函数全解析
2009/09/09 PHP
PHP防止跨域提交表单
2013/11/01 PHP
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
Javascript 错误处理的几种方法
2009/06/13 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
python中property和setter装饰器用法
2019/12/19 Python
python ftplib模块使用代码实例
2019/12/31 Python
tensorflow使用指定gpu的方法
2020/02/04 Python
python读取xml文件方法解析
2020/08/04 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
python中count函数知识点浅析
2020/12/17 Python
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
什么是GWT的Entry Point
2013/08/16 面试题
施工安全协议书
2013/12/11 职场文书
校园元旦活动总结
2014/07/09 职场文书
2014年法制宣传日活动方案
2014/11/02 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫
Nginx的基本概念和原理
2022/03/21 Servers