[Mercedes-benz]

๋…•์ดยท2022๋…„ 11์›” 15์ผ
0

Portfolio

๋ชฉ๋ก ๋ณด๊ธฐ
4/4
post-thumbnail


๐Ÿ’ป Mercedes-benz coding

์‚ฌ์ดํŠธ๋ช… : Mercedes-benz
์‚ฌ์šฉ์–ธ์–ด : html / css / js
๋ถ„๋ฅ˜ : ์ ์‘ํ˜• PC

๐ŸŽˆ Mercedes-benz HOMEPAGE
https://www.mbusa.com/en/home

Check Point

  • data-์†์„ฑ ํƒœ๊ทธ์ปจํŠธ๋กค
  • gsap ์ฝœ๋ฐฑํ•จ์ˆ˜

1. data-์†์„ฑ ํƒœ๊ทธ์ปจํŠธ๋กค

๐ŸŽˆ ๊ธฐ๋ณธ์›๋ฆฌ
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>
  1. line-effect๋ฅผ ์ ์šฉ -> data-slideUp="true"
    ์ „์ฒด๋ฅผ wrap์œผ๋กœ ๊ฐ์‹ธ์ฃผ๊ณ , ์ ์šฉํ•  text์— line์ด๋ผ๋Š” ํด๋ž˜์Šค๋ช…์„ ์ฃผ์—ˆ๋‹ค

    2.js๋กœ ์ปจํŠธ๋กค
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(ํ•ด๋‹น์„ ํƒ์ž์˜ ๊ฐ์ฒด)์€ ํ‚ค์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ ์˜ด

2. gsap ์ฝœ๋ฐฑํ•จ์ˆ˜

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>

  1. gsap.timeline์„ค์ •
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')

โ˜๐Ÿป์˜์—ญ
๋ฌธ์ œ์ :๋ฌธ๋‹จ์˜์—ญ๊ณผ ์Šคํฌ๋กค์ด๋ฒคํŠธ๊ฐ€ ๋™์‹œ์ ์šฉ์ด ์•ˆ๋จ

  1. gsap - onUpdate
    [์ฐธ๊ณ ์‚ฌ์ดํŠธ]
    https://greensock.com/docs/v3/Plugins/ScrollTrigger/progress
    ๐ŸŽˆ๊ธฐ๋ณธ์›๋ฆฌ
    onUpdate: self => console.log("progress:", self.progress)

    โ˜๐Ÿปconsole๋กœ ์ฐ์—ˆ์„๋•Œ
    => : function๊ณผ ๊ฐ™์Œ
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๋ถ€ํ„ฐ ์ฃผ๊ฒŒ๋˜๋ฉด ์กฐ๊ฑด์ด ๋งŒ์กฑํ•˜๋Š”์ˆœ๊ฐ„ ์กฐ๊ฑด๋น„๊ต๊ฐ€ ์•ˆ๋จ

Issue Point

  • video-control
  • grid๋กœ ์˜์—ญ์žก๊ธฐ

1. video-control

๐ŸŽˆ ๊ธฐ๋ณธ์›๋ฆฌ
[์ฐธ๊ณ ์‚ฌ์ดํŠธ]
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(); 
    })
}

โœ” ์„ ํƒ์ž๋ฅผ ์ •ํ™•ํžˆ ์ ์–ด์ค˜์•ผ ์ „์ฒด์ ์šฉ์ด ์•ˆ๋จ(์ฃผ์˜!)

2. grid๋กœ ์˜์—ญ์žก๊ธฐ

๐Ÿ‘‡๐Ÿป ๊ตฌํ˜„ํ•ด์•ผ๋˜๋Š” ๋ชจ์Šต

โœ๐Ÿป ์ฝ”๋“œ์ž‘์„ฑ

.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๋กœ ์žก์•˜์„๊นŒ..

profile
ๅ…‰่€Œไธ่€€ :) ํผ๋ธ”๋ฆฌ์‹ฑ-ing

0๊ฐœ์˜ ๋Œ“๊ธ€