基于HTML代碼實(shí)現(xiàn)圖片碎片化加載功能

今天來(lái)實(shí)現(xiàn)一個(gè)圖片碎片化加載效果,效果如下:
我們分為 3 個(gè)步驟來(lái)實(shí)現(xiàn):
- 定義 html 結(jié)構(gòu)
- 拆分圖片
- 編寫動(dòng)畫函數(shù)
定義html結(jié)構(gòu)
這里只需要一個(gè) canvas 元素就可以了。
<html> <body> <canvas id="myCanvas" width="900" height="600" style="background-color: black;" ></canvas> </body> </html>
拆分圖片
這個(gè)例子中,我們將圖片按照 10 行 10 列的網(wǎng)格,拆分成 100 個(gè)小碎片,這樣就可以對(duì)每一個(gè)小碎片獨(dú)立渲染了。
let image = new Image(); image.src = "https://cdn.yinhengli.com/canvas-example.jpeg"; let boxWidth, boxHeight; // 拆分成 10 行,10 列 let rows = 10, columns = 20, counter = 0; image.onload = function () { // 計(jì)算每一行,每一列的寬高 boxWidth = image.width / columns; boxHeight = image.height / rows; // 循環(huán)渲染 requestAnimationFrame(animate); };
requestAnimationFrame :告訴瀏覽器,你希望執(zhí)行一個(gè)動(dòng)畫,并且要求瀏覽器在下次重繪之前調(diào)用指定的回調(diào)函數(shù)更新動(dòng)畫。
編寫動(dòng)畫函數(shù)
接下來(lái)我們編寫動(dòng)畫函數(shù),讓瀏覽器在每一次重繪前,隨機(jī)渲染某個(gè)小碎片。
這里的核心是 context.drawImage 方法。
let canvas = document.getElementById("myCanvas"); let context = canvas.getContext("2d"); function animate() { // 隨機(jī)渲染某個(gè)模塊 let x = Math.floor(Math.random() * columns); let y = Math.floor(Math.random() * rows); // 核心 context.drawImage( image, x * boxWidth, // canvas 中橫坐標(biāo)起始位置 y * boxHeight, // canvas 中縱坐標(biāo)起始位置 boxWidth, // 畫圖的寬度(小碎片圖像的寬) boxHeight, // 畫圖的高度(小碎片圖像的高) x * boxWidth, // 從大圖的 x 坐標(biāo)位置開始畫圖 y * boxHeight, // 從大圖的 y 坐標(biāo)位置開始畫圖 boxWidth, // 從大圖的 x 位置開始,畫多寬(小碎片圖像的寬) boxHeight // 從大圖的 y 位置開始,畫多高(小碎片圖像的高) ); counter++; // 如果模塊渲染了 90%,就讓整個(gè)圖片顯示出來(lái)。 if (counter > columns * rows * 0.9) { context.drawImage(image, 0, 0); } else { requestAnimationFrame(animate); } }
完整代碼
<html> <body> <canvas id="myCanvas" width="900" height="600" style="background-color: black;" ></canvas> <script> let image = new Image(); image.src = "https://cdn.yinhengli.com/canvas-example.jpeg"; let canvas = document.getElementById("myCanvas"); let context = canvas.getContext("2d"); let boxWidth, boxHeight; let rows = 10, columns = 20, counter = 0; image.onload = function () { boxWidth = image.width / columns; boxHeight = image.height / rows; requestAnimationFrame(animate); }; function animate() { let x = Math.floor(Math.random() * columns); let y = Math.floor(Math.random() * rows); context.drawImage( image, x * boxWidth, // 橫坐標(biāo)起始位置 y * boxHeight, // 縱坐標(biāo)起始位置 boxWidth, // 圖像的寬 boxHeight, // 圖像的高 x * boxWidth, // 在畫布上放置圖像的 x 坐標(biāo)位置 y * boxHeight, // 在畫布上放置圖像的 y 坐標(biāo)位置 boxWidth, // 要使用的圖像的寬度 boxHeight // 要使用的圖像的高度 ); counter++; if (counter > columns * rows * 0.9) { context.drawImage(image, 0, 0); } else { requestAnimationFrame(animate); } } </script> </body> </html>
總結(jié)
通過(guò)這個(gè) Demo,我們使用了 canvasAPI 實(shí)現(xiàn)了圖片的碎片加載效果,是不是特別簡(jiǎn)單!
到此這篇關(guān)于基于HTML代碼實(shí)現(xiàn)圖片碎片化加載功能的文章就介紹到這了,更多相關(guān)html圖片碎片化加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
- 這篇文章主要介紹了如何在HTML里加載攝像頭,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-29
html5用video標(biāo)簽流式加載的實(shí)現(xiàn)
這篇文章主要介紹了html5用video標(biāo)簽流式加載的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)2020-05-20- 這篇文章主要介紹了HTML5 圖片預(yù)加載的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)2020-03-25
傳統(tǒng)HTML頁(yè)面實(shí)現(xiàn)模塊化加載的方法
這篇文章主要介紹了傳統(tǒng)HTML頁(yè)面實(shí)現(xiàn)模塊化加載的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-10-15- 這篇文章主要介紹了HTML頁(yè)面縮小后顯示滾動(dòng)條的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-26
h5頁(yè)面背景圖很長(zhǎng)要有滾動(dòng)條滑動(dòng)效果的實(shí)現(xiàn)
這篇文章主要介紹了h5頁(yè)面背景圖很長(zhǎng)要有滾動(dòng)條滑動(dòng)效果的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-27HTML5實(shí)現(xiàn)直播間評(píng)論滾動(dòng)效果的代碼
這篇文章主要介紹了HTML5實(shí)現(xiàn)直播間評(píng)論滾動(dòng)效果的代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-27html+css實(shí)現(xiàn)滾動(dòng)到元素位置顯示加載動(dòng)畫效果
這篇文章主要介紹了html+css實(shí)現(xiàn)滾動(dòng)到元素位置顯示加載動(dòng)畫效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-27