原生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 相关文章推荐
XML的代替者----JSON
Jul 21 Javascript
date.parse在IE和FF中的区别
Jul 29 Javascript
基于jquery的滚动条滚动固定div(附演示下载)
Oct 29 Javascript
通过javascript获取iframe里的值示例代码
Jun 24 Javascript
动态加载jquery库的方法
Feb 12 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
Nov 03 Javascript
vue组件发布到npm简单步骤
Nov 30 Javascript
angularjs 页面自适应高度的方法
Jan 17 Javascript
详解Axios统一错误处理与后置
Sep 26 Javascript
JS简单表单验证功能完整示例
Jan 26 Javascript
基于JavaScript获取url参数2种方法
Apr 17 Javascript
element跨分页操作选择详解
Jun 29 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
JS中encodeURIComponent函数用php解码的代码
2012/03/01 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
php引用传值实例详解学习
2013/11/06 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
用 JSON 处理缓存
2007/04/27 Javascript
表单元素事件 (Form Element Events)
2009/07/17 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
2015/10/22 Javascript
JavaScript事件 &quot;事件对象&quot;的注意要点
2016/01/14 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
2019/01/08 Javascript
python中实现定制类的特殊方法总结
2014/09/28 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
PyQt QMainWindow的使用示例
2021/03/24 Python
简历中自我评价范文3则
2013/12/14 职场文书
新员工入职感言
2014/02/01 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
汉字听写大会观后感
2015/06/12 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
浅谈Python数学建模之数据导入
2021/06/23 Python
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