# 
        20.swiper
    
        # 
        목차 
    
1. swiper 2. 설치 2.1. cdn 2.2. npm 
3. 실행 4. 주요욥션 5. 주요메서드 5.1. 페이지네이션 종류 
6. 예제 6.1. 이미지갤러리 6.1.1. STEP1 6.1.2. STEP2 6.1.3. STEP3 
6.2. Horizontal layout 
        # 
        1. swiper
    
GreenSock Engaging the Internet GASP은 애니메이션을 쉽게 적용할 수 있는 라이브러리로 J-Query 보다 20배 이상 빠른 성능을 갖고 있다고 소개하고 있다. gsap.to() 메소드를 이용해 자연스러운 움직임을 만들 수 있다
        # 
        2. 설치
    
        # 
        2.1. cdn
    
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
        # 
        2.2. npm
    
npm install swiper
        # 
        3. 실행
    
swiper 라이브러리를 적용하려면 html 구조를 아래와 같이 작성해야 한다. 슬라이드는 두단계로 래핑해야 한다. 컨트롤 요소는 슬라이드를 감싼 부모와 형제요소로 마크업 한다.
<!-- Slider main container -->
<div class="swiper">
	<!-- Additional required wrapper -->
	<div class="swiper-wrapper">
		<!-- Slides -->
		<div class="swiper-slide">Slide 1</div>
		<div class="swiper-slide">Slide 2</div>
		<div class="swiper-slide">Slide 3</div>
		...
	</div>
	<!-- If we need pagination -->
	<div class="swiper-pagination"></div>
	<!-- If we need navigation buttons -->
	<div class="swiper-button-prev"></div>
	<div class="swiper-button-next"></div>
	<!-- If we need scrollbar -->
	<div class="swiper-scrollbar"></div>
</div>
.swiper {
	width: 600px;
	height: 300px;
}
const swiper = new Swiper('.swiper', {
	// 스와이퍼 방향 및 반복 여부
	direction: 'vertical',
	loop: true,
	// 페이지네이션 설정
	pagination: {
		el: '.swiper-pagination',
	},
	// 네비게이션 화살표 설정
	navigation: {
		nextEl: '.swiper-button-next',
		prevEl: '.swiper-button-prev',
	},
	// 스크롤바 설정
	scrollbar: {
		el: '.swiper-scrollbar',
	},
});
        # 
        4. 주요욥션
    
        # 
        5. 주요메서드
    
        # 
        5.1. 페이지네이션 종류
    
    
        # 
        6. 예제
    
        # 
        6.1. 이미지갤러리
    
swiper를 이용해 이미지갤러리를 제작한다. 가로 820픽셀 이미지 8 장을 준비하고 Swiper를 이용해서 3개의 이미지가 보여지며 페이지 이동과 이전, 다음 버튼을 이용해 이미지를 변경할 수 있도록 제작
        # 
        6.1.1. STEP1
    
reset.css 와 스와이퍼를 설치한다
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/reset-css@5.0.1/reset.min.css" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js" defer></script>
section태그 자식요소로div를 만들고 자식요소로 스와이퍼 요소를 추가한다. 스와이퍼에서 제공하는 클래스이름은 변경하지 않고 그대로 사용한다. 스와이퍼의 부모요소인section과div는 필요에 따라 변경해서 사용하면된다.
<section class="notice">
	<div class="promotion">
		<div class="swiper-container">
			<div class="swiper-wrapper">
				<div class="swiper-slide"></div>
			</div>
		</div>
		<div class="swiper-pagination"></div>
		<div class="swiper-prev"></div>
		<div class="swiper-next"></div>
	</div>
</section>
슬라이드에 추가할 이미지를
img태그를 이용해swiper-slide자식 요소로 입력한다.
<div class="swiper-slide">
	<img src="./imgs/1.jpg" alt="" />
</div>
<div class="swiper-slide">
	<img src="./imgs/2.jpg" alt="" />
