專案介紹: 練習 css flex 及 js 點擊圖片做展開效果
作品頁面: https://iris1114.github.io/javascript30/05_Flex-Panel-Gallery/index.html
1. 做法:
- 用 flex 進行排版
- 點擊圖片,新增 2 種效果
- 2 種效果: 圖片放大 、 上下文字出現
2. 用 flex 進行排版
使用 flex 將版面排好,並用 transform 把第一和最後一個文字移至畫面外。
1/* 在 panels 新增 flex 屬性 */23.panels {4 display: flex;5}67/* 每個 panel 比例為18要使文字垂直置中,direction 為 column */910.panel {11 flex-grow: 1;12 display: flex;13 flex-direction: column;14 justify-content: space-around;15 cursor: pointer;16}1718/* panel 的第一個p和最後一個p移至畫面外 */19.panel p:first-child {20 transform: translateY(-100vh);21}2223.panel p:last-child {24 transform: translateY(100vh);25}
3. 點擊圖片,新增 2 種效果
其兩種效果的 className 為 .open 及 .show-text。
1/* 畫面佔比放大 */2.panel.open {3 font-size: 40px;4 flex-grow: 3;5}67/* 將文字移動至原來位置 */8.panel.show-text :first-child,9.panel.show-text :last-child {10 transform: translateY(0px);11}
4. JavaScript 處理
先取得所有 panel,當點擊時 toggle 要呈現的 css 效果, 就把兩個 className 加入即可。
1const panels = document.querySelectorAll(".panel");23panels.forEach((panel) => {4 panel.addEventListener("click", () => {5 panel.classList.toggle("open");6 panel.classList.toggle("show-text");7 });8});
wesbos 版本, 他有使用 transitionend , 當 CSS transition 結束後觸發 toggleActive function 。
1// wesbos's method2const panels = document.querySelectorAll(".panel");34function toggleOpen() {5 console.log("Hello");6 this.classList.toggle("open");7}89function toggleActive(e) {10 console.log(e.propertyName);11 if (e.propertyName.includes("flex")) {12 this.classList.toggle("open-active");13 }14}1516panels.forEach((panel) => panel.addEventListener("click", toggleOpen));17panels.forEach((panel) =>18 panel.addEventListener("transitionend", toggleActive)19);
5. 參考資料
https://developer.mozilla.org/zh-TW/docs/Web/CSS/transform https://developer.mozilla.org/zh-TW/docs/Web/API/Element/classList