切版紀錄 | 來手刻輪播效果吧~

閱讀時間約 7 分鐘
raw-image

前幾天和一起轉職的同學分享工作近況的時候,得知他們公司切版時,大部分會手刻,比較少用現成的 UI 套件工具,像輪播效果也是手刻,讓我覺得有點挑戰,決定也來自己手刻一個輪播工具!

先附上最終結果的 codepen


再來記錄一下實作過程

切出畫面

因為之前很常使用 swiper 做輪播,所以知道最基本的架構會是:

  • 輪播框架 (swiper,包含幻燈片+切換按鈕/scrollbar...等等)
  • 輪播圖片區 (swiper-wrapper,包含多張幻燈片)
  • 單張幻燈片 (swiper-slide)
  • 左右按鈕 (swiper-btn)
raw-image

這次會先做簡單的單張圖片輪播,所以輪播框架和輪播圖片區基本上看起來會一樣大,依照這樣的架構思路來切版, HTML 的部分比較沒問題,就是 swiper 包輪播圖片區和左右按鈕,輪播圖片內再去排列單張幻燈片。


CSS 定位

輪播效果比較重要的是slide「定位」「移動效果」,所以 CSS 的 position 定位設置好,整個效果就會出來!

輪播框架 swiper

width / height 是整個輪播區的大小

position: relative; 讓按鈕可以定位在幻燈片的左右兩側

.swiper {
position: relative;
max-width: 900px;
height: 450px;
margin: 30px auto;
}


輪播圖片區 swiper-wrapper

position: relative; 讓每張 slide 定位在圖片區內,之後會根據切換按鈕去移動 slide 的位置百分比例,達成切換效果

overflow: hidden; 把定位在左右的兩張圖片隱藏起來

.swiper-wrapper{
position: relative;
overflow: hidden;
width: 100%;
height: 100%;
}


單張幻燈片 swiper-slide

transition: all 1s; 切換下一張時可以平滑移動

left: 100%; 讓所有幻燈片定位在 swiper-wrapper 的外面,只有加上 active 這個 class 的幻燈片會出現在 swiper-wrapper 畫面內

z-index:1; 讓所有幻燈片的圖層低於 active 的幻燈片

.swiper-slide {
width: 100%;
height: 100%;
transition: all 1s;
position: absolute;
top: 0;
left: 100%;
z-index:1;
}

.active{
left: 0%;
z-index:10;
}


剩下的 swiper-imgswiper-btn 就依照自己想設置的位置和樣式去寫就可以了,我的詳細設置可以看 codepen,基本切版雛形完成,目前就會是一個還不能切換的畫面,現在可以開始寫 javascript 讓它動起來了~


按鈕切換邏輯

定義變數

  1. 先取得 DOM 元素、所有幻燈片的陣列和綁定按鈕監聽事件
  2. slideIndex要紀錄目前 active slide 所在的陣列位置
  3. sliderPrevIndexslideIndex 的前一張
  4. ​sliderNextIndexslideIndex 的後一張
const nextBtn = document.querySelector(".swiper-btn-next");
const preBtn = document.querySelector(".swiper-btn-pre");
const slide = document.querySelectorAll(".swiper-slide");
let slideIndex = 0;
let sliderPrevIndex = 0;
let sliderNextIndex = 0;
const slideNumber = slide.length;

綁訂監聽事件

  1. 按下 next 按鈕時,slideIndex += 1,如果 slideIndex 跑到最後一筆,則 slideIndex = 0
  2. 按下 prev 按鈕,slideIndex 剛好為 0 的情況 slideIndex = 陣列長度 - 1 ,其他情況則 slideIndex - 1
nextBtn.addEventListener("click", () => {
if (slideIndex == slideNumber - 1) {
slideIndex = 0;
} else {
slideIndex += 1;
}
updateClasses();
});

preBtn.addEventListener("click", () => {
if (slideIndex == 0) {
slideIndex = slideNumber - 1;
} else {
slideIndex -= 1;
}
updateClasses();
});


跑迴圈加上相應class

迴圈清除所有幻燈片原本綁定的 active/prev/next class,並根據 slideIndex 為當前的 slide 加上 active,以及前後兩張 slide 分別加上 prev/next 的 class

function updateClasses() {
if (slideIndex === 0) {
sliderPrevIndex = slideNumber - 1;
} else {
sliderPrevIndex = slideIndex - 1;
}

if (slideIndex === slideNumber - 1) {
sliderNextIndex = 0;
} else {
sliderNextIndex = slideIndex + 1;
}

slide.forEach((i) => {
i.classList.remove("active", "prev", "next");
});
slide[slideIndex].classList.add("active");
slide[sliderPrevIndex].classList.add("prev");
slide[sliderNextIndex].classList.add("next");
}


最後別忘了回到 HTML 去把預設要顯示的第一張 slide 加上 active class,下一張 slide 加上 next class,前一張 slide 加上 prev class,一個簡單的輪播效果就完成了~


我是Amber,前端學習中,歡迎交流討論🧸

    22會員
    22內容數
    留言0
    查看全部
    發表第一個留言支持創作者!
    Amber hh的沙龍 的其他內容
    之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
    之前分享過【網路請求帶參數的方式】,開發者可以透過 URL 代入參數,來向伺服器請求特定的資源,我們當然也可以擷取 URL 的內容,來做為後續開發的判斷條件,這篇就來記錄一下,網址(URL) 和域名(Domain) 是什麼,以及如何取得網址的參數吧! 我們常說的網址連結 URL 完整名稱是 U
    先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
    之前在 學習筆記 | 關於 Cookie、Session、Token 這篇筆記有提到,瀏覽器需要帶著使用者的身分訊息或經過身分驗證後取得的Token(令牌),才能向伺服器請求資源,那麼瀏覽器就必須有個空間來儲存這些 Token 資訊,這篇就是要來記錄瀏覽器常見的儲存空間啦~
    上一篇筆記講到了瀏覽器與伺服器之間,經過身分驗證後,就會改以 Token 這個令牌作為通行證,不需要再反覆驗證,那麼這篇紀錄的就是目前最常使用的 JWT (JSON Web Token) 啦! 可以搭配 JWT 的網站來玩看看 JWT(JSON Web Token) 顧名思義就是以 JSON
    延續先前的筆記,「網路請求」是瀏覽器和伺服器的溝通橋梁,目的是為了取得資料庫內的資源,除了 CORS 這種瀏覽器本身的阻擋機制,伺服器也會需要進行「身分驗證或授權」這道阻擋,並不是使用者有帶上 header 告知身分,就一定可以把資料 response 回來的。
    之前在【什麼是網路請求(HTTP response)】筆記裡有提到,網路請求遇到 CORS 跨域問題,在開發時可以透過 vite 的反向代理來解決,那麼什麼是反向代理,有反向代理的話是不是也有正向代理呢?
    之前分享過【網路請求帶參數的方式】,開發者可以透過 URL 代入參數,來向伺服器請求特定的資源,我們當然也可以擷取 URL 的內容,來做為後續開發的判斷條件,這篇就來記錄一下,網址(URL) 和域名(Domain) 是什麼,以及如何取得網址的參數吧! 我們常說的網址連結 URL 完整名稱是 U
    先前幾篇筆記介紹了網路請求,瀏覽器儲存資料的方式,那麼實務上,前端最常需要發送網路請求的時候,就是透過呼叫 API,去向後端工程師發送/請求資料,所以今天來記錄什麼是 API吧!
    之前在 學習筆記 | 關於 Cookie、Session、Token 這篇筆記有提到,瀏覽器需要帶著使用者的身分訊息或經過身分驗證後取得的Token(令牌),才能向伺服器請求資源,那麼瀏覽器就必須有個空間來儲存這些 Token 資訊,這篇就是要來記錄瀏覽器常見的儲存空間啦~
    上一篇筆記講到了瀏覽器與伺服器之間,經過身分驗證後,就會改以 Token 這個令牌作為通行證,不需要再反覆驗證,那麼這篇紀錄的就是目前最常使用的 JWT (JSON Web Token) 啦! 可以搭配 JWT 的網站來玩看看 JWT(JSON Web Token) 顧名思義就是以 JSON
    延續先前的筆記,「網路請求」是瀏覽器和伺服器的溝通橋梁,目的是為了取得資料庫內的資源,除了 CORS 這種瀏覽器本身的阻擋機制,伺服器也會需要進行「身分驗證或授權」這道阻擋,並不是使用者有帶上 header 告知身分,就一定可以把資料 response 回來的。
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    切版有許多眉角需要注意,來探討那些經常導致切版結果與設計稿產生落差的原因。 一、文字的高度本體是 line-height:🔍 文字所佔據的高度不是由font-size決定,而是line-hight。一開始練習切版時,都想著設定好字的尺寸和字重就 ok 了吧?殊不知這是造成切出來的網頁與設計
    Thumbnail
    我想分享給那些曾有過相同感受的同學,覺得自己能力不適合、在學習中感到自卑想要放棄的那些時候。而後半篇則想分享自己對於老師、助教的感謝。
    來解個任務,順便回顧一下這一年來開始接觸前端的心得。 認識六角學院是從今年年初的工程師體驗營開始的,朋友在去年參加了一系列六角課程之後成功轉職,於是今年體驗營消息一公布,就馬上建議我可以參加看看。 體驗營開始前我的前端學習狀況大概是︰漫無目的地從HTML、CSS、JavaScript一路看到了V
    Thumbnail
    這是我參加為期三個月的六角學院 2023 網頁前端切版直播班中的學習和成長經驗。最初參加直播班時誤以為自己已經具備足夠的前端知識,但後來發現自己的程式碼還有改進的空間。我在參與直播班的過程中,不僅學到了更多切版技術,也在小組協作中體驗到了組織能力和團隊合作的重要性,並從做設計稿與切版中發現個人優勢。
    Thumbnail
    網頁中經常會出現正方形的設計,在切版時如果直接設定固定寬高就是破版的節奏,但單用百分比設定長寬,RWD 時還是會變得不夠正,這邊提供兩個方法:
    Thumbnail
    波戈拉,本名王勝南,1985年生,高雄人。他的筆名是由三個喜歡的詩人組成的,「波」來自法國天才詩人韓波(Jean Nicolas Arthur Rimbaud);「戈」是印度詩人、哲學家泰戈爾(Rabindranath Tagore);「拉」是美國詩人雪維亞.普拉絲(Sylvia Plath)。
    Thumbnail
    你或許會好奇,為什麼早已在設計軟體完成的設計稿,還要進行修正?—— 沒錯,因為這中間的切換,經常會有元件不適應(也可能是設計稿本身)的問題。
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    切版有許多眉角需要注意,來探討那些經常導致切版結果與設計稿產生落差的原因。 一、文字的高度本體是 line-height:🔍 文字所佔據的高度不是由font-size決定,而是line-hight。一開始練習切版時,都想著設定好字的尺寸和字重就 ok 了吧?殊不知這是造成切出來的網頁與設計
    Thumbnail
    我想分享給那些曾有過相同感受的同學,覺得自己能力不適合、在學習中感到自卑想要放棄的那些時候。而後半篇則想分享自己對於老師、助教的感謝。
    來解個任務,順便回顧一下這一年來開始接觸前端的心得。 認識六角學院是從今年年初的工程師體驗營開始的,朋友在去年參加了一系列六角課程之後成功轉職,於是今年體驗營消息一公布,就馬上建議我可以參加看看。 體驗營開始前我的前端學習狀況大概是︰漫無目的地從HTML、CSS、JavaScript一路看到了V
    Thumbnail
    這是我參加為期三個月的六角學院 2023 網頁前端切版直播班中的學習和成長經驗。最初參加直播班時誤以為自己已經具備足夠的前端知識,但後來發現自己的程式碼還有改進的空間。我在參與直播班的過程中,不僅學到了更多切版技術,也在小組協作中體驗到了組織能力和團隊合作的重要性,並從做設計稿與切版中發現個人優勢。
    Thumbnail
    網頁中經常會出現正方形的設計,在切版時如果直接設定固定寬高就是破版的節奏,但單用百分比設定長寬,RWD 時還是會變得不夠正,這邊提供兩個方法:
    Thumbnail
    波戈拉,本名王勝南,1985年生,高雄人。他的筆名是由三個喜歡的詩人組成的,「波」來自法國天才詩人韓波(Jean Nicolas Arthur Rimbaud);「戈」是印度詩人、哲學家泰戈爾(Rabindranath Tagore);「拉」是美國詩人雪維亞.普拉絲(Sylvia Plath)。
    Thumbnail
    你或許會好奇,為什麼早已在設計軟體完成的設計稿,還要進行修正?—— 沒錯,因為這中間的切換,經常會有元件不適應(也可能是設計稿本身)的問題。