
Wes Bos 的原始專案:JS30 Day05
專案目標:
運用 flex 以及綁定 click 和 transitionend 監聽事件來呈現畫廊效果。
點擊後相應的圖片與字體會放大,再次點擊則回復原狀。
步驟一:CSS 添加 flex 等等屬性
在正式寫 js 之前,首先先對 CSS 做一些修改。
由於一開始的專案畫面,五張圖片是平行呈現,為了呈現最終畫面的效果,首先在 .panels
增加 flex
屬性。
|
|
接下來針對 .panels
類別底下的 .panel
類別。因為要平均分配每張圖片的呈現空間,所以添加 flex: 1;
。
.panel
類別底下的三個 <p>
段落需要由上而下平行呈現,所以添加了 flex-direction: column;
。
.panel > *
類別也做出相應調整。
|
|
以上這些基本修改完成後,接下來是針對畫面點擊效果。
設計在 .panel
上添加 .open
,並於完成 transition
動畫特效後,再添加 .open-end
的第二次特效。
|
|
圖片被點擊後,圖片所占空間會變大,字體也會變大,所以 .panel.open
中更改了 font-size
字體大小,且將 flex
設為 5
。
由於初始專案在 .panel
中有設定 transition
,所以會針對字體大小和圖片空間產生動畫特效。
|
|
步驟二:為 panel 綁定事件監聽
CSS 的部分都修改好後,就正式進入 js 的部分。
主要就是用 querySelectorAll
撈出所有 .panel
的 DOM 元素,並在上面綁定兩個事件監聽。
第一個是 addEventListener('click', openPanel)
。在點擊的時候為 .panel
添加上 .open
類別,做出圖片空間變大以及字體變大的特效。
第二個是 addEventListener('transitionend', openEnd)
。這個事件監聽是在完成 .open
特效後才發生,因此使用 transitionend
事件。
|
|
比較特別的是,因為 .open
觸發了兩次的 transition
第一次是 font-size: 40px;
,第二次是 flex: 5;
,所以我們所添加的 transitionend
事件監聽也會觸發兩次,故 toggle('open-end')
發生兩次後,變成 .open-end
類別沒有被成功添加上去。
所以這裡必須再加入一個判斷式,判斷所點擊的對象是否有內含屬性 font-size: 40px;
或 flex: 5;
。
Wes Bos 的判斷式是寫 e.propertyName.includes('flex')
,這裡寫 e.propertyName.includes('font-size')
也是一樣的。
延伸閱讀: