Post

[React] React Simple Image Slider 플러그인 사용법

간단하고 가벼운 React 이미지 슬라이더 컴포넌트로 자동재생, 네비게이션, 인디케이터 등 다양한 기능 지원

[React] React Simple Image Slider 플러그인 사용법

#01. 플러그인 설치

https://github.com/kimcoder/react-simple-image-slider 에서 자세한 내용을 확인할 수 있다.

Yarn 사용

1
$ yarn add react-simple-image-slider

npm 사용

1
$ npm install react-simple-image-slider

#02. 초기 구성

1. 라이브러리와 샘플 이미지 참조

1
2
3
4
5
6
7
8
import React, {memo} from 'react';
import styled from 'styled-components';
import ImageSlider from "react-simple-image-slider";

import slide1 from '../../assets/img/slide1.jpg';
import slide2 from '../../assets/img/slide2.jpg';
import slide3 from '../../assets/img/slide3.jpg';
import slide4 from '../../assets/img/slide4.jpg';

2. 이미지 데이터 구조

React Simple Image Slider는 url 속성을 가진 객체 배열을 사용합니다:

1
2
3
4
5
6
const images = [
    { url: slide1 },
    { url: slide2 },
    { url: slide3 },
    { url: slide4 }
];

슬라이더 데모

#03. 기본 사용 방법

1. 기본 슬라이더 구현

1
2
3
4
5
<ImageSlider
    width="100%"
    height={480}
    images={images}
/>

2. 주요 속성 설정

1
2
3
4
5
6
7
8
9
10
<ImageSlider
    width="100%"              // 슬라이더 너비
    height={480}              // 슬라이더 높이
    images={images}           // 이미지 배열
    showBullets={true}        // 하단 인디케이터 표시
    showNavs={true}           // 좌우 네비게이션 화살표 표시
    autoPlay={true}           // 자동재생 활성화
    autoPlayDelay={2.0}       // 자동재생 지연시간 (초)
    loop={true}               // 무한 루프 설정
/>

3. 기본 사용 방법이 적용된 간단한 샘플 코드

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
/**
 * React Simple Image Slider
 *
 * https://github.com/kimcoder/react-simple-image-slider#readme
 *
 * yarn add react-simple-image-slider
 */

import React, {memo} from 'react';

import styled from 'styled-components';

import ImageSlider from "react-simple-image-slider";

import slide1 from '../../assets/img/slide1.jpg';
import slide2 from '../../assets/img/slide2.jpg';
import slide3 from '../../assets/img/slide3.jpg';
import slide4 from '../../assets/img/slide4.jpg';

const SliderExContainer = styled.div`

`;

const SliderEx = memo(() => {
    const images = [
        { url: slide1 },
        { url: slide2 },
        { url: slide3 },
        { url: slide4 }
    ];

    return (
        <SliderExContainer>
            <h2>SliderEx</h2>

            <ImageSlider
                width="100%"
                height={480}
                images={images}
                showBullets={true}
                showNavs={true}
                autoPlay={true}
                autoPlayDelay={2.0}
                loop={true} />

        </SliderExContainer>
    );
});

export default SliderEx;

#04. ImageSlider 주요 속성

1. 필수 속성

속성타입설명
imagesArray이미지 객체 배열 [{url: "path"}]
widthString/Number슬라이더 너비
heightString/Number슬라이더 높이

2. 선택적 속성

속성타입기본값설명
showBulletsBooleanfalse하단 인디케이터 점 표시
showNavsBooleanfalse좌우 네비게이션 화살표 표시
autoPlayBooleanfalse자동재생 활성화
autoPlayDelayNumber2.0자동재생 지연시간 (초)
loopBooleanfalse무한 루프 설정
navStyleNumber1네비게이션 스타일 (1~2)
navSizeNumber50네비게이션 크기 (px)
navMarginNumber30네비게이션 여백 (px)
bulletStyleNumber1인디케이터 스타일 (1~2)
bulletSizeNumber30인디케이터 크기 (px)
bulletMarginNumber5인디케이터 간격 (px)
slideDurationNumber0.5슬라이드 전환 시간 (초)
bgColorString‘#000000’배경색
useGPURenderBooleantrueGPU 렌더링 사용

