麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > HTML > 正文

html5新增的定時器requestAnimationFrame實現(xiàn)進度條功能

2024-08-26 00:20:01
字體:
來源:轉載
供稿:網友

在requestAnimationFrame出現(xiàn)之前,我們一般都用setTimeout和setInterval,那么html5為什么新增一個requestAnimationFrame,他的出現(xiàn)是為了解決什么問題?

優(yōu)勢與特點:

1)requestAnimationFrame會把每一幀中的所有DOM操作集中起來,在一次重繪或回流中就完成,并且重繪或回流的時間間隔緊緊跟隨瀏覽器的刷新頻率

2)在隱藏或不可見的元素中,requestAnimationFrame將不會進行重繪或回流,這當然就意味著更少的CPU、GPU和內存使用量

3)requestAnimationFrame是由瀏覽器專門為動畫提供的API,在運行時瀏覽器會自動優(yōu)化方法的調用,并且如果頁面不是激活狀態(tài)下的話,動畫會自動暫停,有效節(jié)省了CPU開銷

一句話就是:這玩意性能高,不會卡屏,根據(jù)不同的瀏覽器自動調整幀率。如果看不懂或者不理解,也沒有什么關系,這玩意跟瀏覽器渲染原理有關。我們先學會使用它!

如何使用requestAnimationFrame?

使用方式跟定時器setTimeout差不多,不同之處在于,他不需要設置時間間隔參數(shù)

     var timer = requestAnimationFrame( function(){            console.log( '定時器代碼' );        } );

參數(shù)是一個回調函數(shù),返回值是一個整數(shù),用來表示定時器的編號.

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <script>        window.onload = function(){            var aInput = document.querySelectorAll( "input" ),                timer = null;            aInput[0].onclick = function(){                timer = requestAnimationFrame( function say(){                    console.log( 1 );                    timer = requestAnimationFrame( say );                } );            };            aInput[1].onclick = function(){                cancelAnimationFrame( timer );            }        }    </script></head><body>    <input type="button" value="開啟">    <input type="button" value="關閉"></body></html>

cancelAnimationFrame用來關閉定時器

這個方法需要處理兼容:

 簡單的兼容:

 window.requestAnimFrame = (function(){  return  window.requestAnimationFrame       ||          window.webkitRequestAnimationFrame ||          window.mozRequestAnimationFrame    ||          function( callback ){            window.setTimeout(callback, 1000 / 60);          };})();

如果瀏覽器都不認識AnimationFrame,就用setTimeout兼容.

運用3種不同的定時器(setTimeout, setInterval, requestAnimationFrame)實現(xiàn)一個進度條的加載

一、setInterval方式:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <style>        div{            width:0px;            height:40px;            border-radius:20px;            background:#09f;            text-align:center;            font:bold 30px/40px '微軟雅黑';            color:white;        }    </style>    <script>        window.onload = function(){            var oBtn = document.querySelector( "input" ),                oBox = document.querySelector( "div" ),                timer = null, curWidth = 0,                getStyle = function( obj, name, value ){                    if( obj.currentStyle ) {                        return obj.currentStyle[name];                    }else {                        return getComputedStyle( obj, false )[name];                    }                };            oBtn.onclick = function(){                clearInterval( timer );                oBox.style.width = '0';                timer = setInterval( function(){                    curWidth = parseInt( getStyle( oBox, 'width' ) );                    if ( curWidth < 1000 ) {                        oBox.style.width = oBox.offsetWidth + 10 + 'px';                        oBox.innerHTML = parseInt( getStyle( oBox, 'width' ) ) / 10 + '%';                    }else {                        clearInterval( timer );                    }                }, 1000 / 60 );            }        }    </script></head><body>    <div>0%</div>    <p><input type="button" value="ready!Go"></p></body></html>

html5,requestAnimationFrame,進度條

二、setTimeout方式

<script>        window.onload = function(){            var oBtn = document.querySelector( "input" ),                oBox = document.querySelector( "div" ),                timer = null, curWidth = 0,                getStyle = function( obj, name, value ){                    if( obj.currentStyle ) {                        return obj.currentStyle[name];                    }else {                        return getComputedStyle( obj, false )[name];                    }                };            oBtn.onclick = function(){                clearTimeout( timer );                oBox.style.width = '0';                timer = setTimeout( function go(){                    curWidth = parseInt( getStyle( oBox, 'width' ) );                    if ( curWidth < 1000 ) {                        oBox.style.width = oBox.offsetWidth + 10 + 'px';                        oBox.innerHTML = parseInt( getStyle( oBox, 'width' ) ) / 10 + '%';                        timer = setTimeout( go, 1000 / 60 );                    }else {                        clearInterval( timer );                    }                }, 1000 / 60 );            }        }    </script>

    三、requestAnimationFrame方式   

 <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <style>        div{            width:0px;            height:40px;            border-radius:20px;            background:#09f;            text-align:center;            font:bold 30px/40px '微軟雅黑';            color:white;        }    </style>    <script>        window.onload = function(){            var oBtn = document.querySelector( "input" ),                oBox = document.querySelector( "div" ),                timer = null, curWidth = 0,                getStyle = function( obj, name, value ){                    if( obj.currentStyle ) {                        return obj.currentStyle[name];                    }else {                        return getComputedStyle( obj, false )[name];                    }                };            oBtn.onclick = function(){                cancelAnimationFrame( timer );                oBox.style.width = '0';                timer = requestAnimationFrame( function go(){                    curWidth = parseInt( getStyle( oBox, 'width' ) );                    if ( curWidth < 1000 ) {                        oBox.style.width = oBox.offsetWidth + 10 + 'px';                        oBox.innerHTML = parseInt( getStyle( oBox, 'width' ) ) / 10 + '%';                        timer = requestAnimationFrame( go );                    }else {                        cancelAnimationFrame( timer );                    }                } );            }        }    </script></head><body>    <div>0%</div>    <p><input type="button" value="ready!Go"></p></body></html>

 


注:相關教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 精品国产96亚洲一区二区三区 | 久草热久草视频 | 国产免费一区二区三区视频 | 国产成人精品区 | 久久9色| 免费黄色在线观看网站 | 欧美激情第一区 | 精品国产96亚洲一区二区三区 | 久久久久一区二区三区 | 高清国产午夜精品久久久久久 | 国产一区二区不卡 | 中文字幕在线亚洲 | 婷婷久久影院 | 91精品久久久久久久 | 黄色伊人网站 | 激情夜色 | 天天看天天摸天天操 | 欧美一级片网站 | 欧洲成人在线视频 | 毛片免费观看视频 | 一级性生活视频 | 国产精品久久久久久久久久三级 | 国产交换3p国产精品 | 91美女视频在线观看 | 看免费毛片 | 成人午夜免费国产 | 狼人狠狠干 | 久久精品一级片 | 国产三级a三级三级 | 色人阁在线视频 | 亚洲福利在线免费观看 | 国产日韩在线 | 一本大道av | 羞羞视频免费网站男男 | 欧美精品欧美极品欧美激情 | 亚洲不卡 | 激情综合婷婷久久 | 精品在线一区二区三区 | 国产精品久久久久久久久久久久久久久久 | 亚洲一级片在线观看 | 日韩视频高清 |