CSS와 JavaScript를 활용하면 별도의 라이브러리 없이도 명언(인용구)이 넘어가는 슬라이드쇼를 손쉽게 구현할 수 있습니다. 이 글에서는 이전·다음 버튼과 하단 내비게이션 도트를 갖춘 인용 슬라이드쇼를 만드는 방법을 전체 예제 코드와 함께 단계별로 살펴보겠습니다.
전체 예제 코드
아래 코드를 그대로 복사해 HTML 파일로 저장한 뒤 브라우저에서 열면 바로 결과를 확인할 수 있습니다.
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
body {
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
}
h1 {
text-align: center;
}
* {
box-sizing: border-box;
}
.Slide {
display: none;
}
img {
vertical-align: middle;
width: 100%;
height: 400px;
}
.slideContainer {
max-width: 600px;
margin: 10px;
position: relative;
margin: auto;
}
.prevBtn, .nextBtn {
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: -40px;
}
.prevBtn {
left: -40px;
}
.Caption {
color: #500070;
font-weight: bold;
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
font-size: 25px;
padding: 8px 12px;
position: absolute;
width: 100%;
text-align: center;
}
.Navdot {
cursor: pointer;
height: 15px;
width: 15px;
margin: 0 2px;
background-color: rgb(54, 5, 117);
border-radius: 50%;
display: inline-block;
transition: background-color 0.6s ease;
display: inline-block;
margin-top: 30px;
}
.selected, .Navdot:hover {
background-color: #d9ff00;
}
@media only screen and (max-width: 450px) {
.prevBtn, .nextBtn, .Caption {
font-size: 16px;
}
}
</style>
</head>
<body>
<h1>Quote slideShow</h1>
<hr />
<div class="slideContainer">
<div class="Slide">
<h1>"The way to get started is to quit talking and begin doing."</h1>
<div class="Caption">- Walt Disney</div>
</div>
<div class="Slide">
<h1>
"If life were predictable it would cease to be life, and be without flavor."
</h1>
<div class="Caption">-Eleanor Roosevelt</div>
</div>
<div class="Slide">
<h1>"Life is what happens when you're busy making other plans."</h1>
<div class="Caption">-John Lennon</div>
</div>
<a class="prevBtn">❮</a>
<a class="nextBtn">❯</a>
</div>
<br />
<div style="text-align:center">
<span class="Navdot" onclick="currentSlide(1)"></span>
<span class="Navdot" onclick="currentSlide(2)"></span>
<span class="Navdot" onclick="currentSlide(3)"></span>
</div>
<script>
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");
var dots = document.getElementsByClassName("Navdot");
if (n > slides.length) {
slideIndex = 1;
}
if (n < 1) {
slideIndex = slides.length;
}
Array.from(slides).forEach(item => (item.style.display = "none"));
Array.from(dots).forEach(
item => (item.className = item.className.replace(" selected", ""))
);
slides[slideIndex - 1].style.display = "block";
dots[slideIndex - 1].className += " selected";
}
</script>
</body>
</html>실행 결과
위 코드를 실행하면 다음과 같은 화면이 출력됩니다.

코드 동작 원리
예제가 어떻게 작동하는지 핵심 부분만 정리해 보겠습니다.
1. 슬라이드 숨기기
.Slide 클래스에는 기본적으로 display: none;이 적용되어 있어, 페이지가 처음 로드될 때 모든 슬라이드가 숨겨진 상태로 시작합니다.
2. 현재 슬라이드 표시
showSlides() 함수는 전달받은 인덱스에 해당하는 슬라이드만 display: block;으로 변경해 화면에 보여줍니다. 동시에 나머지 슬라이드는 모두 숨기고, 하단 도트(Navdot) 중 현재 위치에 해당하는 것에만 'selected' 클래스를 추가해 색상을 강조합니다.
3. 버튼과 도트로 슬라이드 전환
좌우 화살표 버튼(prevBtn, nextBtn)을 클릭하면 changeSlides(-1) 또는 changeSlides(1)가 호출되어 이전 또는 다음 슬라이드로 이동합니다. 하단의 원형 도트를 클릭하면 currentSlide(n) 함수가 실행되어 원하는 슬라이드로 바로 건너뛸 수 있습니다.
4. 무한 순환 처리
showSlides() 함수 내부에서 인덱스가 슬라이드 개수보다 크면 첫 번째로, 1보다 작으면 마지막 슬라이드로 되돌아가도록 처리했습니다. 덕분에 사용자는 끝없이 앞뒤로 순환하며 슬라이드를 탐색할 수 있습니다.
5. 반응형 대응
미디어 쿼리(@media)를 사용해 화면 폭이 450px 이하인 모바일 환경에서는 버튼과 캡션의 글자 크기를 16px로 줄여 가독성을 확보했습니다.
마무리
이처럼 CSS와 JavaScript만으로도 버튼, 내비게이션 도트, 무한 순환, 반응형 처리까지 갖춘 인용 슬라이드쇼를 만들 수 있습니다. 명언 대신 고객 후기나 포트폴리오 이미지를 넣으면 다양한 용도로 활용할 수 있으니, 색상과 폰트를 자신만의 스타일로 바꿔 응용해 보시기 바랍니다.