Post

레이아웃 이미지 슬라이드 1 - javascript

레이아웃 슬라이드 이미지 만들기

slider1-4

완성화면

가운데에 있는 총 3개의 이미지가 서서히 사라지면서 다음 이미지가 생성 되는 이미지 슬라이드 입니다.

jquery와 javascript 를 사용하여 이 애니메이션을 할 수 있습니다. javascrip / jquery 를 따로따로 작성하여 한 줄씩 분석해보겠습니다!




이미지 슬라이드를 만들기 위해 구조를 간단하게 설명해드릴게요!


slider1-1

slider1-2

위 사진과 아래 사진을 같은 색으로 구분해놨습니다!

slider1-3

CSS 도 함께 올리도록 하겠습니다!



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        window.onload = function () {
            let currentIndex = 0; // 현재 이미지
            const slider = document.querySelectorAll(".slider");    // 모든 이미지 변수 저장
            slider.forEach(img => img.style.opacity = "0");         // 모든 이미지를 투명하게
            slider[0].style.opacity = "1";                          // 첫번째 이미지만 보이게 설정

            setInterval(() => {     // 3초에 한번씩 실행
                let nextIndex = (currentIndex + 1) % slider.length      //  1 2 0 1 2 0.......

                slider[currentIndex].style.opacity = "0";      // 첫번째 이미지 사라짐
                slider[nextIndex].style.opacity = "1";      // 두번째 이미지 나타남
                slider.forEach(img => img.style.transition = "all 1s")  // 이미지에 애니메이션 추가

                currentIndex = nextIndex;
            }, 3000);
        }


간단한 이미지 슬라이더의 기능을 수행하는 jquery의 코드입니다.


바로 코드를 분석해보겠습니다.


1
2
3
4
<script>
window.onload = function () {
    let currentIndex = 0; // 현재 이미지
    const slider = document.querySelectorAll(".slider"); // 모든 이미지 변수 저장
  • window.onload = function() {...}는 웹 페이지의 모든 요소가 로드되고 난 후에 함수가 실행되도록 하는 이벤트 핸들러입니다.
    이를 통해 스크립트 실행 시 모든 이미지 요소가 이미 DOM에 존재하는 것을 확보합니다.
  • const slider = document.querySelectorAll(“.slider”);는 클래스 이름이 “slider”인 모든 요소를 선택하여 slider 변수에 저장합니다.
    이 변수는 이미지들을 배열 형태로 가지고 있게 됩니다.


1
2
slider.forEach(img => img.style.opacity = "0"); // 모든 이미지를 투명하게
slider[0].style.opacity = "1"; // 첫번째 이미지만 보이게 설정
  • slider.forEach(img => img.style.opacity = “0”);는 모든 이미지의 투명도를 0으로 설정하여 처음에 보이지 않게 합니다.
    slider[0].style.opacity = “1”;는 배열의 첫 번째 이미지만 투명도를 1로 설정하여 보이게 합니다.


1
2
setInterval(() => { // 3초에 한번씩 실행
    let nextIndex = (currentIndex + 1) % slider.length // 1 2 0 1 2 0.......
  • setInterval(() => {...}, 3000); 은 주어진 함수를 매 3000밀리초(3초)마다 실행합니다. 이를 통해 이미지가 주기적으로 교체됩니다. let nextIndex = (currentIndex + 1) % slider.length는 다음에 보여질 이미지의 인덱스를 계산합니다. 여기서 slider.length는 이미지의 총 개수로, 이미지 인덱스가 배열의 크기를 넘지 않도록 합니다.


1
2
3
slider[currentIndex].style.opacity = "0"; // 현재 이미지 사라짐
slider[nextIndex].style.opacity = "1"; // 다음 이미지 나타남
slider.forEach(img => img.style.transition = "all 1s") // 이미지에 애니메이션 추가
  • slider[currentIndex].style.opacity = "0";와 slider[nextIndex].style.opacity = "1";는 현재 이미지를 투명하게 하고 다음 이미지를 불투명하게 하여 교체 효과를 만듭니다.
  • slider.forEach(img => img.style.transition = "all 1s");는 모든 이미지에 CSS 전환 효과를 적용하여, 투명도 변경이 1초 동안 부드럽게 이루어지도록 합니다.


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
304
305
306
<!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>
        window.onload = function () {
            let currentIndex = 0; // 현재 이미지
            const slider = document.querySelectorAll(".slider");    // 모든 이미지 변수 저장
            slider.forEach(img => img.style.opacity = "0");         // 모든 이미지를 투명하게
            slider[0].style.opacity = "1";                          // 첫번째 이미지만 보이게 설정

            setInterval(() => {     // 3초에 한번씩 실행
                let nextIndex = (currentIndex + 1) % slider.length      //  1 2 0 1 2 0.......

                slider[currentIndex].style.opacity = "0";      // 첫번째 이미지 사라짐
                slider[nextIndex].style.opacity = "1";      // 두번째 이미지 나타남
                slider.forEach(img => img.style.transition = "all 1s")  // 이미지에 애니메이션 추가

                currentIndex = nextIndex;
            }, 3000);
        }
    </script>

</body>

</html>


이렇게 자연스럽게 이미지가 변경됩니다.
다음엔 다른 이미지 형식을 설명하겠습니다!

This post is licensed under CC BY 4.0 by the author.