Skip to content

Commit 761e6e9

Browse files
committed
[bugfix] Slider 버그 수정
* 마우스로 슬라이드 내부의 텍스트 선택 안 되는 것 수정 * 원인: react-slick이 각 슬라이드의 user-select를 none으로 만들었음 * 슬라이드 내부에 버튼 같은 거 있을 때 클릭 안 되는 문제 수정 * 원인: react-slick은 슬라이드들의 opacity만 바꾸는 식으로 동작하기 때문에 마우스 이벤트가 특정 슬라이드에만 계속 먹음 * 기타 * .scoped.scss 안에서 .slick-slider 등의 global class를 사용하기 위해 ::v-deep 사용 * react-scoped-css 제작자 권장은 `/deep/` 또는 `>>>`이나, 두 문법은 sass(= dart-sass)에서 지원이 안 됨 (옛날 버전인 node-sass만 지원) * Vue에서는 같은 문제를 겪고 자체적으로 ::v-deep을 추가했는데, (<vuejs/vue-cli#3399 (comment)>) react-scoped-css도 내부적으로 Vue 컴파일러를 가져다가 쓰기 때문에 이 문법이 작동함
1 parent 878f614 commit 761e6e9

File tree

4 files changed

+59
-39
lines changed

4 files changed

+59
-39
lines changed

Diff for: src/components/slider/Slider.scoped.scss

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,25 @@
11
.mainVisualSlider {
2-
max-width: 70%;
2+
width: 100%;
33

44
img {
55
max-width: 100%;
66
min-width: 100%;
77
height: auto;
88
}
99
}
10+
11+
// .abc::v-deep .def 쓰면 .def는 global class로 취급됨.
12+
// (react-scoped-css가 내부적으로 Vue 컴파일러 가져다가 씀 -> Vue scoped css의 문법 작동함)
13+
.mainVisualSlider,
14+
.mainNoticeSlider {
15+
// 마우스로 슬라이드 내부의 텍스트 선택 안 되는 것 수정.
16+
::v-deep .slick-slider {
17+
user-select: auto;
18+
}
19+
20+
// 슬라이드 내부에 버튼 같은 거 있을 때 클릭 안 되는 문제 수정.
21+
// 현재 슬라이드가 항상 가장 앞쪽에 그려지도록 함.
22+
::v-deep .slick-current.slick-active {
23+
z-index: 2;
24+
}
25+
}

Diff for: src/components/slider/index.tsx

+17-14
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
import React, { ReactNode, useState } from "react";
22
import Slider, { Settings } from "react-slick";
3-
import classNames from "classnames";
43

54
import "slick-carousel/slick/slick.css";
65
import "slick-carousel/slick/slick-theme.css";
76
import "@/components/slider/Slider.scoped.scss";
87

98
interface SliderProps {
10-
className?: string;
119
children: ReactNode;
1210
}
1311

1412
const Sliders = ({ children }: SliderProps) => {
1513
<div>{children}</div>;
1614
};
17-
const MainVisualSlider = ({ className, children }: SliderProps) => {
18-
const ref = React.useRef<any>();
15+
16+
const MainVisualSlider = ({ children }: SliderProps) => {
17+
const ref = React.useRef<Slider>(null);
1918
const [count, setCount] = useState(true);
2019

2120
const settings: Settings = {
@@ -26,20 +25,26 @@ const MainVisualSlider = ({ className, children }: SliderProps) => {
2625
autoplaySpeed: 1000,
2726
fade: true,
2827
};
29-
function play() {
28+
29+
const play = () => {
30+
if (ref.current === null) {
31+
return;
32+
}
33+
3034
if (count === true) {
3135
ref.current.slickPause();
3236
setCount(false);
3337
} else {
3438
ref.current.slickPlay();
3539
setCount(true);
3640
}
41+
3742
console.log("count", count);
38-
}
43+
};
3944

4045
return (
41-
<div>
42-
<Slider {...settings} className={classNames("mainVisualSlider", className)} ref={ref}>
46+
<div className={"mainVisualSlider"}>
47+
<Slider {...settings} ref={ref}>
4348
{children}
4449
</Slider>
4550
<div style={{ textAlign: "center" }}>
@@ -51,7 +56,7 @@ const MainVisualSlider = ({ className, children }: SliderProps) => {
5156
);
5257
};
5358

54-
const MainNoticeSlider = ({ className, children }: SliderProps) => {
59+
const MainNoticeSlider = ({ children }: SliderProps) => {
5560
const settings: Settings = {
5661
dots: true,
5762
infinite: false,
@@ -88,15 +93,13 @@ const MainNoticeSlider = ({ className, children }: SliderProps) => {
8893
};
8994

9095
return (
91-
<div>
92-
<Slider {...settings} className={classNames("visualSlider", className)}>
93-
{children}
94-
</Slider>
96+
<div className="mainNoticeSlider">
97+
<Slider {...settings}>{children}</Slider>
9598
</div>
9699
);
97100
};
98101

99102
export default Object.assign(Sliders, {
100103
MainVisual: MainVisualSlider,
101-
MainNotive: MainNoticeSlider,
104+
MainNotice: MainNoticeSlider,
102105
});

Diff for: src/containers/Main.scoped.scss

-5
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@
99
margin-bottom: 176px;
1010
}
1111

12-
.slider {
13-
width: 1397px;
14-
max-width: 100%;
15-
}
16-
1712
.descriptionArea {
1813
box-sizing: border-box;
1914
position: absolute;

Diff for: src/containers/Main.tsx

+25-19
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,36 @@
1-
import React from "react";
1+
import React, { ReactNode } from "react";
22
import Image from "next/image";
33
import Link from "next/link";
4-
import Slider from "@/components/slider";
54

5+
import Slider from "@/components/slider";
66
import "@/containers/Main.scoped.scss";
7+
78
interface MainVisualSliderType {
89
img: string;
910
title: string;
1011
subTitle: string;
11-
description: string;
12+
description: ReactNode;
1213
}
14+
1315
const mainVisualContent: Array<MainVisualSliderType> = [
1416
{
1517
img: "main-background1.jpg",
1618
title: "세상 밖으로 나오는 당신의 도전",
1719
subTitle: "당신의 능력을 보여주세요",
18-
description:
19-
"<div>세상과 소통하고 싶은 당신을 위해 준비했습니다. 세상밖으로 나와 당신의 능력을 마음껏 펼쳐보아요! <br><br> 'See Me' 에서 여러분을 인도해 드릴것입니다. 'See Me' 는 당신을 기다리고 있습니다.</div>",
20+
description: (
21+
<div>
22+
세상과 소통하고 싶은 당신을 위해 준비했습니다. 세상밖으로 나와 당신의 능력을 마음껏 펼쳐보아요!
23+
<br />
24+
<br />
25+
&apos;See Me&apos; 에서 여러분을 인도해 드릴것입니다. &apos;See Me&apos; 는 당신을 기다리고 있습니다.
26+
</div>
27+
),
2028
},
2129
{
2230
img: "main-background1.jpg",
2331
title: "sdfs",
2432
subTitle: "subtitle",
25-
description: "<div>내용 123123123</div>",
33+
description: <div>내용 123123123</div>,
2634
},
2735
];
2836

@@ -42,15 +50,15 @@ const mainNoticeContent: Array<MainNotiveSliderProps> = [
4250
const MainSection = () => (
4351
<div className="mainSection">
4452
<div className="content">
45-
<Slider.MainVisual className="slider">
53+
<Slider.MainVisual>
4654
{mainVisualContent.map((list, i) => (
4755
<div key={i}>
4856
<Image {...require(`@/images/home/${list.img}`).default} alt=" " />
4957

5058
<div className="descriptionArea">
5159
<div className="title1">{list.title}</div>
5260
<div className="title2">{list.subTitle}</div>
53-
<div className="description" dangerouslySetInnerHTML={{ __html: list.description }}></div>
61+
<div className="description">{list.description}</div>
5462
<button className="moreButton" type="button">
5563
Learn More
5664
</button>
@@ -59,21 +67,19 @@ const MainSection = () => (
5967
))}
6068
</Slider.MainVisual>
6169

62-
<Slider.MainNotive className="slider">
70+
<Slider.MainNotice>
6371
{mainNoticeContent.map((list, i) => (
6472
<div key={i}>
65-
<div>
66-
<span className="group">{list.group}</span>
67-
<Link href="jvavscript:void(0)">
68-
<a className="title">
69-
{list.title}
70-
<div className="more">더보기</div>
71-
</a>
72-
</Link>
73-
</div>
73+
<span className="group">{list.group}</span>
74+
<Link href="jvavscript:void(0)">
75+
<a className="title">
76+
{list.title}
77+
<div className="more">더보기</div>
78+
</a>
79+
</Link>
7480
</div>
7581
))}
76-
</Slider.MainNotive>
82+
</Slider.MainNotice>
7783
</div>
7884
</div>
7985
);

0 commit comments

Comments
 (0)