js实现轮播图的完整代码

今天写一个完整的轮播图,首先它需要实现三个功能:

1.鼠标放在小圆点上实现轮播

2.点击焦点按钮实现轮播

3.无缝自动轮播

轮播图的原理:

一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏。通过计算偏移量(封装一个动画函数)自动播放,或通过手动点击事件切换图片。

html布局:

<div id="box" class="all">
  <div class="inner">  <!-- 相框-->
    <ul>
      <li><a href="#"><img src="images/18.jpg" width="550" height="320" alt=""></a></li>
      <li><a href="#"><img src="images/19.jpg" width="550" height="320" alt=""></a></li>
      <li><a href="#"><img src="images/14.jpg" width="550" height="320" alt=""></a></li>
      <li><a href="#"><img src="images/17.jpg" width="550" height="320" alt=""></a></li>

    </ul>
    <ol> <!--里面存放小圆点-->

    </ol>
  </div>
  <div class="focusD" id="arr">
    <span id="left">&lt</span>
    <span id="right">&gt</span>
  </div>
</div>

css样式:

* {
      margin: 0;
      padding: 0;
    }
    /*<--清除底部三像素距离-->*/
    img {
      vertical-align: top;
    }

    .all {
      width: 550px;
      height: 320px;
      margin: 100px auto;
      padding: 5px;
      border: 1px solid #ccc;
      position: relative;
    }

    .inner {
      position: relative;
      width: 550px;
      height: 320px;
      background-color: pink;
      overflow: hidden;
    }

    .inner ul {
      width: 1000%;
      list-style: none;
      position: absolute;
      top: 0;
      left: 0;
    }

    .inner ul li {
      float: left;
    }

    .focusD {
      position: absolute;
      left: 0;
      top: 50%;
      width: 550px;
      padding: 0 10px;
      height: 30px;
      box-sizing: border-box;
     display: none;
    }

    .inner ol {
      position: absolute;
      right: 30px;
      bottom: 10px;
    }

    .inner ol li {
      width: 15px;
      display: inline-block;
      height: 15px;
      margin: 0 3px;
      cursor: pointer;
      line-height: 15px;
      text-align: center;
      background-color: #fff;
    }
    /*当前的高亮的小圆点*/
    .inner ol .current {
      background-color: orange;
      color: #fff;
    }

    .focusD span {
      display: inline-block;
      width: 25px;
      font-size: 24px;
      height: 30px;
      color: #ccc;
      line-height: 30px;
      text-align: center;
      background: rgba(255, 255, 255, 0.3);
      cursor: pointer;
    }

    #left {
      float: left;
    }

    #right {
      float: right;
}

显示效果:

js部分:

接下来我们要写js 代码 ,首先我们先获取我们需要的所有元素 。注:my$("id")即document.getElementById,为了简便即建的方法。

 var index=0;
  //获取最外面的div
  var box = my$("box");
  //获取相框
  var inner = box.children[0];
  //获取去相框的宽度
  var imgWidth = inner.offsetWidth;
  // 获取ul
  var ulObj = inner.children[0];
  //获取ul中所有的li
  var list = ulObj.children;
  //获取ol
  var olObj = inner.children[1];
  //获取焦点
  var arr = my$("arr");

然后我们需要给它创建小按钮即小圆点并注册鼠标进入事件,再此之前 我们要明白,小圆点 1 2 3 并不是写死的,它是根据ul li中的图片张数来决定的 ,所以 我们要先在js中给div中的ol中的添加li(即小圆点),并且给ul中的图片几li添加索引值以便下一步的操作。

 //创建小按钮-----根据ul中li的个数
  for (var i = 0; i < list.length; i++) {
    var liObjs = document.createElement("li");
    olObj.appendChild(liObjs);
    liObjs.innerHTML = (i + 1);
    //在ol中每个li中增加自定义属性,添加索引值
    liObjs.setAttribute("index", i);
    //注册鼠标进入事件
    liObjs.onmouseover = function () {
      //先干掉所有背景颜色
      for (var j = 0; j < olObj.children.length; j++) {
        olObj.children[j].removeAttribute("class");
      }
      //设置当前鼠标进来的类样式
      this.className = "current";
      //获取ol中li的索引值
       index = this.getAttribute("index");
      //移动ul
      animate(ulObj, -index * imgWidth); //移动动画函数
    };
  }
  //设置第一个ol中li的背景颜色
  olObj.children[0].className = "current";

