๐ป Mercedes-benz coding
์ฌ์ดํธ๋ช
: Mercedes-benz
์ฌ์ฉ์ธ์ด : html / css / js
๋ถ๋ฅ : ์ ์ํ PC
๐ Mercedes-benz HOMEPAGE
https://www.mbusa.com/en/home
๐ ๊ธฐ๋ณธ์๋ฆฌ
div ๋๋ ์์์ ์ฌ๋ฌ ๋ฐ์ดํฐ ์์ฑ์ ํฌํจํ์ฌ ์ํ๋ ์์
์ ์ํ
: ์๋๋์์ ์ฐธ๊ณ (js์ ์ฉ)
https://youtu.be/XtEs0SZ_4Y0
๐๐ป ๊ตฌํํด์ผ๋๋ ๋ชจ์ต
ํด๋น์์ญ์ ์คํฌ๋กค์ด ๊ฐ์ง๋ ๋, ํ
์คํธ๊ฐ ์๋์์ ์๋ก ์ฌ๋ผ์ค๋ ํจ๊ณผ์ ์ฉ
โ๐ป ์ฝ๋์์ฑ
<div class="left-title pd-side" data-slideUp="true"> ๐๐ปdate์์ฑ ์ ์ฉ
<h2 class="title">
<span class="wrap">
<span class="line">The new 2024</span>
</span>
<span class="wrap">
<span class="line">Mercedes C63 S E</span>
</span>
</h2>
<div class="left-txt">
<p class="wrap">
<span class="line">ingenuity to pave the</span>
</p>
<p class="wrap">
<span class="line">way for unrelenting hybrid power. </span>
</p>
</div>
</div>
function lineEffect(){
$('[data-slideUp=true]').each(function(i,el){ ๐๐ป๋ชจ๋ ์์์์
child = $(this).find('.line'); ๐๐ป์ ์ฉ๋์์ฐพ๊ธฐ1
line = $(this).find('.border-line'); ๐๐ป์ ์ฉ๋์์ฐพ๊ธฐ2
gsap.to(line,{ ๐๐ปwidth:0 > width:100%
scrollTrigger:{
trigger:el,
start:"top 50%",
end:"bottom top",
// markers:true,
toggleActions: "restart none reverse none",
},
width:"100%",
stagger:0.1,
})
gsap.to(child,{ ๐๐ปtranslateY:100% > translateY(0%)
scrollTrigger:{
trigger:el,
start:"top 50%",
end:"bottom top",
toggleActions: "restart none reverse none",
},
transform: 'translateY(0%)',
stagger:0.1,
})
})
}
๊ณต์ฉ์ผ๋ก ์ ์ฉ๋๋ ์ ๋๋ฉ์ด์ ์ด๊ธฐ ๋๋ฌธ์, common.css์ ์ฝ๋์์ฑ
[data-slideUp=true] .wrap{overflow: hidden; display: block;}
[data-slideUp=true] .line{ display: inline-block; transform: translateY(100%);}
[data-slideUp=true] .border-line{position: absolute; top: 0; left: 0; width: 0%; height: 1px; background: #fff}
์ด๋ ๊ฒ ์์ฑ ํ, ์ ์ฉ์ํค๊ณ ์ถ์ ๋ถ๋ถ์ data-์์ฑ ์ถ๊ฐ
โ each(function(i,el) : object ์ ๋ฐฐ์ด ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋ ์ผ๋ฐ์ ์ธ ๋ฐ๋ณตํจ์ ์ฌ๊ธฐ์์ $.each() ๋ฉ์๋์ ์ฒซ๋ฒ์งธ ๋งค๊ฒจ๋ณ์๋ก ์์์ ์ ์ธํ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ.
1.๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ์ผ๋ฉด index๋ ๊ฐ์ฒด์ key(property)๋ฅผ ๊ฐ๋ฆฌํค๊ณ
2.el(ํด๋น์ ํ์์ ๊ฐ์ฒด)์ ํค์ ๊ฐ์ ๊ฐ์ง๊ณ ์ด
GSAP Callback (ํธ์ ์ ์ด - ์ฝ๋ฐฑ ํจ์)
: callback์ ์ด๋ฒคํธ์ ์ ๋ฌํด์ฃผ๋ ์ฝ๋ฐฑ ํจ์
GSAP๋ ํจ์๋ฅผ ํธ์ถํ๊ณ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ธฐ๋ ๊ณผ์ ์ ํธํ๊ฒ ์ ์ด๊ฐ๋ฅํจ
๐ onInit
: ์ ๋๋ฉ์ด์
(Tween)์ด ์์๋๊ธฐ ๋ฐ๋ก ์ ์ ํจ์๋ฅผ ํธ์ถ
onStart์ ๋ณ ์ฐจ์ด๊ฐ ์์ง๋ง, ๋น์ฐํ onStart ๋ณด๋ค ๋นจ๋ฆฌ ํธ์ถ๋จ
๐ onStart
: ์ ๋๋ฉ์ด์
(Tween)์ด ์์๋ ๋ ํธ์ถ
๐ onComplete
: ์ ๋๋ฉ์ด์
(Tween)์ด ์ข
๋ฃ๋์์ ๋ ํจ์๋ฅผ ํธ์ถ
GSAP ์ฝ๋ฐฑ ํจ์ ์ค ๊ฐ์ฅ ์ฌ์ฉ๋น๋๊ฐ ๋์
๐ Event(ํจ์) + Params
: ์ ๋๋ฉ์ด์
(Tween) ์ค ํธ์ถํ๊ณ ์ ํ๋ ํจ์ ๋ค์ Params ํ๋ผ๋ฏธํฐ๋ฅผ ๋ถ์ฌ ์ค ์ ์์
โ๐ป ์ฝ๋๋ฌธ๋ฒ
โ ๋ฐฐ์ด์ ํํ๋ก ๊ฐ์ ๋๊ฒจ์ฃผ์ด์ผ ํจ
โ ์๊ธฐ ์์ ์ ๊ฐ์ ๋๊ฒจ์ค ๋์๋ "{self}"๋ผ๊ณ ๊ฐ์ ์ฃผ์ด์ผ ํจ
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>GSAP - onComplete</title>
<script src="js/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/gsap.min.js"></script>
<script>
$(function(){
var outText = document.querySelector(".motion-message");
gsap.to('.tweenbox', 3, {
marginLeft: 300,
backgroundColor: '#ccc',
border: '2px solid #222',
borderRadius: 30,
onStart: motionMessage,
onStartParams: ['GSAP Tween ์ฝ๋ฐฑํจ์ ์์ ๋ฉ์์ง','START'],
onComplete: motionMessage,
onCompleteParams: ['GSAP Tween ์ฝ๋ฐฑํจ์ ์ข
๋ฃ ๋ฉ์์ง', 'END']
});
function motionMessage(message1, message2) {
outText.innerHTML += message1 + '-' + message2 + '<br>';
}
});
</script>
<style>
.tweenbox {width:100px;height:100px;border:2px solid crimson;background:lightcoral;box-sizing:border-box}
.motion-message{margin:30px 10px}
</style>
</head>
<body>
<div class="tweenbox"></div>
<div class="motion-message"></div>
</body>
</html>
๐onUpdate
: ์ ๋๋ฉ์ด์
(Tween)์ด ๊ณ์ ์งํ๋๋ ๋์ ํธ์ถ
๐onRepeat
: ์ ๋๋ฉ์ด์
(Tween)์ด ๋ฐ๋ณต๋ ๋๋ง๋ค ํธ์ถ
๐onReverseComplete
: ์ ๋๋ฉ์ด์
(Tween)์ด ๋ฐ์ (Reverse) ๋ ํ ๋ชจ์
์ด ์๋ฃ๋์์ ๋ ํธ์ถ
๐๐ป ๊ตฌํํด์ผ๋๋ ๋ชจ์ต
: ์คํฌ๋กค๊ฐ์ง์ ๋ฐ๋ผ, ์คํฌ๋กค์ด๋๋ฉด์+๋ฌธ๋จ๋ ๋์์ ๋์ด๊ฐ
โ๐ป ์ฝ๋์์ฑ
<div class="program-scroll"></div> ๐๐ป์คํฌ๋กค
<div class="program-area box01 active">
<div class="left"> ๐๐ป์ผ์ชฝ๋ฐ์ค
<div class="content"> ๐๐ป๋ด์ฉ
<div class="content-box pd-side">
<span class="number" data-color="point1">
<span>01</span>
</span>
<h3 data-color="point1">1. Multipoint Inspection</h3>
<p class="number-txt" data-color="point2">
A Mercedes-benz Approved (CPO) Vehicle has been
inspected in compliance with our 111-point checklist
to ensure they meet the minimum mechanical and
cosmetic standards and the vehicle meets the
preparation standards. All work has been performed by
Mercedes-benz trained technicians and only Genuine
Mercedes-benz parts have been used.
</p>
</div>
</div>
<div class="title" data-color="point1"> ๐๐ป๋ค์๋ฌธ๋จ
<div class="title-inner">
<p class="title-txt">2. CPO Limited Warranty Coverage</p>
</div>
</div>
</div>
<div class="right">๐๐ป๋น๋์ค์ฌ์
<video muted autoplay loop playsinline aria-label="benz-detail-video"><source src="./asset/images/benz.mp4" type="video/mp4"></video>
</div>
</div>
gsap.timeline({
defaults:{
ease:'none', ๐๐ปmotion์ ์๋ ๊ตด๊ณก์์ด์ง
},
scrollTrigger:{
trigger:'.sc-program',
start:"top top",
end:"+=300%", ๐๐ป์์ญ์ ๊ธธ๊ฒ๋ง๋ฌ(๊ฐ์ ์คํฌ๋กค:์์ญ3๋ฐฐ)
scrub:1, ๐๐ป์ ๋๋ฉ์ด์
์ ์ฌ์ฌ์ฉ ํ ์ ์๋ ๊ธฐ๋ฅ
pin:true, ๐๐ป์์ญ์ด ๋ฒ์ด๋๋๊ฒ์ ๋ฐฉ์ง
},
})
.to('.program-scroll',{
height:'100%'
})
โ๐ป์คํฌ๋กค
.addLabel('a')
.to(.box01),{opacity:1,visibility:'visible'},'a')
.to(.box01),{opacity:0,visibility:'hidden'},'a+=1')
.to(.box02),{opacity:1,visibility:'visible'},'a+=1')
.to(.box02),{opacity:0,visibility:'hidden},'a+=2')
.to(.box03),{opacity:1,visibility:'visible'},'a+=2')
โ๐ป์์ญ
๋ฌธ์ ์ :๋ฌธ๋จ์์ญ๊ณผ ์คํฌ๋กค์ด๋ฒคํธ๊ฐ ๋์์ ์ฉ์ด ์๋จ
onUpdate : function(self){
if(self.progress > 0.666)
$('.box03').addClass('active').siblings().removeClass('active')
}else if(self.progress > 0.333){
$('.box02').addClass('active').siblings().removeClass('active')
}else {
$('.box01').addClass('active').siblings().removeClass('active')
}
}
โ ์กฐ๊ฑด๋ฌธ์ ์ค๋, ์ญ์์ผ๋ก ์ค์ผํจ
: ์๋ฅผ๋ค์ด, 0.333๋ถํฐ ์ฃผ๊ฒ๋๋ฉด ์กฐ๊ฑด์ด ๋ง์กฑํ๋์๊ฐ ์กฐ๊ฑด๋น๊ต๊ฐ ์๋จ
๐ ๊ธฐ๋ณธ์๋ฆฌ
[์ฐธ๊ณ ์ฌ์ดํธ]
https://blog.edit.kr/entry/video-tag-%EB%A9%88%EC%B6%94%EA%B2%8C-%ED%95%98%EA%B8%B0-vdget0pause-%EC%B2%98%EB%A6%AC
๐๐ป ๊ตฌํํด์ผ๋๋ ๋ชจ์ต
mouseover -> ์ ํํ ๋น๋์ค๋ง์ฌ์
mouseleave -> ์ฌ์๋ฉ์ถค
โ๐ป ์ฝ๋์์ฑ
function autoVideo(){
$('.gallery-item').mouseover(function(){
$(this).find('video').get(0).play();
})
$('.gallery-item').mouseleave(function(){
$(this).find('video').get(0).pause();
})
}
โ ์ ํ์๋ฅผ ์ ํํ ์ ์ด์ค์ผ ์ ์ฒด์ ์ฉ์ด ์๋จ(์ฃผ์!)
๐๐ป ๊ตฌํํด์ผ๋๋ ๋ชจ์ต
โ๐ป ์ฝ๋์์ฑ
.sc-order .content .right-inner{display: grid; grid-template-columns: 60px 1fr; gap:30px; padding: 30px; align-items: center; border-radius: 10px; background: #060f10;}
.sc-order .right-inner .thumb-img{position: relative; grid-row-start: 1; grid-row-end: span 2; overflow: hidden; border-radius: 5px; width: 65px; height: 65px; justify-content: center; }
.sc-order .right-inner .thumb-img img{object-fit: cover; position: absolute; top: 0; left: 0;}
.sc-order .content .right-inner .txt1{font-size: 25px;}
.sc-order .content .right-inner .txt2{margin-top: -25px;}
.sc-order .right-inner .btn-order{grid-column-start: 1; grid-column-end: 3; height: 60px;border-radius: 50px; padding: 40px 0; display: inline-flex; justify-content: center; position: relative; align-items: center; font-weight: bold; text-align: center; background: #fff; color: var(--theme-color2);}
๐คฃ flex๋ position์ผ๋ก๋ ๊ตฌํ๊ฐ๋ฅํ๋ฐ, ์ grid๋ก ์ก์์๊น..