3. 스타일 커스터마이징

네비게이션 스타일

1
2
3
4
5
6
7
8
<ImageSlider
    images={images}
    width="100%"
    height={480}
    navStyle={2}              // 네비게이션 스타일 (1 또는 2)
    navSize={60}              // 네비게이션 크기
    navMargin={40}            // 네비게이션 여백
/>

인디케이터 스타일

1
2
3
4
5
6
7
8
9
<ImageSlider
    images={images}
    width="100%"
    height={480}
    showBullets={true}
    bulletStyle={2}           // 인디케이터 스타일 (1 또는 2)
    bulletSize={25}           // 인디케이터 크기
    bulletMargin={8}          // 인디케이터 간격
/>

애니메이션 설정

1
2
3
4
5
6
7
<ImageSlider
    images={images}
    width="100%"
    height={480}
    slideDuration={0.8}       // 전환 시간 (느린 전환)
    autoPlayDelay={3.0}       // 3초마다 자동 전환
/>

#05. 다양한 사용 사례

1. 반응형 슬라이더

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
const ResponsiveSlider = () => {
    const [sliderSize, setSliderSize] = useState({
        width: '100%',
        height: 480
    });

    useEffect(() => {
        const handleResize = () => {
            const isMobile = window.innerWidth <= 768;
            setSliderSize({
                width: '100%',
                height: isMobile ? 250 : 480
            });
        };

        window.addEventListener('resize', handleResize);
        handleResize(); // 초기 설정

        return () => window.removeEventListener('resize', handleResize);
    }, []);

    return (
        <ImageSlider
            images={images}
            width={sliderSize.width}
            height={sliderSize.height}
            showBullets={true}
            showNavs={true}
            autoPlay={true}
        />
    );
};

2. 동적 이미지 로딩

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
const DynamicSlider = () => {
    const [images, setImages] = useState([]);
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        // API에서 이미지 목록 가져오기
        fetch('/api/gallery')
            .then(res => res.json())
            .then(data => {
                const formattedImages = data.map(item => ({
                    url: item.imageUrl
                }));
                setImages(formattedImages);
                setLoading(false);
            });
    }, []);

    if (loading) return <div>이미지 로딩중...</div>;

    return (
        <ImageSlider
            images={images}
            width="100%"
            height={400}
            showBullets={true}
            autoPlay={true}
            loop={true}
        />
    );
};

3. 커스텀 스타일 적용

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
const CustomStyledSlider = styled.div`
    .react-simple-image-slider__bullets {
        bottom: 20px !important;
    }

    .react-simple-image-slider__bullet {
        background-color: rgba(255, 255, 255, 0.5) !important;

        &.active {
            background-color: #fff !important;
        }
    }

    .react-simple-image-slider__nav {
        background-color: rgba(0, 0, 0, 0.3) !important;

        &:hover {
            background-color: rgba(0, 0, 0, 0.6) !important;
        }
    }
`;

const StyledSliderComponent = () => (
    <CustomStyledSlider>
        <ImageSlider
            images={images}
            width="100%"
            height={480}
            showBullets={true}
            showNavs={true}
            autoPlay={true}
        />
    </CustomStyledSlider>
);

#07. 전체 소스코드

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
import React, {memo, useState, useEffect} from 'react';
import styled from 'styled-components';
import ImageSlider from "react-simple-image-slider";

// 샘플 이미지 import
import slide1 from '../../assets/img/slide1.jpg';
import slide2 from '../../assets/img/slide2.jpg';
import slide3 from '../../assets/img/slide3.jpg';
import slide4 from '../../assets/img/slide4.jpg';

