国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

不間斷滾動(dòng)圖片Javascript特效講解

開發(fā) 后端
本文根據(jù)一個(gè)實(shí)例來分析JavaScript特效代碼。通過學(xué)習(xí)本教程,可以學(xué)會(huì)不間斷滾動(dòng)圖片的JavaScript實(shí)現(xiàn)方法。

我們來分析下代碼(代碼中我已經(jīng)寫了很詳細(xì)的注釋),要之其所以然,在解讀別人的代碼中學(xué)習(xí)提高自己,然后可以靈活運(yùn)用,這個(gè)才是我將這個(gè)效果貼出來的主要目的,代碼如下:

scrollver.js

  1. scrollVertical.prototype.scrollArea=null;      // 滾動(dòng)的區(qū)域  
  2. scrollVertical.prototype.scrollMsg=null;       // 要滾動(dòng)的內(nèi)容  
  3. scrollVertical.prototype.unitHeight=0;         // 單獨(dú)一行滾動(dòng)內(nèi)容的高度(程序中通過過的要滾動(dòng)行的一個(gè)節(jié)點(diǎn)的offsetHeight獲得)   
  4. scrollVertical.prototype.msgHeight=0;          // 整個(gè)滾動(dòng)內(nèi)容的高度  
  5. scrollVertical.prototype.copyMsg=null;         // 復(fù)制滾動(dòng)內(nèi)容(程序中使用復(fù)制scrollMsg.innerHTML來獲得的)  
  6. scrollVertical.prototype.scrollValue=0;        // 滾動(dòng)的值  
  7. scrollVertical.prototype.scrollHeight=0;       // 滾動(dòng)高度  
  8. scrollVertical.prototype.isStop=true;          // 停止?jié)L動(dòng)  
  9. scrollVertical.prototype.isPause=false;        // 暫停滾動(dòng)   
  10. scrollVertical.prototype.scrollTimer=null;     // 滾動(dòng)計(jì)時(shí)器  
  11. scrollVertical.prototype.speed=2000;           // (默認(rèn))滾動(dòng)的時(shí)間間隔2秒  
  12. /**  
  13. * @method isMoz - 判斷是否為Mozilla系列瀏覽器  
  14. */   
  15. scrollVertical.prototype.isMoz = function(){  
  16.     return navigator.userAgent.toLowerCase().indexOf('gecko') > 0;  
  17. };  
  18. /**  
  19. * @method play - 滾動(dòng)信息的處理方法(函數(shù))  
  20. * @param {Object} o - 滾動(dòng)類  
  21. */   
  22. scrollVertical.prototype.play = function(o){  
  23.     var s_msg = o.scrollMsg;  
  24.     var c_msg = o.copyMsg;  
  25.     var s_area = o.scrollArea;  
  26.     var msg_h = o.msgHeight;  
  27.       
  28.     var anim = function(){  
  29.         // 如果已經(jīng)開始計(jì)時(shí)(間隔時(shí)間執(zhí)行向上滾動(dòng)),  
  30.         // 就停止它(以免無限制執(zhí)行,耗系統(tǒng)資源)。  
  31.         if (o.scrollTimer) {   
  32.             clearTimeout(o.scrollTimer);  
  33.         }  
  34.         // 如果暫停了滾動(dòng)(鼠標(biāo)放到了滾動(dòng)層上)  
  35.         // 開始以10毫秒的時(shí)間間隔運(yùn)行滾動(dòng)      
  36.         if (o.isPause) {  
  37.             o.scrollTimer = setTimeout(anim, 10);  
  38.             return;  
  39.         }  
  40.         // 當(dāng)顯示完所有信息后(這時(shí)滾動(dòng)的距離就等于要滾動(dòng)信息的高度msg_h)  
  41.         // 這時(shí)又重新開始滾動(dòng),將滾動(dòng)距離清零  
  42.         if (msg_h - o.scrollValue <= 0) {  
  43.             o.scrollValue = 0;  
  44.         }  
  45.         else {  
  46.             o.scrollValue += 1;  
  47.             o.scrollHeight += 1;  
  48.         }  
  49.         // 根據(jù)瀏覽器的不同,處理滾動(dòng)  
  50.         if (o.isMoz) { // Mozilla引擎瀏覽器  
  51.             s_area.scrollTop = o.scrollValue;  
  52.         }  
  53.         else { // 其余的瀏覽器則使用控制CSS樣式處理滾動(dòng)  
  54.             s_msg.style.top = -1 * o.scrollValue + "px";  
  55.             c_msg.style.top = (msg_h - o.scrollValue) + "px";  
  56.         }  
  57.         // 滾動(dòng)高度等于顯示滾動(dòng)區(qū)域高度時(shí)(滾動(dòng)完一行,一行內(nèi)容全部顯示)  
  58.         // 暫停4秒中,然后再開始執(zhí)行下依次滾動(dòng)。  
  59.         if (o.scrollHeight % s_area.offsetHeight == 0) {  
  60.             o.scrollTimer = setTimeout(anim, o.speed);  
  61.         }  
  62.         else {  
  63.             // 在兩行內(nèi)容之間過度滾動(dòng)時(shí),每10豪秒上升1px  
  64.             o.scrollTimer = setTimeout(anim, 10);  
  65.         }  
  66.     };  
  67.     // 執(zhí)行滾動(dòng)  
  68.     anim();  
  69. };  
  70. /**  
  71. * scrollVertical 垂直滾動(dòng)的構(gòu)造函數(shù)  
  72. * @param {Object} disp   - 必須 顯示滾動(dòng)區(qū)域的DOM節(jié)點(diǎn)(或節(jié)點(diǎn)ID)   
  73. * @param {Object} msg    - 必須 被顯示的信息的DOM節(jié)點(diǎn)(或節(jié)點(diǎn)ID)  
  74. * @param {string} tg     - 可選 以什么標(biāo)記為一行的標(biāo)簽名稱(tagName)  
  75. */ 
  76. function scrollVertical(disp, msg, tg){  
  77.     // 給在之前定義的this.scrollArea付值  
  78.     if (typeof(disp) == 'string') {  
  79.         // 如果disp給的是節(jié)點(diǎn)的ID,通過document.getElementById獲取該節(jié)點(diǎn)  
  80.         // 然后付值給this.scrollArea  
  81.         this.scrollArea = document.getElementById(disp);  
  82.     }  
  83.     else {  
  84.         // 如果是DOM節(jié)點(diǎn),直接付給this.scrollArea  
  85.         this.scrollArea = disp;  
  86.     }  
  87.     // 以給this.scrollArea相同的方法給this.scrollMsg付值  
  88.     if (typeof(msg) == 'string') {  
  89.         this.scrollMsg = document.getElementById(msg);  
  90.     }  
  91.     else {  
  92.         this.scrollMsg = msg;  
  93.     }  
  94.       
  95.     // 為了開發(fā)方便,  
  96.     // 不用一直寫this.scrollMsg這么常的名字,  
  97.     // 將兩個(gè)對(duì)象付給局部變量  
  98.     var s_msg = this.scrollMsg;  
  99.     var s_area = this.scrollArea;  
  100.       
  101.     // 如果沒有給定一行的識(shí)別標(biāo)簽,  
  102.     // 默認(rèn)將li標(biāo)簽認(rèn)為是一行的標(biāo)簽  
  103.     // 所以上面介紹的,tag參數(shù)是可選的  
  104.     if (!tg) {  
  105.         var tg = 'li';  
  106.     }  
  107.       
  108.     // 獲取單行的高度  
  109.     // 獲取到***(s_msg.getElementsByTagName(tg)[0])tg(一行的標(biāo)簽)的高度,作為單行的高度  
  110.     this.unitHeight = s_msg.getElementsByTagName(tg)[0].offsetHeight;  
  111.     // 獲取整個(gè)信息框的高度  
  112.     // 公式為 單行高度(unitHeight)*行數(shù)(s_msg.getElementsByTagName(tg).length,顯示信息中包含多少個(gè)tg(行)標(biāo)簽)  
  113.     this.msgHeight = this.unitHeight * s_msg.getElementsByTagName(tg).length;  
  114.     /*   
  115.      * 復(fù)制要顯示的信息:  
  116.      * 連續(xù)滾動(dòng)的實(shí)現(xiàn)其實(shí)就是通過復(fù)制信息,  
  117.      * 并將復(fù)制的信添加到原始信息后  
  118.      * 當(dāng)原始信息滾動(dòng)顯示完成,就接著滾動(dòng)顯示復(fù)制的信息  
  119.      * 但給人的錯(cuò)覺是,我們看到信息連續(xù)不斷的顯示  
  120.      */ 
  121.     // 創(chuàng)建復(fù)制內(nèi)容節(jié)點(diǎn)  
  122.     var copydiv = document.createElement('div');  
  123.     // 這個(gè)地方感覺有點(diǎn)嵌妥  
  124.     // 直接使用element.id的方式,不過看上去,主流的瀏覽器都支持  
  125.     // 標(biāo)準(zhǔn)的DOM Core方法:  
  126.     // copydiv.setAttribute('id',s_area.id + "_copymsgid")  
  127.     copydiv.id = s_area.id + "_copymsgid";  
  128.     // 復(fù)制原始的信息  
  129.     // 將原始的信息s_msg中的內(nèi)容,直接用innerHTML寫到  
  130.     copydiv.innerHTML = s_msg.innerHTML;  
  131.     // 設(shè)置復(fù)制信息節(jié)點(diǎn)的高度  
  132.     copydiv.style.height = this.msgHeight + "px";  
  133.     // 將復(fù)制節(jié)點(diǎn)添加到原始接點(diǎn)(scrollMsg)后  
  134.     // 其實(shí)實(shí)現(xiàn)的方法就是將復(fù)制信息節(jié)點(diǎn)(copydiv)添家到顯示區(qū)域的節(jié)點(diǎn)(scrollArea)中  
  135.     s_area.appendChild(copydiv);  
  136.       
  137.     this.copyMsg = copydiv;  
  138.     // 開始執(zhí)行滾動(dòng)方法  
  139.     this.play(this);  
  140. }  
  141.  

