亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

基于編寫jQuery的無縫滾動插件

2019-11-20 14:18:08
字體:
來源:轉載
供稿:網友

首先來看下html骨架,如下:

<div class="box">    <ul>      <li>111</li>      <li>222</li>      <li>333</li>    </ul></div>

結構簡單明了,沒什么說的。

講下實現原理:
  div box是最外層盒子,給它指定的寬高,記得給box添加一個 overflow:hidden (超出的內容隱藏)樣式,因為滾動肯定是會超出box的。
  我們通過js控制 ul 標簽的margin 來實現滾動。橫向滾動則是控制 margin-left ; 縱向滾動則是控制 margin-top;
  初始狀態時,我們還要進行條件判斷,判斷是否進行滾動。即: 當 ul 長度小于 外層 box 長度時不進行滾動,反之則進行滾動。
  ul 的長度是通過計算得來的,即: ul 里面單個 li 的長度乘以 li 的個數。 ul_width = li_width * li_num;
  之所以能實現無縫滾動,是因為每次滾動的長度剛好大于單個 li 的長度時,我們就將ul的第一個 li 移動到ul的最后,周而復始,無限循環(關于這
  一點,你可以先不設置 overflow:hidden 來查看)。
  
講個原理太TM考驗我的表達能力了,希望我講清楚了。

看插件的實現代碼吧:

(function ($) {  $.fn.Scroll = function (options) {    //將當前上下文對象存入root    var root = this;    //默認配置    var settings = {      speed: 40,   //滾動速度,值越大速度越慢      direction: "x" //滾動方向("x"或者"y" [x橫向;y縱向])    };    //不為空,則合并參數    if (options)      $.extend(settings, options);    var timer = [];   //計時器    var marquee;    //滾動器(函數)    var isRoll;     //判斷是否滾動(函數)    var _ul = $("> ul", root);     //ul標簽    var _li = $("> ul > li", root);   //li標簽(集合)    var li_num = _li.length;  //li標簽個數    var li_first = _li.first();  //獲取單個li標簽    //判斷為縱向還是橫向,并進行相應操作    if (settings.direction == "x") {              var li_w = li_first.outerWidth(true); //單個li標簽的寬度       var ul_w = li_w * li_num;        //ul標簽的寬度      _ul.css({ width: ul_w }); //設置ul寬度      marquee = function () {        _ul.animate({ marginLeft: "-=1" }, 0, function () {          var _mleft = Math.abs(parseInt($(this).css("margin-left")));          if (_mleft > li_w) { //滾動長度一旦大于單個li的長度            $("> li:first", $(this)).appendTo($(this)); //就把第一個li移到最后            $(this).css("margin-left", 0); //滾動長度歸0          }        });      };      //ul長度小于box長度時則不滾動,反之滾動      isRoll = function (t) {        if (ul_w <= root.width())          clearInterval(t);        else          marquee();      }    }    else {       var li_h = li_first.outerHeight(true); //單個li標簽的高度        var ul_h = li_h * li_num; //ul標簽的高度      _ul.css({ height: ul_h }); //設置ul高度      marquee = function () {        _ul.animate({ marginTop: "-=1" }, 0, function () {          var _mtop = Math.abs(parseInt($(this).css("margin-top"))); //取絕對值          if (_mtop > li_h) {             $("> li:first", $(this)).appendTo($(this));            $(this).css("margin-top", 0);          }        });      };      //ul長度小于box長度時則不滾動,反之滾動      isRoll = function (t) {        if (ul_h <= root.height())          clearInterval(t);        else          marquee();      }    }    //遵循鏈式原則,并進行初始化    return root.each(function (i) {      //超出內容隱藏,防止用戶沒寫overflow樣式      $(this).css({ overflow: "hidden" });      timer[i] = setInterval(function () {        isRoll(timer[i]);      }, settings.speed);      //鼠標進入停止滾動,離開繼續滾動      $(this).hover(function () {        clearInterval(timer[i]);      }, function () {        timer[i] = setInterval(function () {          isRoll(timer[i]);        }, settings.speed);      });    });  };})(jQuery);

基本的代碼說明注釋寫的很清楚了。下面對個別知識點作下講解:

1.) var timer=[]; 之前timer并不是聲明為數組類型的,是在我寫demo的時候,由于頁面同時存在兩個無縫滾動的應用(為了演示橫向和縱向), 出現了bug。

因為他們兩個共用了一個timer計時器,當鼠標進入其中一個時,另一個的timer也被clear了。之后修改代碼將其聲明為數組對象,再通過root.each()就實
現了每個插件應用都有自己獨立的timer計時器,互不干擾。也就是說此插件支持頁面同時存在多個無縫滾動應用。

2.) outerWidth() /outerHeight()函數。 這個函數比較強大,它獲取的不僅僅是元素的寬度/高度,

實際上 outerWidth()=width+borderLeft+borderRight+marginLeft+marinRight;
當它設置為true后,即:outerWidth(true),它也會將padding計算進來:
outerWidth()=width+borderLeft+borderRight+marginLeft+marinRight+paddingLeft+paddingRight;

怎么樣,是不是很強大?。?/p>

下面給出DEMO代碼:

<!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/xhtml"><head><title></title><style type="text/css">  *{ margin:0; padding:0;}  ul,ul li{ list-style:none;}    .wrap{ width:1000px; margin:50px auto;}    .box1,.box2,.box3{ overflow:hidden; float:left;border:1px solid gray;}    .box1{ width:200px; height:450px;}  .box1 ul li{ width:200px; height:100px;}   .box2,.box3{ width:450px;height:150px; margin:40px;}  .box2 ul li,.box3 ul li{ width:100px; height:150px; float:left;}  </style></head><body><div class="wrap">  <div class="box1">    <ul>      <li>111縱向</li>      <li>222縱向</li>      <li>333縱向</li>      <li>444縱向</li>      <li>555縱向</li>      <li>666縱向</li>    </ul>  </div>  <div class="box2">    <ul>      <li>111橫向</li>      <li>222橫向</li>      <li>333橫向</li>      <li>444橫向</li>      <li>555橫向</li>      <li>666橫向</li>    </ul>  </div>     <div class="box3">      <ul>      <li>ul長度小于box長度,不滾動</li>      <li>222橫向</li>      <li>333橫向</li>          </ul>  </div>  </div><script type="text/javascript" src="js/jquery.js"></script><script type="text/javascript" src="js/jquery.similar.scroll.js"></script><script type="text/javascript">  $(function () {    //奇數背景設置為灰色    $('.box1 li:even,.box2 li:even,.box3 li:even').css({ backgroundColor: "gray" });    $(".box1").Scroll({ direction: "y" }); //設置為縱向滾動    $(".box2").Scroll(); //默認橫向滾動    $(".box3").Scroll();  });</script></body></html>

效果圖片:

演示因為樣式問題,大家可以自行美化。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕国产| 亚洲美女动态图120秒| 成人免费自拍视频| 亚洲精品欧美极品| 欧美午夜精品在线| 91国产视频在线| 亚洲欧美国产精品专区久久| 国产成人精品网站| 77777亚洲午夜久久多人| 黑丝美女久久久| 国产精品毛片a∨一区二区三区|国| 亚洲毛片在线看| 日韩精品在线免费播放| 久久久久久国产精品久久| 欧美激情精品久久久久久变态| 清纯唯美亚洲综合| 国产97色在线|日韩| 91情侣偷在线精品国产| 欧美国产在线电影| 欧美第一黄色网| 视频在线观看一区二区| 欧美激情手机在线视频| 欧美—级高清免费播放| 琪琪第一精品导航| 日韩中文字幕在线视频播放| 亚洲三级 欧美三级| 中文字幕视频在线免费欧美日韩综合在线看| 97精品国产97久久久久久免费| 国产区精品在线观看| 深夜福利一区二区| 97视频在线免费观看| 久久视频在线视频| 久久天天躁夜夜躁狠狠躁2022| 午夜精品福利电影| 久久频这里精品99香蕉| 亚洲欧美日韩天堂一区二区| 精品国内自产拍在线观看| 亚洲片国产一区一级在线观看| 亚洲欧美日本精品| 成人欧美一区二区三区黑人| 亚洲自拍小视频免费观看| 91久久久久久久一区二区| 欧美激情在线观看| 高清视频欧美一级| 麻豆国产va免费精品高清在线| 亚洲综合在线做性| 亚洲男人的天堂网站| 亚洲精品一区中文| 日韩av电影在线网| 欧美日韩中国免费专区在线看| 成人av.网址在线网站| 日本中文字幕久久看| 亚洲欧美精品中文字幕在线| 国产99久久精品一区二区| 欧美俄罗斯性视频| 成人在线小视频| 色哟哟网站入口亚洲精品| 97免费中文视频在线观看| 国产成人亚洲综合青青| 午夜欧美不卡精品aaaaa| 精品国产拍在线观看| 久久免费成人精品视频| 4p变态网欧美系列| 欧美极品美女视频网站在线观看免费| 欧美大人香蕉在线| 日韩专区在线播放| 日韩精品免费在线观看| 欧美自拍视频在线观看| 91免费的视频在线播放| 日韩欧美国产激情| 国产欧美在线播放| 琪琪第一精品导航| 最新亚洲国产精品| 自拍亚洲一区欧美另类| 欧美一区二区三区免费视| 久久久999成人| 欧美国产日韩一区| 日本精品视频在线观看| 国产精品美女免费视频| 亚洲福利视频久久| 亚洲最大福利网站| 一本久久综合亚洲鲁鲁| 中文日韩在线观看| 高清日韩电视剧大全免费播放在线观看| 久久亚洲精品一区| 影音先锋欧美精品| 欧美激情第6页| 日韩在线观看免费| 在线观看日韩av| 精品国产老师黑色丝袜高跟鞋| 97免费视频在线播放| 69av视频在线播放| 久久五月情影视| 成人黄在线观看| 亚洲自拍偷拍在线| 欧美成人在线免费| 欧美视频在线免费| 欧美精品激情视频| 欧美日韩国内自拍| 午夜剧场成人观在线视频免费观看| 亚洲精品国产欧美| 26uuu久久噜噜噜噜| 欧美成人sm免费视频| 欧美精品一二区| 亚洲一区二区久久| 一区二区亚洲欧洲国产日韩| 国产成人在线播放| 一区二区三区视频在线| 欧美日在线观看| 欧美一乱一性一交一视频| 欧美激情免费观看| 国产精品电影一区| 国产成人精品在线视频| 亚洲男人天堂古典| 78m国产成人精品视频| 美女啪啪无遮挡免费久久网站| 国产精品一区二区三区毛片淫片| 久久九九亚洲综合| 欧美一级在线亚洲天堂| 久久伊人精品天天| 中文字幕亚洲一区二区三区| 日韩免费中文字幕| 中文字幕国产精品| 91九色视频导航| 久久久在线免费观看| 欧美激情综合色综合啪啪五月| 中文字幕在线日韩| 91久久精品久久国产性色也91| 久久影院在线观看| 欧美一级电影久久| 亚洲一区二区三区成人在线视频精品| 最近2019年日本中文免费字幕| 欧美日韩中文字幕| 久久男人av资源网站| 欧美性猛交xxxx富婆弯腰| 欧美日韩第一视频| 国产精品极品在线| 91久久精品在线| 国产精品第一页在线| 日韩精品视频在线观看网址| 亚洲精品成人久久电影| 亚洲精品一区二三区不卡| 国产精品白嫩初高中害羞小美女| 亚洲人成网7777777国产| 亚州成人av在线| 国产精品第一区| 欧美巨猛xxxx猛交黑人97人| 久久6精品影院| 都市激情亚洲色图| 国产精品视频区| 亚洲aaaaaa| 亚洲人成电影网站色…| 26uuu另类亚洲欧美日本一| 亚洲女人天堂成人av在线| 亚洲成人av在线播放| 欧美www视频在线观看| 国产成人久久久精品一区| 中文字幕不卡在线视频极品| 欧美大片欧美激情性色a∨久久| 欧美成人在线网站| 亚洲天堂av在线免费| 亚洲免费人成在线视频观看| 国内精品免费午夜毛片| 国产成人精品久久|