// 스타일 컴포넌트 정의
const SliderExContainer = styled.div`
    .slider-section {
        margin: 2rem 0;
        padding: 1rem;
        border: 1px solid #e0e0e0;
        border-radius: 8px;
    }

    .slider-title {
        color: #333;
        margin-bottom: 1rem;
        font-size: 1.2rem;
    }

    .slider-description {
        color: #666;
        margin-bottom: 1rem;
        font-size: 0.9rem;
    }

    .full-width-slider {
        /* body태그에 부여되어 있는 padding만큼 안쪽 여백을 제거하기 위한 코드 */
        margin-left: -50px;
        margin-right: -50px;

        @media (max-width: 768px) {
            margin-left: -20px;
            margin-right: -20px;
        }
    }
`;

const SliderEx = memo(() => {
    // 이미지 데이터 배열
    const images = [
        { url: slide1 },
        { url: slide2 },
        { url: slide3 },
        { url: slide4 }
    ];

    // 반응형 높이 설정
    const [sliderHeight, setSliderHeight] = useState(480);

    useEffect(() => {
        const handleResize = () => {
            const isMobile = window.innerWidth <= 768;
            setSliderHeight(isMobile ? 250 : 480);
        };

        window.addEventListener('resize', handleResize);
        handleResize(); // 초기 설정

        return () => window.removeEventListener('resize', handleResize);
    }, []);

    return (
        <SliderExContainer>
            <h2>React Simple Image Slider 사용 예시</h2>

            {/* 기본 슬라이더 */}
            <div className="slider-section">
                <h3 className="slider-title">기본 슬라이더</h3>
                <p className="slider-description">기본적인 이미지 슬라이더입니다.</p>
                <ImageSlider
                    width="100%"
                    height={300}
                    images={images}
                />
            </div>

            {/* 네비게이션과 인디케이터가 있는 슬라이더 */}
            <div className="slider-section">
                <h3 className="slider-title">네비게이션 + 인디케이터</h3>
                <p className="slider-description">좌우 화살표와 하단 점 인디케이터가 있는 슬라이더입니다.</p>
                <ImageSlider
                    width="100%"
                    height={350}
                    images={images}
                    showBullets={true}
                    showNavs={true}
                />
            </div>

            {/* 자동재생 슬라이더 */}
            <div className="slider-section">
                <h3 className="slider-title">자동재생 슬라이더</h3>
                <p className="slider-description">2초마다 자동으로 슬라이드가 변경됩니다.</p>
                <ImageSlider
                    width="100%"
                    height={350}
                    images={images}
                    showBullets={true}
                    showNavs={true}
                    autoPlay={true}
                    autoPlayDelay={2.0}
                    loop={true}
                />
            </div>

            {/* 커스텀 스타일 슬라이더 */}
            <div className="slider-section">
                <h3 className="slider-title">커스텀 스타일</h3>
                <p className="slider-description">큰 네비게이션과 인디케이터, 느린 전환 효과가 적용된 슬라이더입니다.</p>
                <ImageSlider
                    width="100%"
                    height={350}
                    images={images}
                    showBullets={true}
                    showNavs={true}
                    navStyle={2}
                    navSize={60}
                    bulletStyle={2}
                    bulletSize={20}
                    slideDuration={0.8}
                    autoPlay={true}
                    autoPlayDelay={3.0}
                    loop={true}
                />
            </div>

            {/* 전체 폭 슬라이더 */}
            <div className="slider-section">
                <h3 className="slider-title">전체 폭 슬라이더</h3>
                <p className="slider-description">컨테이너를 벗어나 전체 폭으로 표시되는 슬라이더입니다.</p>
                <div className="full-width-slider">
                    <ImageSlider
                        width="100%"
                        height={sliderHeight}
                        images={images}
                        showBullets={true}
                        showNavs={true}
                        autoPlay={true}
                        autoPlayDelay={2.0}
                        loop={true}
                    />
                </div>
            </div>
        </SliderExContainer>
    );
});

export default SliderEx;
This post is licensed under CC BY 4.0 by the author.