"์ค๋์ ์ง" ์ฌ์ดํธ๋ฅผ ํด๋ก ์ฝ๋ฉํ๋ฉด์ ๊ฒช์ ์ด๋ ค์๊ณผ ๋ฐฐ์ด ๋ด์ฉ์ ๊ณต์ ํ๋ ค๊ณ ํฉ๋๋ค. HTML, CSS, JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ป๊ฒ ๋ ์ด์์์ ๊ตฌ์ฑํ๊ณ ๊ธฐ๋ฅ์ ๊ตฌํํ๋์ง ์์๋ณด๊ณ , ํนํ ์ด๋ ค์ ๋ JS-Swiper์ CSS์ :hover์ ๋ ์ง์คํด ๋ณด๊ฒ ์ต๋๋ค.
"์ค๋์ ์ง"์ ์ธ๋ฐํ๊ฒ ๋์์ธ๋ ๋ณต์กํ ๋ ์ด์์์ ๊ฐ์ง๊ณ ์์ด, Flex์ Grid๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณธ๊ณผ ์ ์ฌํ ๋์์ธ์ ๋ง๋๋ ๊ฒ์ด ์ด๋ ค์ ์ต๋๋ค. ํนํ, ๋ฐ์ํ ๋์์ธ์ ์ ์ฉํ๋ฉด์ ๋๋ฐ์ด์ค๋ณ๋ก ์ ์ ํ ๋ ์ด์์์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ๋์ ์ ์ด์์ต๋๋ค.
Swiper ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฒ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ์ค์ ๋ฐ ์ต์ ์ดํด๊ฐ ์ด๋ ค์ ์ต๋๋ค. ์ฌ๋ผ์ด๋ ๊ฐ ๊ฐ๊ฒฉ, ๋ฌดํ ๋ฃจํ, ์๋ ์ฌ์ ๋ฑ ๋ค์ํ ์ต์ ์ ์ ์ฉํ๋ฉด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ ์๋ฆฌ๋ฅผ ํ์ ํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค.
์ฌ์ฉ์์์ ์ํธ์์ฉ์ ๋์ด๊ธฐ ์ํด CSS์ :hover ํจ๊ณผ ๋ฐ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๋ ๋ถ๋ถ์์ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค. ์ ํํ ํ์ด๋ฐ๊ณผ ์์ฐ์ค๋ฌ์ด ํจ๊ณผ๋ฅผ ์ฃผ๊ธฐ ์ํด ๋ ธ๋ ฅํ์ต๋๋ค.
Flex์ Grid๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋ ์ด์์์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค. ํนํ, auto-fill๊ณผ auto-fit์ ์ด์ฉํ์ฌ ๋ฐ์ํ ๋์์ธ์ ๊ตฌํํ๋ ๋ฒ์ ์์งํ์ต๋๋ค.
/* ์์: Grid ํ์ฉ */
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 20px;
}
.item {
flex: 1;
/* ์ถ๊ฐ์ ์ธ ์คํ์ผ๋ง ... */
}
Swiper ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๋ค์ํ ํํ์ ์ด๋ฏธ์ง ์ฌ๋ผ์ด๋๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ต๋ํ์ต๋๋ค. ์๋ ์ฌ์, ๋ฌดํ ๋ฃจํ, ๋ค๋น๊ฒ์ด์ ๋ฑ ๋ค์ํ ์ต์ ๋ค์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ "์ค๋์ ์ง" ํด๋ก ์ฝ๋ฉ์์ ๋ฐฐ๋ ์ค์์ดํผ๋ฅผ ๊ตฌํํ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
HTML ๊ตฌ์กฐ
<div class="__rightBanner">
<div class="swiper-container">
<div class="swiper-wrapper">
<!-- ๊ฐ๊ฐ์ ์ฌ๋ผ์ด๋ -->
<div class="swiper-slide">
<img src="./images/banner_1.jpeg" alt="ํํ์ด์ง ์ฌ์ด๋ ๋ฐฐ๋" />
<a href="javascript:void(0)" class="btn">1/12</a>
</div>
<!-- ๋ค๋ฅธ ์ฌ๋ผ์ด๋๋ค ... -->
</div>
</div>
<!-- ์ด์ , ๋ค์ ๋ฒํผ -->
<div class="swiper-prev">
<span class="material-symbols-outlined">arrow_back</span>
</div>
<div class="swiper-next">
<span class="material-symbols-outlined">arrow_forward</span>
</div>
</div>
CSS ์คํ์ผ๋ง
main .banner .__rightBanner {
cursor: pointer;
position: relative;
}
main .banner .__rightBanner:hover img {
transform: scale(105%);
}
.banner .__rightBanner .swiper-container {
width: 269px;
height: 553px;
}
.banner .__rightBanner .swiper-slide {
position: relative;
height: 510px;
position: relative;
overflow: hidden;
}
.banner .promotion .swiper-slide .btn {
position: absolute;
bottom: 0;
left: 0;
right: 0;
margin: auto;
}
JavaScript Swiper ๊ตฌํ
new Swiper('.__rightBanner .swiper-container', {
slidesPerView: 1,
spaceBetween: 10,
centeredSlides: true,
loop: true,
autoplay: {
delay: 5000
},
navigation: {
prevEl: '.__rightBanner .swiper-prev',
nextEl: '.__rightBanner .swiper-next'
}
});
CSS์ :hover๋ ๋ง์ฐ์ค๊ฐ ์์ ์์ ์ฌ๋ผ๊ฐ ์๋ ๋์์ ์ํ๋ฅผ ์ ํํ๋ ๊ฐ์ ํด๋์ค์
๋๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ "์ค๋์ ์ง" ํด๋ก ์ฝ๋ฉ์์์ ํน์ ์์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ๋ฐ์ํ๋ ํจ๊ณผ๋ฅผ ๊ตฌํํ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
/* CSS :hover ์์ */
.banner .__rightBanner:hover img {
transform: scale(105%);
}
.banner .__rightBanner .swiper-prev,
.banner .__rightBanner .swiper-next {
/* ๋ค๋ฅธ ์คํ์ผ ์์ฑ๋ค ... */
visibility: hidden;
}
.banner .__rightBanner:hover .swiper-prev,
.banner .__rightBanner:hover .swiper-next {
visibility: visible;
}
์ด๋ฏธ์ง ํ๋ ํจ๊ณผ: :hover๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ๋์ ์ค๋ฅธ์ชฝ ๋ถ๋ถ(.banner .__rightBanner)์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ๊ทธ ์์ ์ด๋ฏธ์ง(img)์ transform ์์ฑ์ ์ ์ฉํ์ฌ 105%๋ก ํ๋ํ๋ ํจ๊ณผ๋ฅผ ์ค๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ๋ง์ฐ์ค๋ฅผ ๊ฐ์ ธ๋ค ๋์ ๋ ์ด๋ฏธ์ง์ ์์ฐ์ค๋ฌ์ด ํ๋ ํจ๊ณผ๋ฅผ ์ฃผ์ด ์๊ฐ์ ์ผ๋ก ๋ ํฅ๋ฏธ๋กญ๊ฒ ๋ง๋ญ๋๋ค.
์ด์ /๋ค์ ๋ฒํผ ๋ํ๋ด๊ธฐ: .swiper-prev์ .swiper-next๋ ๋ฐฐ๋ ์ค์์ดํผ์ ์ด์ ๊ณผ ๋ค์์ ๋ํ๋ด๋ ๋ฒํผ์
๋๋ค. ์ด๊ธฐ์๋ visibility: hidden;์ผ๋ก ์ค์ ํ์ฌ ํ๋ฉด์์ ์จ๊ฒจ์ ธ ์์ต๋๋ค. ๊ทธ๋ฌ๋ .banner .__rightBanner:hover๊ฐ ์ ์ฉ๋ ์ํ์์๋ ๋ง์ฐ์ค๋ฅผ ๊ฐ์ ธ๋ค ๋์ผ๋ฉด .swiper-prev์ .swiper-next์ visibility๋ฅผ visible๋ก ๋ณ๊ฒฝํ์ฌ ๋ฒํผ์ด ๋ํ๋๊ฒ ๋ฉ๋๋ค.
์ด์ฒ๋ผ :hover๋ฅผ ํ์ฉํ๋ฉด ์ฌ์ฉ์์ ์ํธ์์ฉ์ ๋ฐ๋ผ ๋์ ์ด๊ณ ๋ฉ์ง ํจ๊ณผ๋ฅผ ๋ถ์ฌํ ์ ์์ต๋๋ค.
position: absolute์ ๊ฐ์ CSS ์์ฑ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ์์ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ , ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ํ์ผ๋ก ๋์ํ๋๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค.
/* ์์: ์ด๋ฏธ์ง ์์ ํ
์คํธ ์ถ๊ฐ */
.image-container {
position: relative;
}
.image-text {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/* ์ถ๊ฐ์ ์ธ ์คํ์ผ๋ง ... */
}