国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

所見即所得,實現一個有趣的動畫效果

fyber / 2264人閱讀

摘要:每一個方格就是數組的一個個體。收工完成效果因為我實在是不想找那么多圖片,大概只拷貝了十份,然后乘以,所以會出現一個頭像重復三次的情況源碼。

我看到了什么

在看淘寶前端團隊的博客的時候,無意中點進了關于我們這個頁面,其中有個動畫我覺得很有趣,也很通用,感覺在哪里都可以使用一樣,效果如下圖所示:


每次刷新的頭像和‘You’的位置都是不同的,說實話,我覺得蠻有意思的,于是我自己嘗試去實現了一下。
下面我會從我的角度去分析實現這樣的效果,因為我不知道FED他們是怎么實現的

該怎么做

先分析下小方塊的結構,就是:


  
  

img是頭像,span控制背景色,i用來制作鏡面的效果。
我們知道了這樣一個效果,本人近視,十米開外男女不分的那種,然后看這個布局看著好熟悉,我看到的這個結構大概是這種感覺

[
  "                 ",
  "  xxxx  xx  xxx  ",
  "  x    x  x  x   ",
  "  xxxx x  x  x   ",
  "  x    x  x  x   ",
  "  xxxx  xx  xxx  ",
  "                 ",
]

哎嘿嘿,這個不就是是個字符串數組嗎嘛,那我當作二維數組處理,豈不是可以輕易的找出要顯示的字符的橫坐標和縱坐標,豈不美哉。先別急著擼起袖子就是干,根據我長年不思考擼起袖子就是干被坑的經驗,我想了一會,似乎用一圍數組更好一點,dom方面的處理也更加方便一些。每一個方格就是數組的一個個體。
想到這,我掐指一算我大概需要126個方格,方格呈7 * 18的布局方式,我又掐指一算我好像要寫126的span標簽,就像下面這樣:
萬能的編輯器,我后來發現原來可以span*126+tab,機智如我,美滋滋。


啊?你問我上面的span是怎么弄的,我靠,我當然是手慢慢敲的的啊


呃,感覺還是用js來生成更好些吧,方便,代碼量也少很多,好,我們擼起袖子就是干:

const faceList = (new Array(126)).map(() => {
  const face = document.createElement("span");
  //...
  return face;
});
document.body.append(faceList);

我們打開網頁:

這是個什么玩意?
好吧,不開玩喜了,我們舉個例子吧,現在我想創建一個長度為十,數組成員都是相應下標的數組,應該怎么辦?

const arr = (new Array(10)).map...

打住,正確的姿勢是這樣的:

Array.from({length: 10}, (v, i) => i);//第一種
Array.apply(null, { length: 10 }).map(//...);//第二種
//歡迎補充更多

當然你還可以使用遞歸的方式,我本人來說,一直使用第一種,感覺比較好用,我們重新實現下:

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渲染到頁面,緊接著是找出我們要渲染字符的位置了:

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兩種需要做處理的元素,所以我們需要兩組數組,淺復制就好了:

const textArr = [].concat(EOIArr);
const imgArr = [].concat(EOIArr);
處理邏輯

這樣我們初期的準備工作已經完成,我們拿到了dom,還有需要處理的元素的位置,下面就是處理背景色和圖片如何顯示。我們分別拿到了要改變的span的數組和img的數組,我們只需要先改變背景色后控制圖片的顯示就好了。過程肯定是需要通過定時器來控制的,而且顯示的地方位置是隨機的,也就是我們也需要Math.random方法,我們通過不斷的splice來獲取數組的個體,也避免了會拿到重復的個體,代碼如下:

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);

當背景色全部改變完成以后,我們就需要啟動圖片的定時器,同理圖片的src也是隨機的:

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);
}

當圖片到最后一張的時候顯示‘You’。

收工

完成效果

因為我實在是不想找那么多圖片,大概只拷貝了十份,然后乘以3,所以會出現一個頭像重復三次的情況,源碼。一次小小的嘗試,覺得挺有意思,感謝能看完的你~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/51368.html

相關文章

  • 見即所得實現一個有趣動畫效果

    摘要:每一個方格就是數組的一個個體。收工完成效果因為我實在是不想找那么多圖片,大概只拷貝了十份,然后乘以,所以會出現一個頭像重復三次的情況源碼。 我看到了什么 在看淘寶前端團隊的博客的時候,無意中點進了關于我們這個頁面,其中有個動畫我覺得很有趣,也很通用,感覺在哪里都可以使用一樣,效果如下圖所示:showImg(https://segmentfault.com/img/bVWwzI?w=32...

    xuxueli 評論0 收藏0
  • 前端UI組件復用工具

    摘要:代碼復用總是程序員喜聞樂見的,前端組件化的最終目的就是復用,今天我們就將深入探討如何實現組件的復用。 懶是第一生產力。 代碼復用總是程序員喜聞樂見的,前端組件化的最終目的就是復用,今天我們就將深入探討如何實現UI組件的復用。 通常我們所說的組件往往是包含業務邏輯的前端組件,而這類組件實際上很難實現廣義上的復用,頂多能在同一條業務線上復用一下,但UI組件就不一樣了,沒有了業務的約束,只在...

    xuxueli 評論0 收藏0
  • javascript功能插件大集合 前端常用插件 js常用插件

    摘要:轉載來源包管理器管理著庫,并提供讀取和打包它們的工具。能構建更好應用的客戶端包管理器。一個整合和的最佳思想,使開發者能快速方便地組織和編寫前端代碼的下一代包管理器。很棒的組件集合。隱秘地使用和用戶數據。 轉載來源:https://github.com/jobbole/aw... 包管理器管理著 javascript 庫,并提供讀取和打包它們的工具。?npm – npm 是 javasc...

    netmou 評論0 收藏0

發表評論

0條評論

fyber

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<