要实现无缝滚动 就需要多一张图片才行 ,即克隆第一张图片,放到最后面。

 //克隆ol中第一个li放到最后一个
  ulObj.appendChild(ulObj.children[0].cloneNode(true));

下一步就要实现点击左右的按钮实现轮播

//点击右边按钮
    my$("right").onclick=clickHandle;
    function clickHandle() {
      if (index==ulObj.children.length-1){
        ulObj.style.left=0+"px";
        index=0;
      }
      index++;
      animate(ulObj,-index*imgWidth);
      if (index==list.length-1){
        olObj.children[0].className="current";
        olObj.children[olObj.children.length-1].className="";
      }else {
        for (var i=0;i<olObj.children.length;i++){
          olObj.children[i].className="";
        }
        olObj.children[index].className="current";
      }
    };
    //点击左边按钮
    my$("left").onclick=function () {
      if (index==0){
        index=list.length-1;
        ulObj.style.left=-index*imgWidth+"px";
      }
      index--;
      animate(ulObj,-index*imgWidth);
      for (var i=0;i<olObj.children.length;i++){
        olObj.children[i].className="";
      }
      olObj.children[index].className="current";
    };

最后一步就是自动轮播,即可以创建一个定时器,每隔一段时间就调用左右按钮的点击事件,相当于点按钮,但是要注意的是当鼠标放进相框的时候要清除定时器,不然在你点击的时候它还是会自动轮播。

完整js代码:

<script>
  var index=0;
  //获取最外面的div
  var box = my$("box");
  //获取相框
  var inner = box.children[0];
  //获取去相框的宽度
  var imgWidth = inner.offsetWidth;
  // 获取ul
  var ulObj = inner.children[0];
  //获取ul中所有的li
  var list = ulObj.children;
  //获取ol
  var olObj = inner.children[1];
  //获取焦点
  var arr = my$("arr");

  //创建小按钮-----根据ul中li的个数
  for (var i = 0; i < list.length; i++) {
    var liObjs = document.createElement("li");
    olObj.appendChild(liObjs);
    liObjs.innerHTML = (i + 1);
    //在ol中每个li中增加自定义属性,添加索引值
    liObjs.setAttribute("index", i);
    //注册鼠标进入事件
    liObjs.onmouseover = function () {
      //先干掉所有背景颜色
      for (var j = 0; j < olObj.children.length; j++) {
        olObj.children[j].removeAttribute("class");
      }
      //设置当前鼠标进来的类样式
      this.className = "current";
      //获取ol中li的索引值
       index = this.getAttribute("index");
      //移动ul
      animate(ulObj, -index * imgWidth); //移动动画函数
    };
  }
  //设置第一个ol中li的背景颜色
  olObj.children[0].className = "current";
  //克隆ol中第一个li放到最后一个
  ulObj.appendChild(ulObj.children[0].cloneNode(true));

  var timeId=setInterval(clickHandle,3000);

  my$("box").onmouseover=function(){
   arr.style.display="block";
   clearInterval(timeId);
  };
    //点击右边按钮
    my$("right").onclick=clickHandle;
    function clickHandle() {
      if (index==ulObj.children.length-1){
        ulObj.style.left=0+"px";
        index=0;
      }
      index++;
      animate(ulObj,-index*imgWidth);
      if (index==list.length-1){
        olObj.children[0].className="current";
        olObj.children[olObj.children.length-1].className="";
      }else {
        for (var i=0;i<olObj.children.length;i++){
          olObj.children[i].className="";
        }
        olObj.children[index].className="current";
      }
    };
    //点击左边按钮
    my$("left").onclick=function () {
      if (index==0){
        index=list.length-1;
        ulObj.style.left=-index*imgWidth+"px";
      }
      index--;
      animate(ulObj,-index*imgWidth);
      for (var i=0;i<olObj.children.length;i++){
        olObj.children[i].className="";
      }
      olObj.children[index].className="current";
    };

  my$("box").onmouseout=function(){
    arr.style.display="none";
    timeId=setInterval(clickHandle,3000);
  };

  // 设置一个元素,移动到指定位置
  function animate(element, target) {
    clearInterval(element.timeId);
    element.timeId = setInterval(function () {
      var current = element.offsetLeft;
      var step = 9;
      step = current > target ? -step : step;
      current += step;
      if (Math.abs(target - current) > Math.abs(step)) {
        element.style.left = current + "px";
      } else {
        clearInterval(element.timeId);
        element.style.left = target + "px";
      }
    }, 10);
  }
  function my$(id) {
     return document.getElementById(id);
    }
