简单实现js轮播图效果


Posted in Javascript onJuly 14, 2017

本文实例为大家分享了js实现轮播图效果展示的具体代码,供大家参考,具体内容如下

html结构

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <style>
  *{
   margin:0;
   padding:0;
   font-size:14px;
   -webkit-user-select:none;
  }
  ul,li{
   list-style:none;

  }
  img{
   display:block;
   border:none;
  }
  a{
   display:block;
   color:#000;
   text-decoration: none;
  }
  a:hover,a:active,a:visited,a:target{
   display:block;
   color:#000;
   text-decoration: none;
  }
  .banner{
   position:relative;
   margin:0 auto;
   width:1000px;
   height:300px;
   overflow:hidden;
  }
  .banner .inner{
   position:absolute;
   top:0;
   left:0;
   height:300px;
   width:1000px;/*在JS数据绑定结束后根据请求数据的多少来动态调整宽度*/
  }
  .banner .inner div{
   float:left;
   width:1000px;
   height:300px;
   background:url('img/default.gif') no-repeat center center #e1e1e1;
  }
  .banner .inner img{
   display:none;
   width:100%;
   height:100%;
   opacity:0;
   filter:alpha(opacity=0);
  }
  .banner .bannerTip{
   height:18px;
   position:absolute;
   right:20px;
   bottom:20px;

  }
  .banner .bannerTip li{
   float:left;
   margin-left:10px;
   width:18px;
   height:18px;
   border-radius:50%;
   background:lightblue;
   cursor:pointer;
  }
  .banner .bannerTip li.bg{
   background:red;
  }
  .banner a{
   display:none;
   position:absolute;
   top:50%;
   margin-top:-22.5px;
   width:30px;
   height:45px;
   background-image:url("img/pre.png");
   background-repeat:no-repeat;
   opacity:0.5;
   filter:alpha(opacity=50);

  }
  .banner a:hover{
   opacity:1;
   filter:alpha(opacity=100);
  }
  .banner a.bannerLeft{
   left:20px;
   background-position:0 0;
  }
  .banner a.bannerRight{
   right:20px;
   background-position:-45px 0;

  }
 </style>
</head>
<body>
 <div class='banner' id='banner'>
  <div class='inner'>
   <div><img src="img/banner1.jpg" alt=""></div>
   <div><img src="img/banner2.jpg" alt=""></div>
   <div><img src="img/banner3.jpg" alt=""></div>
   <div><img src="img/banner4.jpg" alt=""></div>
  </div>
  <ul class='bannerTip'>
   <li class='bg'></li>
   <li></li>
   <li></li>
   <li></li>
  </ul>
  <a href="javascript:;" class='bannerLeft'></a>
  <a href="javascript:;" class='bannerRight'></a>
 </div>
</body>
</html>

js

