일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 홈페이지제작
- #홈페이지
- #happycgi
- 사이트제작
- #뉴스
- 홈페이지
- 웹솔루션
- #image
- #솔루션
- #CSS
- jquery
- #이미지
- 게시판
- 솔루션
- #jQuery
- CGIMALL
- happycgi
- #웹솔루션
- 해피CGI
- CSS
- #해피CGI
- #쇼핑몰
- #홈페이지제작
- 해피씨지아이
- #cgimall
- php
- javascript
- 이미지
- #동영상
- #업종별
- Today
- Total
웹솔루션개발 25년 노하우! 해피CGI의 모든것
[해피CGI][cgimall] 마우스 오버 패럴랙스 슬라이더(React Slider w/ Hover Effect) 본문
[해피CGI][cgimall] 마우스 오버 패럴랙스 슬라이더(React Slider w/ Hover Effect)
해피CGI윤실장 2025. 9. 22. 09:25이 예제는 React로 제작된 이미지 슬라이더로, 마우스 움직임에 따라 패럴랙스 효과가 적용되어 생동감 있는 화면 전환을 제공합니다.
슬라이드는 버튼 클릭이나 이미지 선택으로 이동할 수 있으며, 중앙에 위치한 슬라이드가 강조되어 자연스러운 시각적 집중을 유도합니다.
마우스 오버 시 이미지와 텍스트가 미묘하게 이동하며, 사용자 입력에 반응하는 인터랙티브한 경험을 제공합니다.
CSS 트랜지션과 애니메이션을 활용하여 부드럽고 매끄러운 전환 효과를 구현했습니다.

