Computer >> 컴퓨터 >  >> 프로그래밍 >> CSS

CSS와 JavaScript로 반응형 슬라이드쇼 갤러리 만드는 방법

CSS와 JavaScript를 활용하면 좌우 이동 버튼과 썸네일 내비게이션을 갖춘 반응형 슬라이드쇼 갤러리를 손쉽게 만들 수 있습니다. 이번 글에서는 메인 이미지 영역, 이전·다음 버튼, 하단 썸네일 목록으로 구성된 갤러리를 하나의 완성된 예제로 구현해 보겠습니다.

예제

아래는 HTML, CSS, JavaScript를 모두 포함한 전체 코드입니다.

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
* {
    box-sizing: border-box;
}
.Slide {
    display: none;
}
img {
    vertical-align: middle;
    width: 100%;
    height: 400px;
}
.slideContainer {
    max-width: 600px;
    position: relative;
    margin: auto;
}
.prevBtn,
.nextBtn {
    cursor: pointer;
    position: absolute;
    top: 50%;
    width: auto;
    padding: 10px;
    background-color: rgb(255, 255, 75);
    color: rgb(50, 0, 116);
    font-weight: bolder;
    font-size: 18px;
}
.nextBtn {
    right: 0;
}
.Caption {
    color: #fbff09;
    font-weight: bold;
    font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    font-size: 25px;
    padding: 8px 12px;
    position: absolute;
    bottom: 8px;
    width: 100%;
    text-align: center;
}
.thumbnail:after {
    content: "";
    display: table;
    clear: both;
}
.thumbnail {
    margin-left: 32%;
}
.imageCol {
    float: left;
    width: 16.66%;
}
.thumbImage {
    height: 150px;
    width: 150px;
}
@media only screen and (max-width: 450px) {
    .prevBtn,
    .nextBtn,
    .Caption {
        font-size: 16px;
    }
}
</style>
</head>
<body>
<div class="slideContainer">
<div class="Slide">
<img src="https://images.pexels.com/photos/3540375/pexels-photo-3540375.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" />
<div class="Caption">사진 1</div>
</div>
<div class="Slide">
<img src="https://images.unsplash.com/photo-1558981001-5864b3250a69?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=750&q=80" />
<div class="Caption">사진 2</div>
</div>
<div class="Slide">
<img src="https://images.unsplash.com/photo-1584910758141-f7993f9e203d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=667&q=80" />
<div class="Caption">사진 3</div>
</div>
<a class="prevBtn">❮</a>
<a class="nextBtn">❯</a>
</div>
<br />
<div class="thumbnail">
<div class="imageCol">
<img class="thumbImage" src="https://images.pexels.com/photos/3540375/pexels-photo-3540375.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" style="width:100%" onclick="setSlide(1)" alt="숲 풍경">
</div>
<div class="imageCol">
<img class="thumbImage" src="https://images.unsplash.com/photo-1558981001-5864b3250a69?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=750&q=80" style="width:100%" onclick="setSlide(2)" alt="친퀘테레">
</div>
<div class="imageCol">
<img class="thumbImage" src="https://images.unsplash.com/photo-1584910758141-f7993f9e203d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=667&q=80" style="width:100%" onclick="setSlide(3)" alt="산과 피요르드">
</div>
</div>
<script>
function setSlide(number){
    clearSelected();
    currentSlide(number);
    document.querySelectorAll('.thumbImage')[number-1].style.borderBottom = "6px solid purple";
}
function clearSelected(){
    Array.from(document.querySelectorAll('.thumbImage')).forEach(item=>item.style.borderBottom="");
}
document.querySelector(".prevBtn").addEventListener("click", () => {
    changeSlides(-1);
});
document.querySelector(".nextBtn").addEventListener("click", () => {
    changeSlides(1);
});
var slideIndex = 1;
showSlides(slideIndex);
function changeSlides(n) {
    showSlides((slideIndex += n));
}
function currentSlide(n) {
    showSlides((slideIndex = n));
}
function showSlides(n) {
    var i;
    var slides = document.getElementsByClassName("Slide");
    if (n > slides.length) {
        slideIndex = 1;
    }
    if (n < 1) {
        slideIndex = slides.length;
    }
    Array.from(slides).forEach(item => (item.style.display = "none"));
    slides[slideIndex - 1].style.display = "block";
}
</script>
</body>
</html>

코드 설명

  • .Slide { display: none; } : 모든 슬라이드를 기본적으로 숨기고, JavaScript가 현재 슬라이드만 화면에 표시하도록 합니다.
  • showSlides() : 슬라이드 인덱스를 관리하는 핵심 함수입니다. 마지막 슬라이드에서 다음 버튼을 누르면 첫 번째 슬라이드로, 첫 번째 슬라이드에서 이전 버튼을 누르면 마지막 슬라이드로 순환 이동합니다.
  • setSlide() : 썸네일을 클릭하면 해당 번호의 슬라이드로 즉시 이동하며, 선택된 썸네일에는 보라색 하단 테두리가 표시되어 현재 위치를 한눈에 알 수 있습니다.
  • @media 쿼리 : 화면 너비가 450px 이하인 모바일 기기에서는 버튼과 캡션의 글자 크기를 16px로 줄여 작은 화면에서도 가독성을 유지합니다.

결과

위 코드를 실행하면 다음과 같은 반응형 슬라이드쇼 갤러리가 출력됩니다.

CSS와 JavaScript로 반응형 슬라이드쇼 갤러리 만드는 방법