(function(){
 var banner = document.getElementById('banner');
 var bannerInner = utils.firstChild(banner);
 var bannerTip = utils.children(banner,'ul')[0];
 var imgList = bannerInner.getElementsByTagName('img');
 var oLis = bannerTip.getElementsByTagName('li');
 var bannerLeft = utils.children(banner,'a')[0];
 var bannerRight = utils.children(banner,'a')[1];
 //实现数据绑定:Ajax请求数据、按照字符串拼接的方式绑定数据
 var jsonData = null,count = null
 ~function(){
  var xhr = new XMLHttlRequest;
  xhr.open('get',"json/banner.txt?_="+Math.random(),false);
  xhr.onreadystatechange = function(){
   if(xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)){
    jsonData = utils.formatJSON(xhr.responseText);
   }
  }
  xhr.send(null);
 }()

 ~function(){
  //绑定轮播图区域的数据
  var str = "";
  if(jsonData){
   for(var i = 0,len = jsonData.length;i<len;i++){
    str+='<div><img src="" trueImg="'+jsonData[i]['img']+'"></div>'
   }
   //为了实现无缝滚动,需要把第一张克隆一份放在末尾
   str+= '<div><img src="" trueImg="'+jsonData[0]['img']+'"></div>'
  }
  bannerInner.innerHTML = str;
  count = jsonData.length+1;
  utils.css(bannerInner,"width",count*1000);
  //绑定焦点区域的数据
  str = '';
  if(jsonData){
   for(var i = 0,len = jsonData.length;i<len;i++){
    i===0?str+='<li class="bg"></li>':str+='<li></li>';
    
   }
  }
  bannerTip.innerHTML = str;

 }()
 //图片延迟加载
 function lazyImg(){
  for(var i = 0,len = imgList.length;i<len;i++){
   ~function(i){//这里使用闭包,来避免onload事件异步导致的只有最后一张图片延迟加载的问题
    var curImg = imgList[i];
    var oImg = new Image;
    oImg.src = curImg.getAttribute('trueImg');
    oImg.onload = function(){
     curImg.src = this.src;
     curImg.style.display = "block";
     oImg = null;
     myAnimate(curImg,{opacity:1},300)
    }
   }(i) 
  }
 }
 window.setTimeout(lazyImg,500);
 var step = 0;//记录的是步长,(当前是哪一张图片,0是第一张图片)
 //实现自动轮播
 var autoTimer = window.setInterval(autoMove,2000);
 function autoMove(){
  if(step===count-1){
   step =0;
   bannerInner.style.left = 0
  }
  step++;
  myAnimate(bannerInner,{left:-step*1000},500)
  changeTip();
 }

 //实现焦点对齐
 function changeTip(){
  var tempStep = step > oLis.length-1 ? 0 : step;
  for(var i = 0,len = oLis.length;i<len;i++){
   var curLi = oLis[i];
   i === tempStep ? utils.addClass(curLi,"bg") : utils.removeClass(curLi,"bg")
  }
 }
 //鼠标滑过停止和开启轮播
 banner.onmouseover = function(){
  window.clearInterval(autoTimer);
  bannerLeft.style.display = bannerRight.style.display = 'block';
 } 
 banner.onmouseout = function(){
  autoTimer = window.setInterval(autoTimer,2000);
  bannerLeft.style.display = bannerRight.style.display = 'none';
 }
 //点击焦点实现轮播图的切换
 ~function(){
  for(var i = 0,len = oLis.length;i<len;i++){
   var curLi = oLis[i];
   curLi.index = i;
   curLi.onclick = function(){
    step = this.index;
    changeTip();
    myAnimate(bannerInner,{left:-step*1000},500)
   }
  }
 }()

 //实现左右切换
 bannerRight.onclick = autoMove();
 bannerLeft.onclick = function(){
  if(step<=0){
   step = count-1;
   utils.css(bannerInner,"left",-step*1000);
  }
  step--;
  autoMove();
 }
})()

绑定的数据

[
 {"img":"img/banner1.jpg","desc":"第一张轮播图"},
 {"img":"img/banner2.jpg","desc":"第二张轮播图"},
 {"img":"img/banner3.jpg","desc":"第三张轮播图"},
 {"img":"img/banner4.jpg","desc":"第四张轮播图"}
]

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

Javascript 相关文章推荐
超级强大的表单验证
Jun 26 Javascript
javascript放大镜效果的简单实现
Dec 09 Javascript
基于JavaScript获取鼠标位置的各种方法
Dec 16 Javascript
JS获取屏幕高度的简单实现代码
May 24 Javascript
详解webpack 多入口配置
Jun 16 Javascript
Vue的事件响应式进度条组件实例详解
Feb 04 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
Aug 08 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
Sep 21 Javascript
js实现内置计时器
Dec 16 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
Jan 20 Javascript
基于js实现逐步显示文字输出代码实例
Apr 02 Javascript
原生js实现滑块区间组件
Jan 20 Javascript
JS获取填报扩展单元格控件的值的解决办法
Jul 14 #Javascript
Vue学习笔记进阶篇之过渡状态详解
Jul 14 #Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
Jul 14 #Javascript
使用OPENLAYERS3实现点选的方法
Sep 24 #Javascript
vue component组件使用方法详解
Jul 14 #Javascript
vue-cli单页应用改成多页应用配置详解
Jul 14 #Javascript
Vue filters过滤器的使用方法
Jul 14 #Javascript
You might like
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
JS控制网页动态生成任意行列数表格的方法
2015/03/09 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
2018/06/30 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
JavaScript中的连续赋值问题实例分析
2019/07/12 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
在Python的Bottle框架中使用微信API的示例
2015/04/23 Python
Python读写unicode文件的方法
2015/07/10 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
python如何绘制疫情图
2020/09/16 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
国际贸易个人求职信范文
2014/01/04 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
主题党日活动总结
2014/07/08 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
python用海龟绘图写贪吃蛇游戏
2021/06/18 Python
nginx七层负载均衡配置详解
2022/07/15 Servers