</div>
<div class="swiper-slide">
	<img src="./imgs/3.jpg" alt="" />
</div>
<div class="swiper-slide">
	<img src="./imgs/4.jpg" alt="" />
</div>
<div class="swiper-slide">
	<img src="./imgs/5.jpg" alt="" />
</div>
<div class="swiper-slide">
	<img src="./imgs/6.jpg" alt="" />
</div>
<div class="swiper-slide">
	<img src="./imgs/7.jpg" alt="" />
</div>
<div class="swiper-slide">
	<img src="./imgs/8.jpg" alt="" />
</div>
구글 머티리얼 아이콘을 이용해 좌/우 화살표를 입력한다.
<div class="swiper-prev">
	<span class="material-symbols-outlined"> chevron_left </span>
</div>
<div class="swiper-next">
	<span class="material-symbols-outlined"> chevron_right </span>
</div>
"body" 배경색을 파일 1개를 지정하고 글꼴을 지정한다. 스와이퍼를 감싸는"promotion"에도 배경색과 높이를 설정한다.
body {
	background-color: rgb(228, 247, 255);
	color: darkblue;
	font-size: 16px;
	font-weight: 400;
	line-height: 1.4;
	font-family: 'Nanum Gothic', sans-serif;
}
.notice .promotion {
	height: 740px;
	background-color: #3e85a3;
	position: relative;
	overflow-x: hidden;
}
'use strict';
new Swiper('.promotion .swiper-container', {
	slidesPerView: 3, //한번에 보여줄 슬라이드 개수
	spaceBetween: 20,
	centeredSlides: true,
	loop: true,
	autoplay: {
		delay: 5000,
	},
	pagination: {
		el: '.swiper-pagination',
		clickable: true, //사용자의 페이지 번호 요소 제어 가능 여부
	},
	navigation: {
		prevEl: '.promotion .swiper-prev',
		nextEl: '.promotion .swiper-next',
	},
});
        # 
        6.1.2. STEP2
    
이미지 위치조정
슬라이드를 3장씩 보여주고 선택된 이미지는 중앙에 선명하게 보여 주고 양쪽에 이미지는 투명도를 0.4정도를 줘서 반투명하게 보여주 도록 한다. 세장의 이미지를 보여주기 위해 "swiper-container"의 폭을 3배 로 지정하고 간격을 20픽셀 더한 2,480픽셀로 지정한다.
.notice .promotion .swiper-container {
	width: calc(420px * 3 + 20px);
	height: 540px;
	position: absolute;
	top: 40px;
	left: 50%;
	transform: translateX(-50%);
}
        # 
        6.1.3. STEP3
    
