原生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 相关文章推荐
jquery插件制作教程 txtHover
Aug 17 Javascript
解析JSON对象与字符串之间的相互转换
Dec 18 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
js实现Select列表内容自动滚动效果代码
Aug 20 Javascript
javascript HTML5 canvas实现打砖块游戏
Jun 18 Javascript
require.js配合插件text.js实现最简单的单页应用程序
Jul 12 Javascript
详细探究ES6之Proxy代理
Jul 22 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
Dec 01 Javascript
微信小程序 MD5的方法详解及实例代码
Mar 10 Javascript
小程序跨页面交互的作用与方法详解
Jan 07 Javascript
electron 如何将任意资源打包的方法步骤
Apr 16 Javascript
微信小程序仿抖音短视频切换效果的实例代码
Jun 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
PHP网上调查系统
2006/10/09 PHP
一些常用的php简单命令代码集锦
2007/09/24 PHP
PHP中echo,print_r与var_dump区别分析
2014/09/29 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
2017/07/18 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
PHP反射学习入门示例
2019/06/14 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
对layui中表单元素的使用详解
2018/08/15 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
python字符串Intern机制详解
2019/07/01 Python
详解python中的数据类型和控制流
2019/08/08 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
如何写股份合作协议书
2014/09/11 职场文书
2014年员工工作总结范文
2014/11/18 职场文书
大学生学年个人总结
2015/02/15 职场文书
主题班会开场白
2015/06/01 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers