運用 JS 或純 CSS 製作簡易 Carousel

Eason Lin
6 min readSep 18, 2021

--

https://unsplash.com/photos/hx36aRqV3YA

這陣子想到了一個問題:「如果要在沒有任何函式庫下實現__功能,你會怎麼做?」因此希望能透過觀察其他人如何簡單地實現某些常用的互動效果,讓自己至少對「可以如何開始」有個簡單的頭緒。

這篇文記錄了我參考他人實現簡易輪播的做法,並分別記錄了有 JS 以及無 JS 的實現方式。

運用 JS 實現--使用 scrollLeft

scrollLeft 是 HTML 元素中的屬性,可以透過其得知目前的向左捲動的距離。假設我們有一個 div 包了一個 div,外層使用 overflow-x: scroll 並使用 scroll-behavior: smooth 設定捲動行為,例如:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
padding: 2rem;
width: 200px;
background-color: brown;
border: 2px solid black;
overflow-x: scroll;
scroll-behavior: smooth;
}
.inner {
padding: 10rem;
background-color: white;
width: 100vw;
}
</style>
</head>
<body>
<div class="box">
<div class="inner">Lorem ipsum dolor sit amet consectetur adipisicing elit. Id, beatae!</div>
</div>
<script>
const box = document.querySelector('.box')
</script>
</body>
</html>

console 中改變 box.scrollLeft 的值,就能將其向右捲動一些。

接著就可以直接看實作的部分

這個輪播作法參考了這個 Codepen,不過邏輯有做一些對應的修改。核心的做法就是在父層給予一個最大寬度,並讓子層用 flex 排版。子層中的 img 鎖定寬度是 100%,圖片就會向右展開,然後透過 overflow-x: hidden 讓超出寬度的圖片可以被隱藏。

在 JS 部分,我改寫了大多數的邏輯,嘗試使用了 ES6 Proxy,並藉由一個 indexscrollLeft 去控制輪播的切換,這樣在實作上就可以專注在處理 index 的改變。藉由 index 的改變,setter 會先看傳入的新值是否為合法的值(大於 0 並且不大於圖片節點數量),如果合法就會給予 index 傳入的值,並計算當下的 scrollLeft 值並給予對應的 dot active 的 class

不運用 JS 實現--使用 HTML 錨點

HTML<a> 標籤的 href 屬性,除了可以讓使用者點擊時被帶往對應的頁面,當 href 中以 # 作為開頭,後方加上某個 HTML 元素的 id 名稱,點擊時就會捲動至該 HTML 元素所在的區塊。例如:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.inner {
height: 50vh;
}
.box {
scroll-behavior: smooth;
overflow-y: scroll;
height: 100vh;
}
</style>
</head>
<body>
<a href="#target3">target3</a>
<div class="box">
<div id="target1" class="inner">target1</div>
<div id="target2" class="inner">target2</div>
<div id="target3" class="inner">target3</div>
<div id="target4" class="inner">target4</div>
</div>
</body>
</html>

點擊 target3 連結時,畫面就會捲動至 #target3 div 所在區塊。

接著就是實作的部分:

這個輪播做法則是參考了這個 Codepen,保留了較為核心的 CSS 部分。在排版上也採用了類似的策略,透過 flexoverflow: hidden 讓子層的 img 在視覺上一次只顯示一張的樣子。在灰點中每個灰點都是一個帶有對應圖片 idhref 的錨點,點擊灰點時就會捲動至對應的區塊,也可以看到網頁上會出現錨點的位置。

關於製作簡易 Carousel 就記錄到這邊,這兩個做法主要都是運用捲動來實作,其實就是幾張圖片在一個盒子中左右捲動。如果內文有任何錯誤,也請不吝提出,謝謝。

References:

--

--

Eason Lin
Eason Lin

Written by Eason Lin

Frontend Web Developer | Books

No responses yet