原生JS實(shí)現(xiàn)圖片網(wǎng)格式漸顯、漸隱效果
先給出效果圖:
寫(xiě)的小組件支持圖片的漸顯、漸隱,并且可以是有序、隨機(jī)兩種方式。
我采用的原型是屬性寫(xiě)在構(gòu)造函數(shù)內(nèi),方法寫(xiě)在原型對(duì)象內(nèi)。方法寫(xiě)構(gòu)造函數(shù)內(nèi)有個(gè)問(wèn)題,就是每次調(diào)用這個(gè)方法就相當(dāng)于重新實(shí)例化一次,舉個(gè)粟子:
實(shí)現(xiàn)網(wǎng)格效果的原理上是將讀取圖片的寬高,按照設(shè)定的參數(shù),分成等高寬的網(wǎng)格(我用的span標(biāo)簽表示的網(wǎng)格),網(wǎng)格利用定位鋪滿(mǎn)整個(gè)圖片,每個(gè)網(wǎng)格的背景圖都是原圖片,原理同sprite,利用background-position屬性改變顯示區(qū)域。接下來(lái)就是按照設(shè)定的順序?qū)崿F(xiàn)漸顯或漸隱。漸顯或漸隱用的是JS的animation屬性和CSS3的animation屬性在屬性值上有所區(qū)別,這次使用也才知道JS的animation屬性里有個(gè)animationFillMode(規(guī)定當(dāng)動(dòng)畫(huà)不播放時(shí)(當(dāng)動(dòng)畫(huà)完成時(shí),或當(dāng)動(dòng)畫(huà)有一個(gè)延遲未開(kāi)始播放時(shí)),要應(yīng)用到元素的樣式。)屬性值。
我綁定的事件是點(diǎn)擊,完全可以用其他事件或頁(yè)面加載觸發(fā)。我的代碼稍加改動(dòng)就可以實(shí)現(xiàn)網(wǎng)格式輪播圖。
下面給出源代碼:
<!doctype html> <head> <title>網(wǎng)格效果</title> <style> @charset "utf-8"; /*css reset*/ html{font-family:"Helvetica Neue",Helvetica,STHeiTi,sans-serif;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;} body{-webkit-overflow-scrolling:touch;margin:0;} ul{margin:0;padding:0;list-style:none;outline:none;} dl,dd{margin:0;} a{display:inline-block;margin:0;padding:0;text-decoration:none;background:transparent;outline:none;color:#000;} a:link,a:visited,a:hover,a:active{text-decoration:none;color:currentColor;} a,dt,dd{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;} img{border:0;} p{margin:0;} input,button,select,textarea{margin:0;padding:0;border:0;outline:0;background-color:transparent;} /*css*/ .origin-pic { display: inline-block; width: 200px; height: 200px; } .grid-area { display: inline-block; position: relative; width: 200px; height: 200px; } .grid { position: absolute; } #img1 { opacity: 1; width: 200px; height: 200px; } @keyframes fadeout{ 0% {opacity: 1} 100% {opacity: 0} } @keyframes fadein{ 0% {opacity: 0} 100% {opacity: 1} } </style> </head> <body> <div> <img class="origin-pic" src="./pic.jpg" /> </div> <div id="grid_area" class="grid-area"> <img id="img1" src="./pic.jpg" /> </div> <script> var gridSetting = { 'cell': 10, // 行、列數(shù)量 'mode': 'fadeout', // 備選參數(shù): fadeout, fadein 'sort': 'random', // 備選參數(shù): inturn, random 'num': 1, // 每次發(fā)生動(dòng)作的網(wǎng)格數(shù),目前只支持1 complete: function() { // 事件完成時(shí)的回調(diào)函數(shù) console.log('ok!'); } }; var img1 = document.getElementById('img1'); (function(doc, setting, ele) { var defaults = { 'speed': 20, }; function Grid(ele) { this.ele = ele; this.settings = Object.assign({}, setting, defaults); } Grid.prototype = { constructor: Grid, // 構(gòu)建UI _create: function() { var img = this.ele, settings = this.settings, cell = settings.cell, imgWidth = img.width, imgHeight = img.height, gridWidth = imgWidth / cell, // 每個(gè)網(wǎng)格寬度 gridHeight = imgHeight / cell, // 每個(gè)網(wǎng)格高度 currentTop = 0, currentLeft = 0, fragment = doc.createDocumentFragment(), i = 0, gridArr = []; img.style.display = 'none'; for (; i < cell * cell; i++) { var spanNode = doc.createElement('span'); spanNode.setAttribute('id', i); spanNode.style.cssText += 'position: absolute;' + 'top: ' + currentTop + 'px;' + 'left: ' + currentLeft + 'px;' + 'margin: 0;' + 'padding: 0;' + 'width: ' + gridWidth + 'px;' + 'height: ' + gridHeight + 'px;' + 'opacity:' + settings.opacity + ';' + 'background: url('+ img.src + ');' + 'background-size: ' + imgWidth + 'px ' + imgHeight + 'px;' + 'background-position: -' + currentLeft + 'px -' + currentTop + 'px;'; if (currentLeft < (imgWidth - gridWidth)) { currentLeft += gridWidth; } else { currentLeft = 0; currentTop += gridHeight; } fragment.append(spanNode); gridArr.push(i); } this.gridArr = gridArr; doc.getElementById('grid_area').append(fragment); }, // 漸顯、漸隱 _fade: function() { var gridArr = this.gridArr, cloneArr = gridArr.slice(0), length = gridArr.length, settings = this.settings, sort = settings.sort, i = 0; switch(settings.mode) { case 'fadeout': if (sort == 'inturn') { // 按順序漸隱 var timer = setInterval(function() { doc.getElementById(gridArr[i]).style.animation = "fadeout 1s forwards"; i++; if (i >= settings.cell * settings.cell) { clearInterval(timer); settings.complete(); } }, settings.speed) } else if (sort == 'random') { // 隨機(jī)漸隱 var timer = setInterval(function() { i = cloneArr.splice(Math.random() * length--, 1); doc.getElementById(gridArr[i]).style.animation = "fadeout 1s forwards"; if (length == 0) { clearInterval(timer); settings.complete(); } }, settings.speed) } break; case 'fadein': if (sort == 'inturn') { // 按順序漸漸顯 var timer = setInterval(function() { doc.getElementById(gridArr[i]).style.animation = "fadein 1s forwards"; i++; if (i >= settings.cell * settings.cell) { clearInterval(timer); settings.complete(); } }, settings.speed) } else if (sort == 'random') { // 隨機(jī)漸顯 var timer = setInterval(function() { i = cloneArr.splice(Math.random() * length--, 1); doc.getElementById(gridArr[i]).style.animation = "fadein 1s forwards"; if (length == 0) { clearInterval(timer); settings.complete(); } }, settings.speed) } break; default: console.log('配置錯(cuò)誤!'); } }, _checkMode: function() { if (this.settings.mode == 'fadein') { this.settings.opacity = 0; } else { this.settings.opacity = 1; } }, }; var gridArea = doc.getElementById('grid_area'); gridArea.addEventListener('click', function() { var event = new Grid(ele); event._checkMode(); event._create(); event._fade(); }, false); })(document, gridSetting, img1); </script> </body> </html>
以上所述是小編給大家介紹的原生JS實(shí)現(xiàn)圖片網(wǎng)格式漸顯、漸隱效果,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Three.js學(xué)習(xí)之網(wǎng)格
- JavaScript實(shí)現(xiàn)拖拽元素對(duì)齊到網(wǎng)格(每次移動(dòng)固定距離)
- 分享十三個(gè)最佳JavaScript數(shù)據(jù)網(wǎng)格庫(kù)
- Vue.js實(shí)現(xiàn)網(wǎng)格列表布局轉(zhuǎn)換方法
- Three.js中網(wǎng)格對(duì)象MESH的屬性與方法詳解
- Javascript Bootstrap的網(wǎng)格系統(tǒng),導(dǎo)航欄和輪播詳解
- JavaScript?Canvas繪制六邊形網(wǎng)格
- JavaScript網(wǎng)格中的最小路徑講解
相關(guān)文章
JS實(shí)現(xiàn)簡(jiǎn)易留言板增刪功能
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)簡(jiǎn)易留言板增刪功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02uni-app和原生小程序混合開(kāi)發(fā)的具體實(shí)現(xiàn)過(guò)程
最近項(xiàng)目中遇到了一些功能需要與原生進(jìn)行混合開(kāi)發(fā),所以下面這篇文章主要給大家介紹了關(guān)于uni-app和原生小程序混合開(kāi)發(fā)的具體實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下2022-07-07JavaScript Event學(xué)習(xí)第五章 高級(jí)事件注冊(cè)模型
在這一章我會(huì)講解兩種高級(jí)時(shí)間注冊(cè)模型:W3C和微軟的。因?yàn)檫@兩個(gè)方法都不能跨瀏覽器,所以在現(xiàn)在看來(lái)他們的使用場(chǎng)合并不多。2010-02-02JavaScript實(shí)現(xiàn)身份證驗(yàn)證代碼
本文給大家分享的是使用javascript實(shí)現(xiàn)身份驗(yàn)證的規(guī)則以及代碼,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2016-02-02原創(chuàng)javascript小游戲?qū)崿F(xiàn)代碼
javascript小游戲?qū)崿F(xiàn)代碼,喜歡用javascript實(shí)現(xiàn)游戲效果代碼的朋友可以參考下。2010-08-08Javascript的表單驗(yàn)證-揭開(kāi)正則表達(dá)式的面紗
Javascript的表單驗(yàn)證-揭開(kāi)正則表達(dá)式的面紗在本文重點(diǎn)介紹,感興趣的朋友一起學(xué)習(xí)吧2016-03-03