我在腳本的注釋中已經(jīng)說了這個(gè)效果的實(shí)現(xiàn)原理,而實(shí)現(xiàn)一個(gè)效果的關(guān)鍵就是在于運(yùn)用setTimeout方法和clearTimeout方法。

setTimeout(func,time)

setTimeout是window對(duì)象的一個(gè)方法,所以如果要是看到這么寫window.setTimeout你不要感到奇怪,我們平時(shí)一般都省略了window。

setTimeout方法接受兩個(gè)參數(shù):
func - 在指定時(shí)間間隔內(nèi)要執(zhí)行的函數(shù);
time - 執(zhí)行函數(shù)的時(shí)間間隔(以毫秒為單位,1000毫秒等于1秒)

我一開始沒有解釋setTimeout的功能,而是先說了兩個(gè)參數(shù)的意思,我想大家看了后就會(huì)有所了解,setTimeout的功能就是:設(shè)置定時(shí)器,在一段時(shí)間之后執(zhí)行指定的代碼。

不如本例中的:

setTimeout(anim, o.speed);

也許你有看過類似的寫法:

  1. function dosomething(){  
  2.     // do something  
  3. }  
  4. setTimeOout('dosomething',1000); 

個(gè)人建議不要這么寫,是這樣的代碼的可讀性太差,雖然也可以正常執(zhí)行。相信你看到的類似的代碼也是很久前的東西了。如果你還在新買的某本書中看到這樣的寫法,我想你可能很不幸買了本爛書?,F(xiàn)在一般我們都這么做:

  1. function whatWeDoNow(){  
  2.     var str = 'this is what we do now';  
  3.     if(doalert) {  
  4.        clearTimeout(doalert)  
  5.     }     
  6.     var doalert = setTimeout(function(){  
  7.        alert(str);  
  8.     },1000);  

而且不知道你發(fā)現(xiàn)沒有,這么寫還有一個(gè)好處,你的function還可以接受其他的參數(shù),比如這里我們可以接受whatWeDoNow()函數(shù)中的局部變量。如果你再結(jié)合閉包的使用,好處會(huì)更顯而易見。

剛才說的一點(diǎn)應(yīng)該說是一個(gè)不好的使用setTimeout的習(xí)慣。呵呵,接下來我還要說的一個(gè)更不好的使用習(xí)慣就是只使用setTimeout()方法,而不使用clearTimeout()方法。

clearTimeout(itimeoutid)

clearTimeout()方法的功能是停止定時(shí)器,大家看上面的代碼:

clearTimeout(o.scrollTimer);

Timer(定時(shí)器),夠直接吧。那么為什么要停止定時(shí)器?什么時(shí)候停止呢?

為什么要停,我想用個(gè)反問:能一直不停嗎,你的機(jī)器受得了嗎?這里我想應(yīng)該說說我們使用setTimeout的目的,我們通常使用它來實(shí)現(xiàn)像本例這 樣的動(dòng)畫效果。需要在很短的時(shí)間內(nèi)連續(xù)不斷的執(zhí)行定時(shí)器,當(dāng)然它是要占資源的啊。想想,只是不斷的創(chuàng)建,而且往往我們做的處理,在1秒中內(nèi)會(huì)執(zhí)行很多次函 數(shù),一兩次還好,上百上千次,而且一個(gè)復(fù)雜些的動(dòng)畫,執(zhí)行很短的時(shí)間內(nèi)幾萬次也不是沒有可能事情。你想想,如果我們不在每執(zhí)行完一次后,銷毀它。要是再加 上定時(shí)器執(zhí)行的函數(shù)又是個(gè)比較NB點(diǎn)的運(yùn)算,你的寶貴的系統(tǒng)資源...,呵呵!

所以應(yīng)該向我給的例子中那樣,記得在每次執(zhí)行了定時(shí)器后停止(銷毀,釋放資源)它。

  1. function whatWeDoNow(){  
  2.     var str = 'this is what we do now';  
  3.     if(doalert) {  
  4.        clearTimeout(doalert); // clear  
  5.     }     
  6.     var doalert = setTimeout(function(){  
  7.        alert(str);  
  8.     },1000);  
  9. }  
  10. if (o.scrollTimer) {   
  11.     clearTimeout(o.scrollTimer); // clear  

呵呵,其實(shí)銷毀的方法很簡(jiǎn)單,就是在每次創(chuàng)建定時(shí)器前,判斷是否已經(jīng)創(chuàng)建了訂時(shí)器,就像特效例子中的

  1. if (o.scrollTimer) {   
  2.     clearTimeout(o.scrollTimer); // clear  
  3. }  
  4. ....  
  5. ....  
  6. if (o.scrollHeight % s_area.offsetHeight == 0) {  
  7.     o.scrollTimer = setTimeout(anim, o.speed);  
  8. }  
  9. else {  
  10.     o.scrollTimer = setTimeout(anim, 10);  

是不是一個(gè)很流暢的循環(huán)?現(xiàn)在大家應(yīng)該知道了,為什么要clearTimeout和何時(shí)clearTimeout了嗎?


【編輯推薦】

  1. 不唐突的JavaScript的七條準(zhǔn)則
  2. JavaScript中的Object到底是什么
  3. JavaOne 2009第三天:微軟與Sun/Oracle攜手并進(jìn)
  4. 開發(fā)高可移植性J2ME的軟件
  5. Java虛擬機(jī)(JVM)中的內(nèi)存設(shè)置詳解
責(zé)任編輯:王觀 來源: 動(dòng)態(tài)網(wǎng)站制作指南
相關(guān)推薦

2016-03-27 15:06:02

Veeam/業(yè)務(wù)永續(xù)

2015-01-26 16:58:38

ISSU在線升級(jí)技術(shù)不間斷網(wǎng)絡(luò)華為

2023-10-25 08:01:30

redis主庫服務(wù)

2011-06-15 11:14:58

惠普集裝箱EcoPOD

2021-02-22 22:06:54

軟件安全數(shù)據(jù)安全漏洞

2018-08-20 15:43:51

新華三

2009-11-04 21:47:55

2023-08-29 17:08:14

5G物聯(lián)網(wǎng)

2024-01-25 10:20:40

防火墻網(wǎng)絡(luò) 安全雙機(jī)熱備

2011-09-19 13:03:02

2011-07-22 13:30:52

JavaScript

2015-12-28 15:24:48

數(shù)據(jù)中心網(wǎng)絡(luò)設(shè)備

2011-11-10 15:14:54

華碩無線路由RT-N13U

2009-12-01 11:31:59

不間斷電源

2022-09-09 14:23:32

數(shù)據(jù)中心IT服務(wù)

2021-10-09 17:27:21

數(shù)據(jù)中心數(shù)字化轉(zhuǎn)型IT

2012-03-15 17:46:49

BanggooADC應(yīng)用交付

2010-05-14 16:34:59

IT管理移動(dòng)通信Avocent

2011-07-15 15:18:08

卓望中移動(dòng)關(guān)鍵業(yè)務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久久水蜜桃| 日韩精品欧美精品| 一区在线视频| 亚洲欧洲日产国码二区| 欧美老肥婆性猛交视频| 免费无码毛片一区二三区| 日本蜜桃在线观看视频| 在线成人亚洲| 欧美一区二区三区…… | 91久久电影| 777国产偷窥盗摄精品视频| 亚洲欧美在线综合| 亚洲欧美色图片| 日韩精品第一页| 97在线视频免费观看完整版| 日韩av一区二区三区四区| 成人xxxx视频| 日韩在线观看一区| 欧美性xxxx极品高清hd直播 | 日韩精品―中文字幕| 激情综合网av| 亚洲制服欧美久久| 久久99国产精品尤物| 中文字幕在线观看一区二区三区| av在线播放资源| 在线不卡一区二区| 亚洲午夜精品久久久久久久久久久久 | 欧美日韩国产综合一区二区 | 国产成人精品免高潮费视频| 天堂成人在线| 亚洲欧美日本在线| 美女胸又www又黄的网站| 香蕉视频国产精品| 91在线视频九色| 在线视频观看日韩| 日韩国产在线一区| 国产在线精品免费| koreanbj精品视频一区| 国产精品不卡一区二区三区| 色琪琪丁香婷婷综合久久| 欧美视频13p| 国产原创精品视频| 国产午夜精品麻豆| 日韩在线亚洲| 国产精品美女久久| 92久久精品| 精品亚洲一区二区三区在线观看 | 在线精品视频一区二区| 特级西西444| 欧美aaaaaaaaaaaa| 99电影在线观看| 久久99伊人| 97久久精品视频| 一道在线中文一区二区三区| 日韩欧美高清dvd碟片| 九一精品在线观看| 一区二区三区中文在线观看| 一级二级在线观看| 成人福利电影精品一区二区在线观看| 国产精品va在线观看无码| 国产日韩精品一区二区浪潮av| 超碰在线中文| 日韩一区二区高清| 国产一二三视频| 欧美日韩精品一区二区三区蜜桃| 俺来俺也去www色在线观看| 欧美大学生性色视频| 一级毛片免费高清中文字幕久久网| 特黄特色欧美大片| 亚洲女人被黑人巨大进入al| 国模冰冰炮一区二区| 国产精品理论片在线观看| 狠狠干夜夜操| 欧美一区二区三区视频免费| 在线视频成人| 91蜜桃网站免费观看| 国产日韩一区二区三免费高清| 国产亚洲在线观看| 中文字幕亚洲精品| 美足av综合网| 国产中文欧美精品| 国产主播色在线| 欧美日韩国产不卡| 国产一区二区在线观看视频| 青椒成人免费视频| 这里只有精品66| 中文字幕精品在线不卡| 四虎影视2018在线播放alocalhost| 亚洲大胆人体视频| 亚洲三级性片| 波多野结衣三级在线| 亚洲成精国产精品女| 久久综合久久久久| 欧美午夜宅男影院在线观看| 国产一区影院| 日韩电影在线播放| 亚洲图片欧美色图| 日韩中文字幕视频网| 亚洲美女搞黄| 色乱码一区二区三区88| 中文字幕亚洲在线观看 | 国产第一页在线| 国产精品国产亚洲伊人久久 | 欧美国产日产图区| 2018av在线| 99视频在线播放| 亚洲欧美在线视频| 成人黄色免费观看| 午夜精品区一区二区三| 欧美日韩一区二区在线| 开心激情综合| 国产日韩av网站| 欧美一区二区美女| 一区二区中文字| 三年片观看免费观看大全视频下载| 中文字幕久久精品| 人禽交欧美网站| 黄色av网址在线免费观看| 性色av一区二区三区| www.66久久| 国产午夜伦鲁鲁| 亚洲精品ady| 亚洲影院在线| 午夜精品电影在线观看| 亚洲mv在线观看| 伊人久久大香线蕉av不卡| 国产一级特黄a大片免费| 美女国内精品自产拍在线播放| 久热久精久品这里在线观看| 一区二区三区精品久久久| 日韩成人在线电影| 欧美福利视频网站| 国产高清无密码一区二区三区| 在线中文字幕第一页| 粉嫩高清一区二区三区精品视频 | 亚洲一区电影| 欧美少妇性生活视频| 久久久av网站| 91偷拍与自偷拍精品| 欧美视频第一| 少妇人妻无码专区视频| 亚洲国产日日夜夜| 99欧美精品| 日本色护士高潮视频在线观看| 欧洲av在线精品| 久久久久国产精品麻豆ai换脸 | 91在线免费网站| 亚洲一区二区精品3399| 欧美自拍偷拍| 精品av中文字幕在线毛片| 国产精品免费观看高清| 欧美一级片在线观看| 精品一区二区影视| 色综合一区二区日本韩国亚洲| 亚洲国产精品久久久久婷蜜芽| 色综合天天综合网国产成人网| 国产精品毛片大码女人| 久久中文字幕av| 伊人在我在线看导航| 国产一级黄色录像片| 日韩一区二区三区国产| 中文字幕不卡在线观看| 日韩精品影视| 成人黄视频在线观看| 影音欧美亚洲| 久久国产精品99国产精| 亚洲国产成人精品视频| 亚洲区一区二| 新片速递亚洲合集欧美合集| 黄色手机在线视频| 91欧美日韩一区| 精品久久人人做人人爽| 2021中文字幕一区亚洲| 日韩在线看片| 欧美24videosex性欧美| 亚洲熟妇无码一区二区三区导航| 亚洲蜜臀av乱码久久精品 | 玖玖精品一区| 欧美日产国产精品| 丝袜亚洲另类欧美| 日本视频一区在线观看| 成人国产亚洲欧美成人综合网 | 超碰97人人人人人蜜桃| 欧美在线关看| www黄色av| 2020欧美日韩在线视频| 亚洲成av人综合在线观看| 伊人久久综合| 8av国产精品爽爽ⅴa在线观看| 成人黄色免费电影| 中文字幕在线不卡| 欧美日韩一区二区三区四区在线观看| av片在线观看| 妓院一钑片免看黄大片| 91久久精品国产91性色| 亚洲欧美日韩区| 天涯成人国产亚洲精品一区av| 毛片av中文字幕一区二区| 亚洲天堂日韩在线| 美女的胸无遮挡在线观看|