패럴랙스 효과
패럴랙스 이펙트 - 이질감 효과
사진이나 글씨를 고정시키지 않고 스크롤 위치값에 따라서 위치가 살짝 변해 이질감을 주는 효과를 만들어보겠습니다.
결과
HTML 작성
각각의 섹션을 만들고 보기 편하게 하기 위해서 스크롤 탑값을 보여주는 태그를 만들어줍니다.
소스 보기
<main id="parallax__cont">
<div id="contents">
<section id="section1" class="content__item">
<span class="content__item__num">01</span>
<h2 class="content__item__title">section1</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">산다는것 그것은 치열한 전투이다.</p>
</section>
<!-- //section1 -->
<section id="section2" class="content__item">
<span class="content__item__num">02</span>
<h2 class="content__item__title">section2</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">하루에 3시간을 걸으면 7년 후에 지구를 한바퀴 돌 수 있다.</p>
</section>
<!-- //section2 -->
<section id="section3" class="content__item">
<span class="content__item__num">03</span>
<h2 class="content__item__title">section3</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">내일은 내일의 태양이 뜬다.</p>
</section>
<!-- //section3 -->
<section id="section4" class="content__item">
<span class="content__item__num">04</span>
<h2 class="content__item__title">section4</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">배고픈 자 밥솥을 열어라.</p>
</section>
<!-- //section4 -->
<section id="section5" class="content__item">
<span class="content__item__num">05</span>
<h2 class="content__item__title">section5</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">그대 자신의 영혼을 탐구하라.</p>
</section>
<!-- //section5 -->
<section id="section6" class="content__item">
<span class="content__item__num">06</span>
<h2 class="content__item__title">section6</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">돈이 없는 것은 죄다.</p>
</section>
<!-- //section6 -->
<section id="section7" class="content__item">
<span class="content__item__num">07</span>
<h2 class="content__item__title">section7</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">무전 유죄, 유전 무죄</p>
</section>
<!-- //section7 -->
<section id="section8" class="content__item">
<span class="content__item__num">08</span>
<h2 class="content__item__title">section8</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">내 주머니의 푼돈이 남 주머니에 있는 거금보다 낫다.</p>
</section>
<!-- //section8 -->
<section id="section9" class="content__item">
<span class="content__item__num">09</span>
<h2 class="content__item__title">section9</h2>
<figure class="content__item__imgWrap">
<div class="content__item__img"></div>
</figure>
<p class="content__item__desc">최고에 도달하려면 최저에서 시작하라.</p>
</section>
<!-- //section9 -->
</div>
</main>
CSS 작성
CSS는 따로 설정한게 없습니다.
결과
/* parallax__nav */
#parallax__nav {
position: fixed;
right: 20px;
top: 20px;
z-index: 2000;
background-color: rgba(0, 0, 0, 0.4);
padding: 20px 30px;
border-radius: 50px;
transition: top 0.4s ease;
}
#parallax__nav li {
display: inline;
margin: 0 5px;
}
#parallax__nav li a {
display: inline-block;
height: 30px;
padding: 5px 20px;
text-align: center;
line-height: 30px;
}
#parallax__nav li.active a {
background: #fff;
color: #000;
border-radius: 20px;
box-sizing: content-box;
}
#parallax__cont {
max-width: 1600px;
width: 98%;
margin: 0 auto;
/* background-color: rgba(255, 255, 255, 0.1); */
}
.content__item {
width: 1000px;
max-width: 70vw;
margin: 30vw auto;
/* background-color: rgba(255, 255, 255, 0.3); */
text-align: left;
margin-right: 0;
position: relative;
padding-top: 8vw;
}
.content__item:nth-child(even) {
margin-left: 0;
text-align: right;
}
.content__item__num {
font-size: 35vw;
font-weight: 100;
font-family: 'Lato';
position: absolute;
left: -5vw;
top: -13vw;
opacity: 0.07;
z-index: -2;
}
.content__item:nth-child(even) .content__item__num {
left: auto;
right: -5vw;
}
.content__item__title {
font-weight: 400;
text-transform: capitalize;
}
.content__item__imgWrap {
width: 100%;
padding-bottom: 56.25%;
background: #000;
position: relative;
overflow: hidden;
z-index: -1;
}
.content__item__img {
position: absolute;
background: url(../assets/img/effect_bg19@2x.jpg);
background-repeat: no-repeat;
background-position: center center;
background-size: cover;
width: 110%;
height: 110%;
left: -5%;
top: -5%;
filter: saturate(0%);
/* transition: all 1s; */
}
.content__item:nth-child(1) .content__item__img {
background-image: url(../assets/img/effect_bg18@2x.jpg);
}
.content__item:nth-child(2) .content__item__img {
background-image: url(../assets/img/effect_bg19@2x.jpg);
}
.content__item:nth-child(3) .content__item__img {
background-image: url(../assets/img/effect_bg20@2x.jpg);
}
.content__item:nth-child(4) .content__item__img {
background-image: url(../assets/img/effect_bg17@2x.jpg);
}
.content__item:nth-child(5) .content__item__img {
background-image: url(../assets/img/effect_bg16@2x.jpg);
}
.content__item:nth-child(6) .content__item__img {
background-image: url(../assets/img/effect_bg15@2x.jpg);
}
.content__item:nth-child(7) .content__item__img {
background-image: url(../assets/img/effect_bg14@2x.jpg);
}
.content__item:nth-child(8) .content__item__img {
background-image: url(../assets/img/effect_bg13@2x.jpg);
}
.content__item:nth-child(9) .content__item__img {
background-image: url(../assets/img/effect_bg12@2x.jpg);
}
.content__item__desc {
font-size: 4vw;
line-height: 1.4;
margin-top: -4vw;
margin-left: -4vw;
word-break: keep-all;
}
.content__item:nth-child(even) .content__item__desc {
margin-left: auto;
margin-right: -4vw;
}
#parallax__info {
position: fixed;
left: 20px;
bottom: 20px;
z-index: 2000;
background-color: rgba(0,0,0,0.4);
color: #fff;
padding: 20px;
border-radius: 10px;
}
#parallax__info li,
.scroll {
line-height: 1.4;
}
@media (max-width: 800px) {
#parallax__cont {
margin-top: 70vw;
}
#parallax__nav {
padding: 10px;
right: auto;
left: 10px;
top: 50%;
transform: translateY(-50%);
border-radius: 5px;
background-color: rgba(0,0,0,0.8);
}
#parallax__nav li {
display: block;
margin: 5px;
}
#parallax__nav li a {
font-size: 14px;
padding: 5px;
border-radius: 5px;
height: auto;
line-height: 1;
}
#parallax__nav li.active a {
border-radius: 5px;
}
}
JS 작성
이번 스크립트도 어려운건 없습니다. 재귀함수를 이용해서 상시 측정할수있도록 전체적인 틀을 짜고, 스크롤 탑값을 구해서 각각 이미지,글씨들의 offsetTop값을 구한 뒤 빼줍니다. 같은 위치에 사진과 글씨들이 있으므로 0이 나옵니다.(오차가 있을수도 있음) 그 작은 값을 각각 이미지나 글씨에 translate값에 넣어주므로 사진도 같이 움직여서 이질감이 느껴지는 현상입니다.
전체 코드
function scroll(){
let scrollTop = window.pageYOffset || document.documentElement.scrollTop; //페이지의 스크롤TOP값을 구한다.
document.querySelector("#parallax__info span").innerText = Math.ceil(scrollTop); //구한 스크롤TOP값을 미리 만들어놓은 span태그에 ceil(올림)으로 값을 넣습니다.
document.querySelectorAll(".content__item").forEach(item => {
const target1 = item.querySelector(".content__item__img"); //변수 선언
const target2 = item.querySelector(".content__item__desc"); //변수 선언
const target3 = item.querySelector(".content__item__num"); //변수 선언
let offset1 = (scrollTop - item.offsetTop) * 0.1 ; //오차가 있을수 있으므로 0.1 곱하였음
let offset2 = (scrollTop - item.offsetTop) * 0.15 ; //뒤에 숫자가 클수록 값이 커지므로 이동하는게 더 크게 보인다.
let offset3 = (scrollTop - item.offsetTop) * 0.2 ;
// target1.style.transform = `translateY(${offset1}px)`; //이미지에 offset1 값을 translateY 에 넣기
// target2.style.transform = `translateX(${offset2}px)`;
gsap.to(target1, {duration: .3, y: offset1, ease: "power4.out"}); //gsap 사용
gsap.to(target2, {duration: .3, y: offset2});
gsap.to(target3, {duration: .3, y: offset3, ease: "expo out"});
});
requestAnimationFrame(scroll); //재귀함수 스크롤 할 때 마다 발생
}
scroll();
gsap 이용한 스크립트
gsap를 이용해 스타일 CSS를 사용한거보다 조금 더 부드럽게 사용할 수 있습니다.
gsap.to(target1, {duration: .3, y: offset1, ease: "power4.out"});
gsap.to(target2, {duration: .3, y: offset2});
gsap.to(target3, {duration: .3, y: offset3, ease: "expo out"});
'Javascript_Effect' 카테고리의 다른 글
마우스 이펙트 - 이미지 효과 (7) | 2022.09.22 |
---|---|
마우스 이펙트 - 조명 효과 (5) | 2022.09.22 |
슬라이드 이펙트 - 이미지 슬라이드(버튼) (3) | 2022.09.18 |
마우스 이펙트 - 마우스 따라다니기(GSAP) (2) | 2022.09.18 |
패럴랙스 이펙트 - 나타나기 (2) | 2022.09.18 |
댓글