最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

原生JS實現(xiàn)圖片無縫滾動方法(附帶封裝的運動框架)

 更新時間:2017年10月01日 09:24:29   作者:zouyang0921  
下面小編就為大家?guī)硪黄鶭S實現(xiàn)圖片無縫滾動方法(附帶封裝的運動框架)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

話說輪播圖效果是前端er學(xué)習(xí)JS的必經(jīng)之路啊,很多同學(xué)寫的第一個JS效果應(yīng)該就是它了,在各大網(wǎng)站我們都會經(jīng)常見到,但是無縫滾動運動效果的輪播圖,對于小白們來說還是有一定難度的。

我們來看看思路吧~

首先我們要實現(xiàn)的效果有以下幾點:

小圓點:點擊小圓點顯示與之對應(yīng)的圖片

向左和向右按鈕:點擊向左按鈕圖片向后運動,點擊向右按鈕圖片向前運動

定時器:每隔 2s 自動播放

主要難點在于:

當圖片運動到最后一張,點擊向右的按鈕時,應(yīng)該顯示第一張;

當前顯示的是第一張,點擊向左的按鈕時,應(yīng)該顯示最后一張;

思路:

1、先將第一張圖片復(fù)制 添加到 ul 最后面,將最后一張圖片復(fù)制 添加到 ul 最前面(此時 ul 的第一張圖片是pic3,最后一張圖片是pic0);

2、當圖片(ul)運動到pic3,繼續(xù)向前運動,運動到最后一張pic0時,瞬間把 ul 拉回到第二張圖片pic0的位置,然后在繼續(xù)向前運動;

3、當圖片(ul)向后運動到第一張圖片pic3時,瞬間把 ul 拉回到倒數(shù)第二張圖片pic3的位置。

4、還有非常關(guān)鍵的一點:定義iNow變量,用于對應(yīng)當前顯示的圖片與ol中的小圓點,并且可以用來關(guān)聯(lián) ul 的位置。

html代碼:

<div id="tab">
  <ul>
    <li><img src="image/pic0.jpg" alt="" /></li>
    <li><img src="image/pic1.jpg" alt="" /></li>
    <li><img src="image/pic2.jpg" alt="" /></li>
    <li><img src="image/pic3.jpg" alt="" /></li>
  </ul>
  <ol>
    <li class="on"></li>
    <li></li>
    <li></li>
    <li></li>
  </ol>
  <a href="javascript:;" rel="external nofollow" rel="external nofollow" class="prev" id="prev"><</a>
  <a href="javascript:;" rel="external nofollow" rel="external nofollow" class="next" id="next">></a>                 
</div>

css代碼:

*{margin: 0; padding: 0;}
li{ list-style: none;}
#tab{
  width: 670px;
  height: 240px;
  border: 1px solid #ccc;
  margin: 50px auto;
  position: relative;
}
#tab ul{
  width: 2680px;
  height: 240px;
  position: absolute;
  left: 0;
  top: 0;
  overflow: hidden;
}
#tab ul li{
  float: left;
  width: 670px;
}
#tab ul li img{
  width: 670px;
}
#tab ol{
  width: 80px;
  position: absolute;
  bottom: 10px;
  left: 50%;
  margin-left: -40px;
  overflow: hidden;
}
#tab ol li{
  float: left;
  width: 10px;
  height: 10px;
  background: #ccc;
  border-radius: 50%;
  margin: 5px;
  cursor: pointer;
}
#tab ol .on{
  background: #f00;
}
#tab .prev,#tab .next{
  display: none;
  width: 40px;
  height: 60px;
  background: rgba(0,0,0,.3);
  filter:alpha(opacity:30);
  text-decoration: none;
  text-align: center;
  line-height: 60px;
  font-size: 30px;
  color: #fff;
  position: absolute;
  top: 50%;
  margin-top: -30px;
}
#tab .prev{
  left: 0;
}
#tab .next{
  right: 0;
}

js 代碼:

其中animate()是封裝好的運動框架,最后面附有說明

window.onload = function(){
  var oTab = document.getElementById('tab');
  var oUl = oTab.getElementsByTagName('ul')[0];
  var aLi1 = oUl.children;
  var oOl = oTab.getElementsByTagName('ol')[0];
  var aLi2 = oOl.children;
  var prev = document.getElementById('prev');
  var next = document.getElementById('next');
  //設(shè)置ul的初始位置
  var iNow = 1;  
  oUl.style.left=-aLi1[0].offsetWidth*iNow+'px';
  //定時器
  var timer = null;

  //克隆第一張圖片 添加在ul的最后面
  var oLi1 = aLi1[0].cloneNode(true);
  //克隆最后一張圖片 添加在ul的最前面
  var oLi2 = aLi1[aLi1.length-1].cloneNode(true);
  oUl.appendChild(oLi1);
  oUl.insertBefore(oLi2,aLi1[0]);
  oUl.style.width = aLi1[0].offsetWidth*aLi1.length+"px";
  //鼠標移入tab: 關(guān)閉定時器,左右按鈕顯示
  oTab.onmouseover = function(){
    clearInterval(timer);
    prev.style.display = 'block';
    next.style.display = 'block';
  }
  //鼠標移出tab: 開啟定時器,左右按鈕隱藏
  oTab.onmouseout = function(){
    timer = setInterval(function(){
      toNext();
    },2000);
    prev.style.display = 'none';
    next.style.display = 'none';
  }
  //點擊小圓點
  for(var i=0;i<aLi2.length;i++){
    (function(index){
      aLi2[index].onclick = function(){
        iNow = index+1;
        for(var i=0;i<aLi2.length;i++){
          aLi2[i].className = '';
        }
        aLi2[index].className = 'on';
        animate(oUl,{left: -iNow*aLi1[0].offsetWidth});
      }
    })(i);
  }
  //上一個
  prev.onclick=function(){
    iNow--;
    animate(oUl,{left: -iNow*aLi1[0].offsetWidth},{complete:function(){
      if(iNow == 0){
        iNow = aLi1.length-2;
        oUl.style.left=-aLi1[0].offsetWidth*iNow+'px';
      }
      for(var i=0;i<aLi2.length;i++){
        aLi2[i].className = '';
      }
      aLi2[iNow-1].className = 'on';
    }});
  }
  //下一個
  next.onclick=function(){
    toNext();
  }
  function toNext(){
    iNow++;
    animate(oUl,{left: -iNow*aLi1[0].offsetWidth},{complete:function(){
      if(iNow == aLi1.length-1){
        iNow = 1;
        oUl.style.left=-aLi1[0].offsetWidth*iNow+'px';
      }
      for(var i=0;i<aLi2.length;i++){
        aLi2[i].className = '';
      }
      aLi2[iNow-1].className = 'on';
    }});
  }
  //設(shè)置定時器
  timer = setInterval(function(){
    toNext();
  },2000);
}

封裝的animate()運動框架

/*
 * 參數(shù)說明:
 * obj: 運動對象
 * json(json形式): 需要修改的屬性
 * options(json形式): 
 *       duration: 運動時間
 *       easing: 運動方式(勻速、加速、減速)
 *       complete: 運動完成后執(zhí)行的函數(shù)
*/
function animate(obj,json,options){
  var options=options || {};        
  var duration=options.duration || 500;  //運動時間,默認值為500ms;
  var easing=options.easing || 'linear';  //運動方式,默認為linear勻速
  var start={};
  var dis={};

  for(var name in json){
    start[name]=parseFloat(getStyle(obj,name));  //起始位置
    dis[name]=json[name]-start[name];      //總距離
  }

  var count=Math.floor(duration/30);         //總次數(shù)
  var n=0;  //次數(shù)

  clearInterval(obj.timer);
  obj.timer=setInterval(function(){
     if(n>count){
      clearInterval(obj.timer);
      options.complete && options.complete();
    }else{
      for(var name in json){
        switch(easing){
          //勻速
          case 'linear':
            var a=n/count;
            var cur=start[name]+dis[name]*a;  //當前位置
            break;
          //加速
          case 'ease-in':
            var a=n/count;
            var cur=start[name]+dis[name]*a*a*a;
            break;
          //減速
          case 'ease-out':
            var a=1-n/count;
            var cur=start[name]+dis[name]*(1-a*a*a);
            break;
        }
         if(name=='opacity'){
          obj.style.opacity=cur;
          obj.style.filter = 'alpha(opacity='+cur*100+')';  //兼容IE8及以下
        }else{
          obj.style[name]=cur+'px';
        }
      }
    }
    n++;
  },30);
}
//獲取非行間樣式
function getStyle(obj,sName){
  return (obj.currentStyle || getComputedStyle(obj,false))[sName];
}