투명도 조정 및 버튼 배치
슬라이드에서 가운데 보여지는 이미지의 투명도를 1로 하고 양쪽에 이미지는 투명도를 0.4로 지정한다. 페이지네이션 블릿은 이미지("./imgs/promotion_slide_pager.png")를 백그라운로 지정한다. 그후 액티브 상태의 이미지 ("./imgs/promotion_slide_pager_on.png")를 교체하도록 설정한다.
.notice .promotion .swiper-slide {
	opacity: 0.4;
	transition: opacity 1s;
	position: relative;
	text-align: center;
}
.notice .promotion .swiper-slide img {
	width: 100%;
	height: 100%; /* 비율깨짐 */
	object-fit: fill;
	object-fit: contain;
	object-fit: scale-down;
	object-fit: cover; /* 가로기준으로 비율에 맞게 채움 */
}
.notice .promotion .swiper-slide-active {
	opacity: 1;
}
.notice .promotion .swiper-pagination {
	bottom: 40px;
	left: 0;
	right: 0;
	position: absolute;
	z-index: 9999;
}
.notice .promotion .swiper-pagination .swiper-pagination-bullet {
	background-color: transparent;
	background: url('./imgs/promotion_slide_pager.png') no-repeat center center/100%;
	width: 20px;
	height: 20px;
	margin-right: 6px;
	outline: none;
}
.notice .promotion .swiper-pagination .swiper-pagination-bullet:last-child {
	margin-right: 0;
}
.notice .promotion .swiper-pagination .swiper-pagination-bullet-active {
	background: url('./imgs/promotion_slide_pager_on.png') no-repeat center center/100%;
}
좌우로 이동하는 화살표에 호버를 설정한다.
.notice .promotion .swiper-prev,
.notice .promotion .swiper-next {
	width: 42px;
	height: 42px;
	border: 2px solid rgb(255, 255, 255);
	border-radius: 50%;
	color: white;
	position: absolute;
	top: 300px;
	z-index: 1;
	cursor: pointer;
	outline: none;
	display: flex;
	justify-content: center;
	align-items: center;
	transition: 0.4s;
	user-select: none;
}
.notice .promotion .swiper-prev {
	left: 50%;
	margin-left: -480px;
}
.notice .promotion .swiper-next {
	right: 50%;
	margin-right: -480px;
}
.notice .promotion .swiper-prev:hover,
.notice .promotion swiper-next:hover {
	background-color: rgb(255, 255, 255);
	color: rgb(0, 0, 0);
}
        # 
        6.2. Horizontal layout
    
- 구조작성
 
<!--  .swiper.vertical>swiper-wrapper>(a.swiper-slide)*3+section.swiper.section_All.swiper+a.swiper-slide -->
<div class="swiper vertical">
		<div class="swiper-wrapper">
				<div class="a swiper-slide">
						1
				</div>
				<div class="a swiper-slide">
						2
				</div>
				<div class="a swiper-slide">
						3
				</div>
				<section class="swiper section_All swiper-slide">
						<div class="swiper-wrapper">
								<div class="swiper-slide" data-hash="slide1">Slide 1</div>
								<div class="swiper-slide" data-hash="slide2">Slide 2</div>
								<div class="swiper-slide" data-hash="slide3">Slide 3</div>
								<div class="swiper-slide" data-hash="slide1">Slide 4</div>
								<div class="swiper-slide" data-hash="slide1">Slide 5</div>
								<div class="swiper-slide" data-hash="slide1">Slide 6</div>
								<div class="swiper-slide" data-hash="slide1">Slide 7</div>
								<div class="swiper-slide" data-hash="slide1">Slide 8</div>
								<div class="swiper-slide" data-hash="slide1">Slide 9</div>
						</div>
						<div class="swiper-pagination"></div>
				</section>
				<div class="a swiper-slide">
						5
				</div>
		</div>
</div>
- 라이브러리 로드
 
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@10/swiper-bundle.min.css" />
<script src="https://cdn.jsdelivr.net/npm/swiper@10/swiper-bundle.min.js" defer></script>
- css 작성
 
html,
body {
		position: relative;
		height: 100%;
}
body {
		background: #eee;
		font-size: 14px;
		color: #000;
		margin: 0;
		padding: 0;
}
.vertical {
		/*  background: #000; */
}
.a {
		width: 100%;
		height: 100vh;
		background: #ccc;
}
.swiper {
		width: 100%;
		height: 100%;
}
.swiper-slide {
		text-align: center;
		font-size: 18px;
		/*     background: #fff; */
		display: flex;
		justify-content: center;
		align-items: center;
}
.swiper-slide img {
		display: block;
		width: 100%;
		height: 100%;
		object-fit: cover;
}
- 스크립트 작성
 
const swiper = new Swiper(".section_All", {
		direction: "horizontal",
		slidesPerView: 1,
		spaceBetween: 30,
		mousewheel: true,
		pagination: {
				el: ".swiper-pagination",
				clickable: true,
		},
		hashNavigation: {
				watchState: true,
		},
});
const swiper2 = new Swiper(".vertical", {
		direction: "vertical",
		slidesPerView: 1,
		mousewheel: true,
});