摘要:每一個(gè)方格就是數(shù)組的一個(gè)個(gè)體。收工完成效果因?yàn)槲覍?shí)在是不想找那么多圖片,大概只拷貝了十份,然后乘以,所以會(huì)出現(xiàn)一個(gè)頭像重復(fù)三次的情況源碼。
我看到了什么
在看淘寶前端團(tuán)隊(duì)的博客的時(shí)候,無(wú)意中點(diǎn)進(jìn)了關(guān)于我們這個(gè)頁(yè)面,其中有個(gè)動(dòng)畫(huà)我覺(jué)得很有趣,也很通用,感覺(jué)在哪里都可以使用一樣,效果如下圖所示:
每次刷新的頭像和‘You’的位置都是不同的,說(shuō)實(shí)話,我覺(jué)得蠻有意思的,于是我自己嘗試去實(shí)現(xiàn)了一下。
下面我會(huì)從我的角度去分析實(shí)現(xiàn)這樣的效果,因?yàn)槲也恢繤ED他們是怎么實(shí)現(xiàn)的
先分析下小方塊的結(jié)構(gòu),就是:
img是頭像,span控制背景色,i用來(lái)制作鏡面的效果。
我們知道了這樣一個(gè)效果,本人近視,十米開(kāi)外男女不分的那種,然后看這個(gè)布局看著好熟悉,我看到的這個(gè)結(jié)構(gòu)大概是這種感覺(jué)
[ " ", " xxxx xx xxx ", " x x x x ", " xxxx x x x ", " x x x x ", " xxxx xx xxx ", " ", ]
哎嘿嘿,這個(gè)不就是是個(gè)字符串?dāng)?shù)組嗎嘛,那我當(dāng)作二維數(shù)組處理,豈不是可以輕易的找出要顯示的字符的橫坐標(biāo)和縱坐標(biāo),豈不美哉。先別急著擼起袖子就是干,根據(jù)我長(zhǎng)年不思考擼起袖子就是干被坑的經(jīng)驗(yàn),我想了一會(huì),似乎用一圍數(shù)組更好一點(diǎn),dom方面的處理也更加方便一些。每一個(gè)方格就是數(shù)組的一個(gè)個(gè)體。
想到這,我掐指一算我大概需要126個(gè)方格,方格呈7 * 18的布局方式,我又掐指一算我好像要寫(xiě)126的span標(biāo)簽,就像下面這樣:
萬(wàn)能的編輯器,我后來(lái)發(fā)現(xiàn)原來(lái)可以span*126+tab,機(jī)智如我,美滋滋。
?。磕銌?wèn)我上面的span是怎么弄的,我靠,我當(dāng)然是手慢慢敲的的啊
呃,感覺(jué)還是用js來(lái)生成更好些吧,方便,代碼量也少很多,好,我們擼起袖子就是干:
const faceList = (new Array(126)).map(() => { const face = document.createElement("span"); //... return face; }); document.body.append(faceList);
我們打開(kāi)網(wǎng)頁(yè):
這是個(gè)什么玩意?
好吧,不開(kāi)玩喜了,我們舉個(gè)例子吧,現(xiàn)在我想創(chuàng)建一個(gè)長(zhǎng)度為十,數(shù)組成員都是相應(yīng)下標(biāo)的數(shù)組,應(yīng)該怎么辦?
const arr = (new Array(10)).map...
打住,正確的姿勢(shì)是這樣的:
Array.from({length: 10}, (v, i) => i);//第一種 Array.apply(null, { length: 10 }).map(//...);//第二種 //歡迎補(bǔ)充更多
當(dāng)然你還可以使用遞歸的方式,我本人來(lái)說(shuō),一直使用第一種,感覺(jué)比較好用,我們重新實(shí)現(xiàn)下:
const faceList = Array.from({ length: 126 }, () => { const face = document.createElement("span"); const img = document.createElement("img"); const i = document.createElement("i"); i.style.left = "-100%"; face.append(img); face.append(i); return face; });
將dom渲染到頁(yè)面,緊接著是找出我們要渲染字符的位置了:
let EOITextArr = [ " ", " xxxx xx xxx ", " x x x x ", " xxxx x x x ", " x x x x ", " xxxx xx xxx ", " ", ]; let EOIArr = []; EOITextArr.forEach((v, i) => { for(let j = 1; j < v.length; j++) { if (v[j] === "x") { EOIArr.push(i * 18 + j); } } })
不要忘了,我們有圖片和span兩種需要做處理的元素,所以我們需要兩組數(shù)組,淺復(fù)制就好了:
const textArr = [].concat(EOIArr); const imgArr = [].concat(EOIArr);處理邏輯
這樣我們初期的準(zhǔn)備工作已經(jīng)完成,我們拿到了dom,還有需要處理的元素的位置,下面就是處理背景色和圖片如何顯示。我們分別拿到了要改變的span的數(shù)組和img的數(shù)組,我們只需要先改變背景色后控制圖片的顯示就好了。過(guò)程肯定是需要通過(guò)定時(shí)器來(lái)控制的,而且顯示的地方位置是隨機(jī)的,也就是我們也需要Math.random方法,我們通過(guò)不斷的splice來(lái)獲取數(shù)組的個(gè)體,也避免了會(huì)拿到重復(fù)的個(gè)體,代碼如下:
const colorTimer = setInterval(() => { const length = textArr.length; const showNumber = textArr.splice(Math.random() * length, 1); spanEles[showNumber].style.backgroundColor = "#F40"; iEles[showNumber].style.left = "100%"; if (!textArr.length) { clearInterval(colorTimer); showImg(); } }, 25);
當(dāng)背景色全部改變完成以后,我們就需要啟動(dòng)圖片的定時(shí)器,同理圖片的src也是隨機(jī)的:
const showImg = () => { const imgTimer = setInterval(() => { const length = imgArr.length; const [showNumber] = imgArr.splice(Math.random() * length, 1); const [imgIndex] = imgSrc.splice(Math.random() * imgSrc.length, 1); imgEles[showNumber].src = imgList[imgIndex]; imgEles[showNumber].style.display = "inline"; spanEles[showNumber].style.backgroundColor = "#fff"; iEles[showNumber].style.left = "-100%"; if (!imgArr.length) { spanEles[showNumber].classList.add("you"); clearInterval(imgTimer); } }, 25); }
當(dāng)圖片到最后一張的時(shí)候顯示‘You’。
收工完成效果
因?yàn)槲覍?shí)在是不想找那么多圖片,大概只拷貝了十份,然后乘以3,所以會(huì)出現(xiàn)一個(gè)頭像重復(fù)三次的情況,源碼。一次小小的嘗試,覺(jué)得挺有意思,感謝能看完的你~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/51368.html
摘要:每一個(gè)方格就是數(shù)組的一個(gè)個(gè)體。收工完成效果因?yàn)槲覍?shí)在是不想找那么多圖片,大概只拷貝了十份,然后乘以,所以會(huì)出現(xiàn)一個(gè)頭像重復(fù)三次的情況源碼。 我看到了什么 在看淘寶前端團(tuán)隊(duì)的博客的時(shí)候,無(wú)意中點(diǎn)進(jìn)了關(guān)于我們這個(gè)頁(yè)面,其中有個(gè)動(dòng)畫(huà)我覺(jué)得很有趣,也很通用,感覺(jué)在哪里都可以使用一樣,效果如下圖所示:showImg(https://segmentfault.com/img/bVWwzI?w=32...
摘要:代碼復(fù)用總是程序員喜聞樂(lè)見(jiàn)的,前端組件化的最終目的就是復(fù)用,今天我們就將深入探討如何實(shí)現(xiàn)組件的復(fù)用。 懶是第一生產(chǎn)力。 代碼復(fù)用總是程序員喜聞樂(lè)見(jiàn)的,前端組件化的最終目的就是復(fù)用,今天我們就將深入探討如何實(shí)現(xiàn)UI組件的復(fù)用。 通常我們所說(shuō)的組件往往是包含業(yè)務(wù)邏輯的前端組件,而這類組件實(shí)際上很難實(shí)現(xiàn)廣義上的復(fù)用,頂多能在同一條業(yè)務(wù)線上復(fù)用一下,但UI組件就不一樣了,沒(méi)有了業(yè)務(wù)的約束,只在...
摘要:轉(zhuǎn)載來(lái)源包管理器管理著庫(kù),并提供讀取和打包它們的工具。能構(gòu)建更好應(yīng)用的客戶端包管理器。一個(gè)整合和的最佳思想,使開(kāi)發(fā)者能快速方便地組織和編寫(xiě)前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數(shù)據(jù)。 轉(zhuǎn)載來(lái)源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫(kù),并提供讀取和打包它們的工具。?npm – npm 是 javasc...
閱讀 783·2023-04-25 20:47
閱讀 2551·2019-08-30 15:53
閱讀 959·2019-08-26 14:05
閱讀 905·2019-08-26 11:59
閱讀 1692·2019-08-26 11:43
閱讀 1693·2019-08-26 10:57
閱讀 1366·2019-08-23 18:23
閱讀 2685·2019-08-23 12:57