[Hexschool Web Layout Training] — Week_7 視差滾動
Introduction & 前言
你在看網頁時肯定看過東西突然浮出來會是跳出來,在沒有肯定也看過蘋果官網。
這週就是要來學學怎麼實作視差滾動,而且!而且!而且!可以不寫任何一行 JS!
再次提醒一下,本週也是使用 Gulp,如果你還沒用過或是想知道怎麼從 0 開始建立一個 Gulp 歡迎參考我的上一篇文章,[Tool Notes] — 關於Gulp。
Summary & 摘要
*本篇文章將會以三個角度來紀錄, 課程心得(上課後的心得整理)、練習心得(做完作業後的心得整理)) 及 **小組任務(每週會有一項小組任務,寫完後的心得)*。
每週的練習挑戰和地下城有點像,都有自己必須練習到的地方;本週需要練習的目標有至少兩點以上的練習菜單,及額外的一項打字練習。
關卡目標
- 學會不使用一行 JS 就做出視差滾動
課程心得
本週課程提到了讓網頁互動感提升的方法,沒錯就是動畫。
其實網頁動畫入門並不困難,但是要靈活運用還是要需要一點技巧,把主要要掌握的幾個要點先記起來,後面再慢慢修正就好,但如果你覺得自己手幹太麻煩,其實現在跟大多數好用的套件一樣,也有人幫你包好囉!
手動派
要學會動畫首先要先記得 animation
這個屬性,它就像 Flash 的動畫影格差不多,只是筆者沒學過 Flash 所以這邊不對後者做討論,但其實前者屬性和後者都有個共通點都是使用動畫影格,先讓我們看看下面的範例:
1 | <div></div> |
1 | div { |
仔細看 div
會由左往右跑 3秒 的時間完成,這邊你已經會動畫起手式了!
animation-name
取好動畫名稱animation-duration
設定動畫完成時間,更多設定下方會提到@keyframes
帶入你的動畫名稱並設定中途要做什麼改變
這邊也有幾個重要點:
@keyframes 裡的 from 到 to 可以改為數字,可以多個區間,比如 0% 15% 35% 50% 100%,但切記數字一定要加上 %
如果沒有 100% 或是 to,網頁會自動幫我們算出結果
後者蓋前者設定,比如兩個相同的 50% 會吃後面的設定,這和 CSS 一模依樣
更多設定
上面有提到除了 animation-name
及 animation-duration
還有更多的設定,在 W3C 的介紹含上面兩個有這幾個:
- animation-name
- animation-duration
- animation-delay
- animation-iteration-count
- animation-timing-function
- animation-direction
- animation-fill-mode
- animation-play-state
自動派
上面有提到雖然我們可以手動設定,但是有許多人會覺得這一堆 @keyframes
超亂的啊!而且我想要一制性、效率性,沒問題這邊就先介紹一個筆者很常使用的套件,而且也是目前全世界最多人使用的動畫套件!
其實筆者中間有一段時間沒有用,沒發現官網改版了。
如果你只想要你的東西就是單純跑動畫就好,甚至你能不用懂動畫的基礎貨概念,因為開頭就是擺明要教你不寫一行 JS 達到動畫效果了,所以這邊直接上範例:
首先你必須引入 **animate.css**,看你要用 CDN
或是 npm install
都可以,然後前置步驟做完之後,接著在你要使用動畫的地方,加上 Class Name
,切記一定要有 animate__animated
,接下來再加上 animate__你想家的動畫名稱
,後者可以加上你想家的動畫名稱,例如 animate__fadeIn
、animate__bounceInDown
…等等,是不是很簡單啊。
這個套件其實還能再加上動畫持續幾秒,延遲多久播放,這些其實都可以調整,手幹有的設定套件其實都能在設定,有興趣也可以在詳細參考官方文件。
我全都要?
雖然上方提到有手動設定也有自動設定,但你可能這時候會想:
Q:我加上去動畫就自己開始跑了呀,有時候我想要畫面滑動到特定的地方在播放,我總不可能去算使用者多久滑到那個地方,然後延遲吧?
A:當然是的,所以這時候你就必須全都要了!
雖然上方提到一行 JS 都不用寫,但其實還是至少要寫幾行套件設定啦!(這不算吧
這邊先介紹另一個套件 **AOS.js**,其實這個套件和
animate.css 差不多,引入套件後,在想要加上動畫得元素加上 data-aos="動畫名稱"
就可以了。
但是差別是什麼呢?**AOS.js** 並不會在網頁一載入就跑動畫,而是會偵測你的網頁滑動到該播放動畫的元素那的時候才會播放,這也是為什麼這個套件要多引入一個 .js 檔(雖然提到不用寫任何一行 JS 但是這個套件必須初始化,所以必須在 JS 加上 AOS.init();
,僅此一行)。
知道了怎麼用之後,這個套件也可以加上手幹的那些設定,加上的方法也是在想跑動畫的元素上加上 data-aos-offset
、data-aos-duration
…等等,詳細可參考**官方文件**。
這個套件大概的原理就是他會偵測你網頁的視窗底部,在接近你想加上動畫的元素時,會去抓 data 的 attribute,然後把裡面的動畫名稱加上 Class Name
裡。
講到這邊你大概就懂了,我全都要是要什麼東西,簡單說就是移到要播放動畫的地方,加上 animate.css 的動畫,這個要怎麼辦到呢?前面有提到 AOS.js 會在畫面移到特定的地方加上 data-attribute 的名稱,那我們把裡面替換成 animate.css 的名稱就可以了,但是設定就必須還是要自己上去改。
關於怎麼合併這邊就直接示範一個範例:
其實 JS 也可以在設定一些諸如視窗距離多少觸發動畫,是否只觸發一次動畫…等等,詳細也可以在參考官方文件設定。
練習心得
其實本週其實可以套用前幾週的版面直接做練習,但因為自己初衷是想練習切版,所以還是切新的版面並且套上套件。
過程其實切版還算順利,只是最後套上套件碰到了個雷,因為套件跑動畫會先卡在邊邊(看得到的狀況,然後再跑動畫進來,所以當下有在 body
,下了一個 overflow-x: hidden;
,導致全部的動畫都隱藏了,連跑都沒有跑,還好同組的同學 Alex 幫忙發現解決了。
除此之外沒有太大的問題,就繼續往下週邁進了!
小組任務
任務一:請每個小組討論成員,試著用本週教的視差效果,並套用在自己的版型上,彼此協助除錯,並提交到任務系統上。
Conclusion & 結論
記得在切第一週的版型就有看見同學使用 **AOS.js**,當下覺得挺酷的想等課程結束研究看看,沒想到一直到這週就提到了。一直以來切版常常使用動畫,因為自己覺得動畫對使用者體驗提升許多,但是過多的動畫又會困擾使用者,所以真的要斟酌呢!
在做這週時想到之前 The F2E 也有做過動畫遊戲,雖然當時沒有做完,但是至少還能跑,當時是使用 phaser.js 遊戲引擎(phaser3),當時關卡主是 Mike,有興趣可以參考他的部落格文章 Phaser.js 的2D遊戲開發入門 part-1 真的挺有趣的,這邊提供一下半完成品。
The F2E 第五週 - NinetyChallengeGame 90秒遊戲 Demo
Demo & 成果程式碼
Source Code:點我
Demo:點我