以上這篇原生JS實現(xiàn)圖片無縫滾動方法(附帶封裝的運動框架)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • webpack 4.0.0-beta.0版本新特性介紹

    webpack 4.0.0-beta.0版本新特性介紹

    本篇文章主要介紹了webpack 4.0.0-beta.0版本新特性介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • JavaScript時間與時間戳的轉(zhuǎn)換操作實例分析

    JavaScript時間與時間戳的轉(zhuǎn)換操作實例分析

    這篇文章主要介紹了JavaScript時間與時間戳的轉(zhuǎn)換操作,結(jié)合實例形式分析了javascript日期與時間戳轉(zhuǎn)換相關(guān)函數(shù)與操作技巧,需要的朋友可以參考下
    2018-12-12
  • 基于javascript實現(xiàn)按圓形排列DIV元素(二)

    基于javascript實現(xiàn)按圓形排列DIV元素(二)

    本篇文章主要介紹基于javascript實現(xiàn)按圓形排列DIV元素的方法,此文著重于介紹怎樣實現(xiàn)的按圓形排列DIV元素的運動原理和實現(xiàn)效果代碼,需要的朋友來看下吧
    2016-12-12
  • bootstrap table支持高度百分比的實例代碼

    bootstrap table支持高度百分比的實例代碼

    這篇文章給大家介紹了bootstrap table支持高度百分比的實例代碼,通過更改BootstrapTable.prototype.resetView 方法,以支持高度百分比定義,適應(yīng)不同高度屏幕,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-02-02
  • Some tips of wmi scripting in jscript (1)

    Some tips of wmi scripting in jscript (1)

    Some tips of wmi scripting in jscript (1)...
    2007-04-04
  • JavaScript門面模式詳解

    JavaScript門面模式詳解

    這篇文章主要為大家詳細介紹了JavaScript門面模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 原生js實現(xiàn)瀑布流效果

    原生js實現(xiàn)瀑布流效果

    這篇文章主要為大家詳細介紹了原生js實現(xiàn)簡單瀑布流效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 基于JS正則表達式實現(xiàn)模板數(shù)據(jù)動態(tài)渲染(實現(xiàn)思路詳解)

    基于JS正則表達式實現(xiàn)模板數(shù)據(jù)動態(tài)渲染(實現(xiàn)思路詳解)

    這篇文章主要介紹了基于JS正則表達式實現(xiàn)模板數(shù)據(jù)動態(tài)渲染 ,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • JavaScript ECMA-262-3 深入解析.第三章.this

    JavaScript ECMA-262-3 深入解析.第三章.this

    在這篇文章里,我們將討論跟執(zhí)行上下文直接相關(guān)的更多細節(jié)。討論的主題就是this關(guān)鍵字
    2011-09-09
  • 圖解JavaScript作用域鏈底層原理

    圖解JavaScript作用域鏈底層原理

    當代碼在一個環(huán)境中執(zhí)行時,會創(chuàng)建變量對象的一個作用域鏈,作用域鏈的用途是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問,下面這篇文章主要給大家介紹了關(guān)于JavaScript作用域鏈底層原理的相關(guān)資料,需要的朋友可以參考下
    2021-11-11

最新評論

天镇县| 罗甸县| 洛阳市| 木兰县| 三台县| 河南省| 苍溪县| 上高县| 微山县| 静安区| 新源县| 高陵县| 垫江县| 桑植县| 扶余县| 和田市| 东山县| 新密市| 苏尼特右旗| 常宁市| 西藏| 罗平县| 随州市| 东海县| 丘北县| 额尔古纳市| 太谷县| 亚东县| 固镇县| 台中县| 鄂州市| 门头沟区| 桂东县| 淳化县| 色达县| 拜城县| 孟连| 扎兰屯市| 洛宁县| 泉州市| 桃源县|