可以結(jié)合css3實(shí)現(xiàn)。

創(chuàng)新互聯(lián)堅(jiān)信:善待客戶,將會(huì)成為終身客戶。我們能堅(jiān)持多年,是因?yàn)槲覀円恢笨芍档眯刨嚒N覀儚牟缓鲇瞥踉L客戶,我們用心做好本職工作,不忘初心,方得始終。10年網(wǎng)站建設(shè)經(jīng)驗(yàn)創(chuàng)新互聯(lián)是成都老牌網(wǎng)站營(yíng)銷服務(wù)商,為您提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、HTML5建站、網(wǎng)站制作、品牌網(wǎng)站制作、小程序定制開(kāi)發(fā)服務(wù),給眾多知名企業(yè)提供過(guò)好品質(zhì)的建站服務(wù)。
css3可以設(shè)置動(dòng)畫和過(guò)渡,動(dòng)畫當(dāng)中可以設(shè)置旋轉(zhuǎn)、移動(dòng)和縮放等參數(shù)。
可以在長(zhǎng)按的時(shí)候,更改為帶有動(dòng)畫的類名,就可以執(zhí)行css3的動(dòng)畫了。
div id="noticeback"/div
換成
ul id="noticeback"/ul
JavaScript 函數(shù)節(jié)流詳解
瀏覽器一個(gè)網(wǎng)頁(yè)的UI線程只有一個(gè),他同時(shí)會(huì)處理界面的渲染和頁(yè)面JavaScript代碼的執(zhí)行(簡(jiǎn)單擴(kuò)展一下,瀏覽器或者JavaScript運(yùn)行大環(huán)境并不是單線程,諸如ajax異步回調(diào)、hybrid框架內(nèi)與native通信、事件隊(duì)列、CSS運(yùn)行線程等等都屬于多線程環(huán)境,不過(guò)ES6引入了Promise類來(lái)減少了部分異步情況)。因此當(dāng)JavaScript代碼運(yùn)行計(jì)算量很大的方法時(shí),就有可能阻塞UI線程,小則導(dǎo)致用戶響應(yīng)卡頓,嚴(yán)重的情況下瀏覽器會(huì)提示頁(yè)面無(wú)響應(yīng)是否強(qiáng)制關(guān)閉。例如網(wǎng)頁(yè)的頁(yè)面滾動(dòng)事件、移動(dòng)設(shè)備的滑動(dòng)、縮放事件等。即使沒(méi)有出現(xiàn)嚴(yán)重的性能問(wèn)題,我們也應(yīng)該站在性能優(yōu)化的角度將短時(shí)間內(nèi)會(huì)多次觸發(fā)的大規(guī)模處理時(shí)間進(jìn)行分流計(jì)算。
如何有效避免UI線程運(yùn)行過(guò)長(zhǎng)的代碼,是所有用戶交互應(yīng)用需要考慮的問(wèn)題,同樣的問(wèn)題在客戶端Android可以使用UI主線程開(kāi)子線程來(lái)分散計(jì)算。與此對(duì)應(yīng)的,js也可以通過(guò)引入webWorker來(lái)分散計(jì)算,但是在js中有一個(gè)更簡(jiǎn)單并且效果不錯(cuò)的方法:函數(shù)節(jié)流。使用函數(shù)節(jié)流的核心技巧就是使用定時(shí)器分段計(jì)算。具體的實(shí)現(xiàn)方式大致有兩種思路。
·方法一
1.這種實(shí)現(xiàn)方式的思路很好理解:設(shè)置一個(gè)一間隔時(shí)間,比如50毫秒,以此時(shí)間為基準(zhǔn)設(shè)置定時(shí)器,當(dāng)?shù)谝淮斡|發(fā)事件到第二次觸發(fā)事件間隔小于50毫秒時(shí),清除這個(gè)定時(shí)器,并設(shè)置一個(gè)新的定時(shí)器,以此類推,直到有一次事件觸發(fā)后50毫秒內(nèi)沒(méi)有重復(fù)觸發(fā)。代碼如下:
function debounce(method){ clearTimeout(method.timer); method.timer=setTimeout(function(){ method(); },50); }
這種設(shè)計(jì)方式有一個(gè)問(wèn)題:本來(lái)應(yīng)該多次觸發(fā)的事件,可能最終只會(huì)發(fā)生一次。具體來(lái)說(shuō),一個(gè)循序漸進(jìn)的滾動(dòng)事件,如果用戶滾動(dòng)太快速,或者程序設(shè)置的函數(shù)節(jié)流間隔時(shí)間太長(zhǎng),那么最終滾動(dòng)事件會(huì)呈現(xiàn)為一個(gè)很突然的跳躍事件,中間過(guò)程都被節(jié)流截掉了。這個(gè)例子舉的有點(diǎn)夸張了,不過(guò)使用這種方式進(jìn)行節(jié)流最終是會(huì)明顯感受到程序比不節(jié)流的時(shí)候“更突兀”,這對(duì)于用戶體驗(yàn)是很差的。有一種彌補(bǔ)這種缺陷的設(shè)計(jì)思路。
·方法二
2.第二種實(shí)現(xiàn)方式的思路與第一種稍有差別:設(shè)置一個(gè)間隔時(shí)間,比如50毫秒,以此時(shí)間為基準(zhǔn)穩(wěn)定分隔事件觸發(fā)情況,也就是說(shuō)100毫秒內(nèi)連續(xù)觸發(fā)多次事件,也只會(huì)按照50毫秒一次穩(wěn)定分隔執(zhí)行。代碼如下:
var oldTime=new Date().getTime(); var delay=50; function throttle1(method){ var curTime=new Date().getTime(); if(curTime-oldTime=delay){ oldTime=curTime; method(); } }
相比于第一種方法,第二種方法也許會(huì)比第一種方法執(zhí)行更多次(有時(shí)候意味著更多次請(qǐng)求后臺(tái),即更多的流量),但是卻很好的解決了第一種方法清除中間過(guò)程的缺陷。因此在具體場(chǎng)景應(yīng)根據(jù)情況擇優(yōu)決定使用哪種方法。
對(duì)于方法二,我們?cè)偬峁┝硪环N同樣功能的寫法:
var timer=undefined,delay=50; function throttle2(method){ if(timer){ return ; } method(); timer=setTimeout(function(){ timer=undefined; },delay); }
最后說(shuō)點(diǎn)個(gè)外話,說(shuō)明一下函數(shù)節(jié)流的名稱問(wèn)題,大家往往會(huì)看到throttle和debounce兩個(gè)方法名,throttle可以譯為“節(jié)制,卡住”,debounce可以譯為“防反跳”。在《JavaScript高級(jí)程序設(shè)計(jì)》中作者介紹了方法一,并且作者使用了“throttle”這個(gè)函數(shù)名。而在《第三方JavaScript編程》書中同時(shí)出現(xiàn)了方法一和方法二,作者將方法一命名為“debounce”,將方法二命名為“throttle”。國(guó)內(nèi)在同時(shí)介紹兩個(gè)方法的時(shí)候有些文章錯(cuò)誤的將方法一命名為“throttle”,而將方法二命名為“debounce”,從英語(yǔ)的角度來(lái)說(shuō)是很不負(fù)責(zé)任的。因此在這里撥亂反正:方法一適合理解為“防反跳”,應(yīng)命名
節(jié)流概念(Throttle)
按照設(shè)定的時(shí)間固定執(zhí)行一次函數(shù),比如200ms一次。注意:固定就是你在mousemove過(guò)程中,執(zhí)行這個(gè)節(jié)流函數(shù),它一定是200ms(你設(shè)定的定時(shí)器延遲時(shí)間)內(nèi)執(zhí)行一次。沒(méi)到200ms,一定會(huì)返回,沒(méi)有執(zhí)行回調(diào)函數(shù)的。
主要應(yīng)用場(chǎng)景有:scroll、touchmove
防抖概念(Debounce)
抖動(dòng)停止后的時(shí)間超過(guò)設(shè)定的時(shí)間時(shí)執(zhí)行一次函數(shù)。注意:這里的抖動(dòng)停止表示你停止了觸發(fā)這個(gè)函數(shù),從這個(gè)時(shí)間點(diǎn)開(kāi)始計(jì)算,當(dāng)間隔時(shí)間等于你設(shè)定時(shí)間,才會(huì)執(zhí)行里面的回調(diào)函數(shù)。如果你一直在觸發(fā)這個(gè)函數(shù)并且兩次觸發(fā)間隔小于設(shè)定時(shí)間,則一定不會(huì)到回調(diào)函數(shù)那一步。·
主要應(yīng)用場(chǎng)景有:input驗(yàn)證、搜索聯(lián)想、resize
節(jié)流實(shí)現(xiàn)
思路: 第一次先設(shè)定一個(gè)變量true,第二次執(zhí)行這個(gè)函數(shù)時(shí),會(huì)判斷變量是否true,是則返回。當(dāng)?shù)谝淮蔚亩〞r(shí)器執(zhí)行完函數(shù)最后會(huì)設(shè)定變量為flase。那么下次判斷變量時(shí)則為flase,函數(shù)會(huì)依次運(yùn)行。
防抖實(shí)現(xiàn)
思路:首次運(yùn)行時(shí)把定時(shí)器賦值給一個(gè)變量,第二次執(zhí)行時(shí),如果間隔沒(méi)超過(guò)定時(shí)器設(shè)定的時(shí)間則會(huì)清除掉定時(shí)器,重新設(shè)定定時(shí)器,依次反復(fù),當(dāng)我們停止下來(lái)時(shí),沒(méi)有執(zhí)行清除定時(shí)器,超過(guò)一定時(shí)間后觸發(fā)回調(diào)函數(shù)。
博文有介紹更詳細(xì)的原理和代碼demo:網(wǎng)頁(yè)鏈接,希望可以幫到您
分享題目:javascript抖動(dòng),html頁(yè)面抖動(dòng)
瀏覽地址:http://chinadenli.net/article41/dsgeoed.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、商城網(wǎng)站、網(wǎng)站導(dǎo)航、搜索引擎優(yōu)化、微信公眾號(hào)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)