原生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 相关文章推荐
Prototype使用指南之selector.js
Jan 10 Javascript
基于prototype扩展的JavaScript常用函数库
Nov 30 Javascript
事件绑定之小测试  onclick &amp;&amp; addEventListener
Jul 31 Javascript
JS实现模拟风力的雪花飘落效果
May 13 Javascript
JQuery点击事件回到页面顶部效果的实现代码
May 24 Javascript
jquery.Callbacks的实现详解
Nov 30 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
基于vue.js实现分页查询功能
Dec 29 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
Jul 12 jQuery
Vue页面刷新记住页面状态的实现
Dec 27 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
Mar 07 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
Nov 24 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
我的论坛源代码(二)
2006/10/09 PHP
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
thinkPHP中验证码的简单使用方法
2015/12/26 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
异步加载script的代码
2011/01/12 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
屏蔽相应键盘按钮操作
2014/03/10 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
使用JavaScript判断手机浏览器是横屏还是竖屏问题
2016/08/02 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
setTimeout学习小结
2017/02/08 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
vue登录注册实例详解
2019/09/14 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
python简单实现计算过期时间的方法
2015/06/09 Python
利用Python抓取行政区划码的方法
2016/11/28 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
详解python持久化文件读写
2019/04/06 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
《都江堰》教学反思
2014/02/07 职场文书
总账会计岗位职责
2014/03/13 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
终止劳动合同协议书
2014/04/14 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
python实现腾讯滑块验证码识别
2021/04/27 Python
Vue图片裁剪组件实例代码
2021/07/02 Vue.js