HTML 구조
#app
CSS 소스
@import url('https://fonts.googleapis.com/css?family=Playfair+Display:700|IBM+Plex+Sans:500&display=swap');
:root {
--color-primary: #6B7A8F;
--color-secondary: #101118;
--color-accent: #1D1F2F;
--color-focus: #6D64F7;
--base-duration: 600ms;
--base-ease: cubic-bezier(0.25, 0.46, 0.45, 0.84);
}
// =========================
// Global
// =========================
*, *:before, *:after {
box-sizing: border-box;
}
html, body {
height: 100%;
}
body {
font-family: 'IBM Plex Sans', sans-serif;
background-color: var(--color-secondary);
}
#app {
align-items: center;
display: flex;
height: 100%;
justify-content: center;
overflow-x: hidden;
width: 100%;
}
h1, h2, h3 {
font-family: 'Playfair Display', serif;
}
.visuallyhidden {
clip: rect(1px, 1px, 1px, 1px);
height: 1px;
overflow: hidden;
position: absolute !important;
white-space: nowrap;
width: 1px;
}
// =========================
// Icons
// =========================
.icon {
fill: var(--color-primary);
width: 100%;
}
// =========================
// Buttons
// =========================
.btn {
background-color: var(--color-primary);
border: none;
border-radius: 0.125rem;
color: white;
cursor: pointer;
font-family: inherit;
font-size: inherit;
padding: 1rem 2.5rem 1.125rem;
&:focus {
outline-color: var(--color-focus);
outline-offset: 2px;
outline-style: solid;
outline-width: 3px;
}
&:active {
transform: translateY(1px);
}
}
// =========================
// Slider controls
// =========================
.slider__controls {
display: flex;
justify-content: center;
position: absolute;
top: calc(100% + 1rem);
width: 100%;
.btn {
--size: 3rem;
align-items: center;
background-color: transparent;
border: 3px solid transparent;
border-radius: 100%;
display: flex;
height: var(--size);
padding: 0;
width: var(--size);
&:focus {
border-color: var(--color-focus);
outline: none;
}
&--previous > * {
transform: rotate(180deg);
}
}
}
// =========================
// Slider
// =========================
.slider {
--slide-size: 70vmin;
--slide-margin: 4vmin;
height: var(--slide-size);
margin: 0 auto;
position: relative;
width: var(--slide-size);
}
.slider__wrapper {
display: flex;
margin: 0 calc(var(--slide-margin) * -1);
position: absolute;
transition: transform var(--base-duration) cubic-bezier(0.25, 1, 0.35, 1);
}
// =========================
// Slide
// =========================
.slide {
align-items: center;
color: white;
display: flex;
flex: 1;
flex-direction: column;
height: var(--slide-size);
justify-content: center;
margin: 0 var(--slide-margin);
opacity: 0.25;
position: relative;
text-align: center;
transition:
opacity calc(var(--base-duration) / 2) var(--base-ease),
transform calc(var(--base-duration) / 2) var(--base-ease);
width: var(--slide-size);
z-index: 1;
&--previous,
&--next {
&:hover {
opacity: 0.5;
}
}
&--previous {
cursor: w-resize;
&:hover {
transform: translateX(2%);
}
}
&--next {
cursor: e-resize;
&:hover {
transform: translateX(-2%);
}
}
}
.slide--current {
--x: 0;
--y: 0;
--d: 50;
opacity: 1;
pointer-events: auto;
user-select: auto;
@media (hover: hover) {
&:hover .slide__image-wrapper {
transform:
scale(1.025)
translate(
calc(var(--x) / var(--d) * 1px),
calc(var(--y) / var(--d) * 1px)
);
}
}
}
.slide__image-wrapper {
background-color: var(--color-accent);
border-radius: 1%;
height: 100%;
left: 0%;
overflow: hidden;
position: absolute;
top: 0%;
transition: transform calc(var(--base-duration) / 4) var(--base-ease);
width: 100%;
}
.slide__image {
--d: 20;
height: 110%;
left: -5%;
object-fit: cover;
opacity: 0;
pointer-events: none;
position: absolute;
top: -5%;
transition:
opacity var(--base-duration) var(--base-ease),
transform var(--base-duration) var(--base-ease);
user-select: none;
width: 110%;
@media (hover: hover) {
.slide--current & {
transform:
translate(
calc(var(--x) / var(--d) * 1px),
calc(var(--y) / var(--d) * 1px)
);
}
}
}
.slide__headline {
font-size: 8vmin;
font-weight: 600;
position: relative;
}
.slide__content {
--d: 60;
opacity: 0;
padding: 4vmin;
position: relative;
transition: transform var(--base-duration) var(--base-ease);
visibility: hidden;
.slide--current & {
animation: fade-in calc(var(--base-duration) / 2) var(--base-ease) forwards;
visibility: visible;
@media (hover: hover) {
transform:
translate(
calc(var(--x) / var(--d) * -1px),
calc(var(--y) / var(--d) * -1px)
);
}
}
> * + * {
margin-top: 2rem;
}
}
// =========================
// Animations
// =========================
@keyframes fade-in {
from { opacity: 0 }
to { opacity: 1 }
}
JS 소스
const slideData = [
{
index: 0,
headline: 'New Fashion Apparel',
button: 'Shop now',
src: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/225363/fashion.jpg'
},
{
index: 1,
headline: 'In The Wilderness',
button: 'Book travel',
src: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/225363/forest.jpg'
},
{
index: 2,
headline: 'For Your Current Mood',
button: 'Listen',
src: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/225363/guitar.jpg'
},
{
index: 3,
headline: 'Focus On The Writing',
button: 'Get Focused',
src: 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/225363/typewriter.jpg'
}
]
첨부파일 react-slider-w-hover-effect.zip에서 script.js 참조해주세요
'웹프로그램밍 자료실 > HTML 자료' 카테고리의 다른 글
CSS를 이용한 3D 북 애니메이션 3D book (0) | 2025.10.02 |
---|---|
[해피CGI][cgimall] 이미지 오버하면 변경되는 카드 뉴스 스타일 Player/User Cards (0) | 2025.10.01 |
[해피CGI][cgimall] 스택형 카드 스크롤 애니메이션 (Stacking card) (0) | 2025.09.19 |
[해피CGI][cgimall] Animated CSS Gradient Border 애니메이션 CSS 그라데이션 테두리 (0) | 2025.09.18 |
[해피CGI][cgimall] wavy background 물결 모양 배경 css (0) | 2025.09.17 |