国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網 責編:小采 時間:2020-11-27 22:28:22
文檔

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

原生JS實現圖片無縫滾動方法(附帶封裝的運動框架):話說輪播圖效果是前端er學習JS的必經之路啊,很多同學寫的第一個JS效果應該就是它了,在各大網站我們都會經常見到,但是無縫滾動運動效果的輪播圖,對于小白們來說還是有一定難度的。 我們來看看思路吧~ 首先我們要實現的效果有以下幾點: 小圓點:點擊小圓點
推薦度:
導讀原生JS實現圖片無縫滾動方法(附帶封裝的運動框架):話說輪播圖效果是前端er學習JS的必經之路啊,很多同學寫的第一個JS效果應該就是它了,在各大網站我們都會經常見到,但是無縫滾動運動效果的輪播圖,對于小白們來說還是有一定難度的。 我們來看看思路吧~ 首先我們要實現的效果有以下幾點: 小圓點:點擊小圓點

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

我們來看看思路吧~

首先我們要實現的效果有以下幾點:

小圓點:點擊小圓點顯示與之對應的圖片

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

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

主要難點在于:

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

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

思路:

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

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

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

4、還有非常關鍵的一點:定義iNow變量,用于對應當前顯示的圖片與ol中的小圓點,并且可以用來關聯 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');
 //設置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: 關閉定時器,左右按鈕顯示
 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';
 }});
 }
 //設置定時器
 timer = setInterval(function(){
 toNext();
 },2000);
}

封裝的animate()運動框架

/*
 * 參數說明:
 * obj: 運動對象
 * json(json形式): 需要修改的屬性
 * options(json形式): 
 * duration: 運動時間
 * easing: 運動方式(勻速、加速、減速)
 * complete: 運動完成后執行的函數
*/
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); //總次數
 var n=0; //次數

 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實現圖片無縫滾動方法(附帶封裝的運動框架)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

原生JS實現圖片無縫滾動方法(附帶封裝的運動框架):話說輪播圖效果是前端er學習JS的必經之路啊,很多同學寫的第一個JS效果應該就是它了,在各大網站我們都會經常見到,但是無縫滾動運動效果的輪播圖,對于小白們來說還是有一定難度的。 我們來看看思路吧~ 首先我們要實現的效果有以下幾點: 小圓點:點擊小圓點
推薦度:
標簽: 運動 圖片的 無縫
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 最新国产小视频在线播放 | 美女视频黄a视频全免费网站色 | 国产日韩欧美综合在线 | 免费在线观看一区二区 | 久久精品一区二区三区四区 | 色老头久久久久 | 国产码欧美日韩高清综合一区 | 中文国产成人精品久久久 | 欧美日韩精品一区二区三区四区 | 在线观看精品国产 | 欧美十区 | 欧美亚洲综合图区在线 | 美女一区| 亚洲欧美专区 | 91麻精品国产91久久久久 | 亚洲精国产一区二区三区 | 国产精品三级在线观看 | 精品国产91久久久久 | 精品国产一区二区三区久久久狼 | 国产一区 在线播放 | 国产成人综合久久精品尤物 | 欧美 韩国 精品 另类 综合 | 精品一区二区三区免费毛片爱 | 欧美日韩国产一区二区三区在线观看 | 综合毛片 | 国产成人三级经典中文 | 看全色黄大色大片免费久久 | 最新偷窥盗摄视频在线 | 午夜视频hd| 亚洲逼院| 国产高清在线 | a黄网站| 欧美一区二区三区免费 | 精品国产亚洲一区二区三区 | 国产亚洲精品sese在线播放 | 亚洲一区二区三区夜色 | 日韩一区二区三区在线视频 | 国产伦精品一区二区三区视频小说 | 久久久一区二区三区 | 亚洲欧美日韩精品高清 | 九九国产精品九九 |