</script>

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

(0)

相关推荐

  • 原生JS实现的自动轮播图功能详解

    本文实例讲述了原生JS实现的自动轮播图功能.分享给大家供大家参考,具体如下: 轮播图的用处 轮播图是现在网站网页上最常见的效果之一,很多网站上都会用到,淘宝京东等等.有些自动选项卡也是需要用到的,而且它的可重复性高.在这里分享一下,用js原生代码,实现轮播图的常见效果! 轮播图的原理 一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏.通过定时器实现自动播放. Html布局 首先父容器banner存放所有内容,子容器img-list存放图片.子容器list存放按钮小圆点.圆点我使

  • 简单的JS轮播图代码

    在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写的插件,今天就写个简单的适合入门者学习的小教程.当然,轮播图的实现原理与设计模式有很多种,我这里讲的是用面向过程函数式编程去实现,相对于面向对象设计模式,代码难免会显得臃肿冗余.但没有面向对象的抽象却很适合新手理解与学习.已经在BAT的同学看到希望少喷点.另外可以多提意见. 轮播图的原理: 一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏.通过计算偏移量利用定时器实现自动播放,或通过

  • 原生js实现无限循环轮播图效果

    知识要点 1.实现无限循环的原理: 以偏移的距离来判断是否跳回第一张和最后一张 也可以利用循环判断图片的当前索引值 var newLeft=parseInt(list.style.left)+offset;//当前的偏移量+下一次的偏移量=新的偏移量 list.style.left=newLeft+"px";//当前的偏移值=新的偏移值 //以偏移的距离来判断是否跳回第一张和最后一张 if(newLeft>-600){ list.style.left=-3000+"px

  • js实现支持手机滑动切换的轮播图片效果实例

    本文实例讲述了js实现支持手机滑动切换的轮播图片效果的方法.分享给大家供大家参考.具体如下: 运行效果如下: 完整实例代码点击此处本站下载. 使用方法案例: <script type="text/javascript" src="../src/zepto.js"></script> <script type="text/javascript" src="../src/carousel-image.js&qu

  • js实现从左向右滑动式轮播图效果

    轮播图就是让图片每隔几秒自动滑动,达到图片轮流播放的效果.轮播图从效果来说有滑动式的也有渐入式的,滑动式的轮播图就是图片从左向右滑入的效果,渐入式的轮播图就是图片根据透明度渐渐显示的效果,这里说的是实现第一种效果的方法. 原理 相同大小的图片并成一列,但只显示其中一张图片,其余的隐藏,通过修改left值来改变显示的图片. 点击查看效果 html部分 nav为总容器,第一个ul列表#index为小圆点列表,鼠标覆盖哪个小圆点就显现第几张图片,on是一个给小圆点添加背景颜色属性的类:第二个ul列表#

  • 原生js实现移动开发轮播图、相册滑动特效

    使用方法: 分别引用css文件和js文件 如: <link rel="stylesheet" type="text/css" href="css/photoSlider.min.css" /> <script src="js/photoSlider.min.js" type="text/javascript" charset="utf-8"></script

  • JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)

    1.本文使用js+jQuery实现轮播图,需要引用jquery包,另种实现分别是animate实现自适应的轮播,以及transform平滑轮播(在注释代码中). 2.代码中的图片大家自己更换就可以了,样式和逻辑均写在js里. 3.html标签代码,js代码 <div class="slider"> //轮播箭头 <p class="lastpic"><img src="../images/prev.png">&

  • js实现点击左右按钮轮播图片效果实例

    本文实例讲述了js实现点击左右按钮轮播图片效果的方法.分享给大家供大家参考.具体实现方法如下: $(function () { var index = 1; var pPage = 1; var $v_citemss = $(".citemss"); var $v_show = $v_citemss.find("ul"); v_width = $v_citemss.width();//图片展示区外围div的大小 //注:若为整数,前边不能再加var,否则会被提示un

  • JS轮播图实现简单代码

    本文实例为大家分享了js轮播图实现代码,供大家参考,具体内容如下 思路: 1.首先要有个盛放图片的容器,设置为单幅图片的宽高,且overflow:hidden,这样保证每次可以只显示一个图片 2.Container内有个放图片的list进行position的定位 ,其中的图片采用float的方式,同时当图片进行轮播时,改变list的Left值使得其显示的图片发生变化. 3.图片的轮播使用定时器,通过定时器改变list的Left值是的图片循环展示 4.当鼠标滑动到图片上时,清除定时器,图片停止轮播

  • js实现轮播图的完整代码

    今天写一个完整的轮播图,首先它需要实现三个功能: 1.鼠标放在小圆点上实现轮播 2.点击焦点按钮实现轮播 3.无缝自动轮播 轮播图的原理: 一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏.通过计算偏移量(封装一个动画函数)自动播放,或通过手动点击事件切换图片. html布局: <div id="box" class="all"> <div class="inner"> <!-- 相框-->

  • 原生js实现轮播图的示例代码

    很多网站上都有轮播图,但却很难找到一个系统讲解的,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出. 原理: 将一些图片在一行中平铺,然后计算偏移量再利用定时器实现定时轮播. 步骤一:建立html基本布局 如下所示: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>轮播图</title> </hea

  • js实现轮播图的两种方式(构造函数、面向对象)

    本文实例为大家分享了js实现轮播图的具体代码,供大家参考,具体内容如下 1.构造函数 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type='text/css'> *{ margin:0; padding:0;} #wrap{ width:500px; height:360px; margin:1

  • 使用Require.js封装原生js轮播图的实现代码

    index.html页面: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>require.js封装轮播图</title> <style type="text/css"> *{ margin: 0; padding: 0; list-style: none; } #banner{ width: 830px; he

  • 原生Js 实现的简单无缝滚动轮播图的示例代码

       简单无缝滚动轮播图存在很多漏洞,就是后期增加图片时会很不方便,需要改动的地方也很多,耦合性也很强,只适用于一部分程序,所以我们可以通过改动图片结构和计算折算点的方式,升级代码.       原简单的滚动轮播代码 <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> &

  • 原生js实现轮播图特效

    轮播图也称为焦点图,是网页中比较常见的网页特效. 功能需求: ​ 1.鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮. ​ 2.点击右侧按钮一次,图片往左播放一张,以此类推,左侧按钮同理. ​ 3.图片播放的同时,下面小圆圈模块跟随一起变化. ​ 4.点击小圆圈,可以播放相应图片. ​ 5.鼠标不经过轮播图,轮播图也会自动播放图片. ​ 6.鼠标经过,轮播图模块, 自动播放停止. 此文章的代码为一个完整的轮播图的实现代码,复制即可运行 实现效果由于大小问题无法上传,可自行观看淘宝或京东首页轮

  • JS原生轮播图的简单实现(推荐)

    哈喽!我的朋友们,最近有一个新项目.所以一直没更新!有没有想我啊!! 今天咱们来说一下JS原生轮播图! 话不多说: 直接来代码吧:下面是CSS部分: *{ padding: 0px; margin: 0px; } img{ width: 500px; height: 300px; } li{ float: left; } ul{ width: 2000px; list-style: none; position: absolute; } div{ width: 500px; height: 30

  • 利用BootStrap的Carousel.js实现轮播图动画效果

    前期准备: 1.jquery.js. 2.bootstrap的carousel.js. 3.bootstrap.css. 一起来看代码吧: 页面比较丑,希望大家不要介意哦嘻嘻 效果图: html+js: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>my love-首页</title> <link rel="styleshee

  • 纯JS实现轮播图

    这几天一直在看js动画,今天又get到了一个轮播图,使用纯js实现的,但是没有美化哈,需要的小伙伴自己美化喔 如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xh

  • 用vue写一个仿简书的轮播图的示例代码

    1.先展示最终效果: 2.解决思路 Vue的理念是以数据驱动视图,所以拒绝通过改变元素的margin-top来实现滚动效果.写好css样式,只需改变每张图片的class即可实现轮播效果.动画效果交给transition完成.可以将轮播图看成两个(mainSlide和extraSlide),各个图片的位置如图所示: 3.代码实现 各个slide的样式: $width: 800px; // 容器宽度 $height: 300px; // 容器高度 $bWidth: 500px; // 大图片宽度 $

随机推荐