<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>Project #25 - Horizontal Gallery Scroller</title>
</head>
<body>
<div class="container">
<!-- img*15[src="img/$.jpg"][class="item-$ item"][alt="img"] -->
<img src="https://cdn.pixabay.com/photo/2020/02/25/09/57/road-4878453_960_720.jpg" alt="img" class="item-1 item" />
<img src="https://cdn.pixabay.com/photo/2021/08/25/05/01/boat-6572384_960_720.jpg" alt="img" class="item-2 item" />
<img src="https://cdn.pixabay.com/photo/2021/11/16/17/29/fashion-6801626_960_720.jpg" alt="img" class="item-3 item" />
<img src="https://cdn.pixabay.com/photo/2021/12/28/11/37/castle-6899042_960_720.jpg" alt="img" class="item-4 item" />
<img src="https://cdn.pixabay.com/photo/2022/05/04/09/13/bordeaux-7173548_960_720.jpg" alt="img" class="item-5 item" />
<img src="https://cdn.pixabay.com/photo/2015/12/01/20/28/road-1072823_960_720.jpg" alt="img" class="item-6 item" />
<img src="https://cdn.pixabay.com/photo/2015/04/23/22/00/tree-736885_960_720.jpg" alt="img" class="item-7 item" />
<img src="https://cdn.pixabay.com/photo/2022/05/01/05/00/pelican-7166748_960_720.jpg" alt="img" class="item-8 item" />
<img src="https://cdn.pixabay.com/photo/2022/05/04/02/29/calligraphy-7173006_960_720.jpg" alt="img" class="item-9 item" />
<img src="https://cdn.pixabay.com/photo/2022/04/21/19/42/birds-7148194_960_720.jpg" alt="img" class="item-10 item" />
<img src="https://cdn.pixabay.com/photo/2022/01/27/22/57/skateboarding-6973365_960_720.jpg" alt="img" class="item-11 item" />
<img src="https://cdn.pixabay.com/photo/2022/02/23/05/10/tiramisu-7030032_960_720.jpg" alt="img" class="item-12 item" />
<img src="https://cdn.pixabay.com/photo/2016/03/27/21/59/bread-1284438_960_720.jpg" alt="img" class="item-13 item" />
<img src="https://cdn.pixabay.com/photo/2016/07/28/08/50/sunbeams-1547273_960_720.jpg" alt="img" class="item-14 item" />
<img src="https://cdn.pixabay.com/photo/2022/03/02/18/07/russian-borzoi-7043714_960_720.jpg" alt="img" class="item-15 item" />
</div>
<!-- ------------------------- -->
<!-- JS File -->
<script src="app.js"></script>
</body>
</html>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: rgb(226, 214, 43);
}
.container {
height: 700px;
width: 1400px;
cursor: pointer;
transition: all 0.2s;
position: relative;
overflow-x: hidden;
overflow-y: hidden;
white-space: nowrap;
user-select: none;
font-size: 0;
border: 2px white solid;
}
.container.active {
/* https://developer.mozilla.org/en-US/docs/Web/CSS/cursor */
cursor: grabbing;
}
.item {
width: 700px;
height: 100%;
object-fit: cover;
}
const slider = document.querySelector(".container");
let isDown = false;
let startx;
let scrollToLeft;
slider.addEventListener("mousedown", function (e) {
isDown = true;
slider.classList.add("active");
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetLeft
//시작점을 알기 위해 전체 x 에서 갤러리의 왼쪽 시작 점을 뺀다. 그러면 슬라이드의 시작점이 첫번째 이미지가 된다.
startx = e.pageX - slider.offsetLeft;
// https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeft
scrollToLeft = slider.scrollLeft;
});
//마우스가 단순 올려져 있거나 밖에 있으면 active 클래스를 제거함으로서 커서 모양을 바꾼다.
slider.addEventListener("mouseup", function () {
isDown = false;
slider.classList.remove("active");
});
slider.addEventListener("mouseleave", function () {
isDown = false;
slider.classList.remove("active");
});
slider.addEventListener("mousemove", function (e) {
if (!isDown) return;
e.preventDefault();
//사용자가 얼마나 움직였는지
const distanceX = e.pageX - slider.offsetLeft;
const walk = distanceX - startx;
slider.scrollLeft = scrollToLeft - walk;
});
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.