레이아웃 이미지 슬라이드 1 - jquery
레이아웃 슬라이드 이미지 만들기
완성화면
가운데에 있는 총 3개의 이미지가 서서히 사라지면서 다음 이미지가 생성 되는 이미지 슬라이드 입니다.
jquery와 javascript 를 사용하여 이 애니메이션을 할 수 있습니다. javascrip / jquery 를 따로따로 작성하여 한 줄씩 분석해보겠습니다!
이미지 슬라이드를 만들기 위해 구조를 간단하게 설명해드릴게요!
위 사진과 아래 사진을 같은 색으로 구분해놨습니다!
CSS 도 함께 올리도록 하겠습니다!
1
2
3
4
5
6
7
8
9
10
11
12
$(function () {
let currentIndex = 0; // 현재 이미지
setInterval(() => {
let nextIndex = (currentIndex + 1) % 3 // 1, 2, 0 ,, 1, 2, 0,, 무한반복
$(".slider").eq(currentIndex).fadeOut(1000); // 첫번째 이미지가 사라짐
$(".slider").eq(nextIndex).fadeIn(1000); // 두번째 이미지가 나타남
currentIndex = nextIndex;
}, 1000);
});
간단한 이미지 슬라이더의 기능을 수행하는 jquery의 코드입니다.
바로 코드를 분석해보겠습니다.
1
2
3
<script>
$(function () {
let currentIndex = 0; // 현재 이미지
$(function () {...});
는 문서가 완전히 로드된 후에 실행되는 jQuery의 준비 핸들러입니다.
이 구문은$(document).ready(function() {...});
와 동일한 역할을 합니다.
스크립트가 DOM 요소들에 접근하기 전에 해당 요소들이 완전히 로드되었는지를 확인합니다. d- let currentIndex = 0;는 현재 보여지고 있는 이미지의 인덱스를 저장하는 변수입니다. 초기 값은 0으로, 첫 번째 이미지부터 시작합니다.
1
2
setInterval(() => {
let nextIndex = (currentIndex + 1) % 3 // 1, 2, 0 ,, 1, 2, 0,, 무한반복
setInterval(() => {...}, 1000);
은 주어진 함수를 매 1000밀리초(1초)마다 반복 실행합니다. 이를 통해 이미지가 자동으로 교체되는 타이머 기능을 구현합니다.- let nextIndex = (currentIndex + 1) % 3은 다음에 보여질 이미지의 인덱스를 계산합니다. % 3은 인덱스가 0, 1, 2를 순환하도록 하는 모듈로 연산입니다. 예를 들어 currentIndex가 2일 때 nextIndex는 (2 + 1) % 3 = 0이 되어 다시 첫 번째 이미지로 돌아갑니다.
만약 사진이 4장이면 %4 , 5장이면 %5 입니다
1
2
$(".slider").eq(currentIndex).fadeOut(1000); // 첫번째 이미지가 사라짐
$(".slider").eq(nextIndex).fadeIn(1000); // 두번째 이미지가 나타남
- $(“.slider”).eq(currentIndex).fadeOut(1000);는 jQuery를 사용하여 현재 이미지(currentIndex에 해당하는 이미지)를 1000밀리초 동안 서서히 사라지게 하는 효과를 적용합니다.
.slider는 이미지를 감싸고 있는 클래스로 가정합니다. - $(“.slider”).eq(nextIndex).fadeIn(1000);는 다음 이미지(nextIndex에 해당하는 이미지)를 1000밀리초 동안 서서히 나타나게 하는 효과를 적용합니다.
1
currentIndex = nextIndex;
- currentIndex = nextIndex;는 현재 이미지 인덱스를 갱신하여, 다음 타이머 호출 때 올바른 이미지가 선택되도록 합니다.
전체 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
<style>
* {
margin: 0;
padding: 0;
}
#wrap {}
#header {
width: 100%;
height: 100px;
background-color: #c4c4c4;
z-index: 1000;
position: relative;
}
#header::after {
content: '';
width: 100%;
height: 0;
background-color: #000;
position: absolute;
left: 0;
top: 100px;
transition: all 0.3s;
}
#header.on::after {
height: 155px
}
#header .cotainer .logo {
width: 20%;
height: 100px;
background-color: #e2d3eb;
}
#header .cotainer .nav {
width: 80%;
height: 100px;
background-color: #c8a1d7;
}
#slide {
width: 100%;
height: 300px;
}
.slideWrap {
width: 100%;
height: 300px;
background-color: #f0c0f5;
}
#contents {
width: 100%;
height: 200px;
}
.contents1 {
width: 33.333%;
height: 200px;
background-color: #d1aad0;
}
.contents2 {
width: 33.333%;
height: 200px;
background-color: #c1a3c7;
}
.contents3 {
width: 33.333%;
height: 200px;
background-color: #c1a7d4;
}
#footer {
width: 100%;
height: 100px;
background-color: #c4c4c4;
}
.footer1 {
width: 80%;
height: 100px;
background-color: #e2d6ee;
}
.footer1-1 {
width: 100%;
height: 50%;
background-color: #c2aac3;
}
.footer1-2 {
width: 100%;
height: 50%;
background-color: #d4a6d3;
}
.footer2 {
width: 20%;
height: 100px;
background-color: #b494b3;
}
.cotainer {
width: 1200px;
height: inherit;
display: flex;
margin: 0 auto;
background-color: rgba(161, 161, 161, 0.4);
}
/* slideWrap */
.slideWrap {
position: relative;
}
.slideWrap .slider {
position: absolute;
left: 0;
top: 0;
}
.slideWrap .slider:nth-child(1) {
display: block;
}
.slideWrap .slider span {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
background-color: rgba(0, 0, 0, 0.4);
color: #fff;
padding: 10px 20px;
}
/* nav */
.nav {
position: relative;
z-index: 2000;
}
.nav>ul {
display: flex;
justify-content: right;
margin-top: 60px;
}
.nav>ul>li {
list-style: none;
}
.nav>ul>li>ul {
display: none;
}
.nav>ul>li>a {
text-decoration: none;
color: #000;
padding: 10px 50px;
background-color: #bcbcbc;
display: inline-block;
}
.nav>ul>li>a:hover {
background-color: #f1e3ff;
}
.nav>ul>li>ul>li {
list-style: none;
text-align: center;
}
.nav>ul>li>ul>li>a {
text-decoration: none;
color: #fff7f7;
width: 100%;
padding: 10px;
display: inline-block;
box-sizing: border-box;
}
.nav>ul>li>ul>li>a:hover {
background-color: #4c4c4c;
}
</style>
</head>
<body>
<div id="wrap">
<header id="header">
<div class="cotainer">
<div class="logo"></div>
<div class="nav">
<ul>
<li><a href="#">1차 메뉴</a>
<ul>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
</ul>
</li>
<li><a href="#">2차 메뉴</a>
<ul>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
</ul>
</li>
<li><a href="#">3차 메뉴</a>
<ul>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
</ul>
</li>
<li><a href="#">4차 메뉴</a>
<ul>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
<li><a href="#">2차 메뉴</a></li>
</ul>
</li>
</ul>
</div>
</div>
</header>
<article id="slide">
<div class="cotainer">
<div class="slideWrap">
<div class="slider s1">
<img src="https://webstoryboy.github.io/webstoryboy/w_webd/slider/slider01.jpg" alt=이미지1">
<span>이미지1</span>
</div>
<div class="slider s2">
<img src="https://webstoryboy.github.io/webstoryboy/w_webd/slider/slider02.jpg" alt="이미지2">
<span>이미지2</span>
</div>
<div class="slider s3">
<img src="https://webstoryboy.github.io/webstoryboy/w_webd/slider/slider03.jpg" alt="이미지3">
<span>이미지3</span>
</div>
</div>
</div>
</article>
<main id="contents">
<div class="cotainer">
<div class="contents1"></div>
<div class="contents2"></div>
<div class="contents3"></div>
</div>
</main>
<div id="footer">
<div class="cotainer">
<div class="footer1">
<div class="footer1-1"></div>
<div class="footer1-2"></div>
</div>
<div class="footer2"></div>
</div>
</div>
<!-- //footer -->
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>
$(function () {
let currentIndex = 0; // 현재 이미지
setInterval(() => {
let nextIndex = (currentIndex + 1) % 3 // 1, 2, 0 ,, 1, 2, 0,, 무한반복
$(".slider").eq(currentIndex).fadeOut(1000); // 첫번째 이미지가 사라짐
$(".slider").eq(nextIndex).fadeIn(1000); // 두번째 이미지가 나타남
currentIndex = nextIndex;
}, 1000);
});
</script>
</body>
</html>
이렇게 자연스럽게 이미지가 변경됩니다.
다음엔 javascript 형식을 소개하도록 하겠습니다!
This post is licensed under CC BY 4.0 by the author.