๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/JavaScript jQuery

[JavaScript / jQuery] ์Šคํฌ๋กค ์œ„์น˜์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ : Apple Music UI ๋งŒ๋“ค๊ธฐ

by Connecting-the-dots 2022. 3. 9.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ฒœ์ฒœํžˆ ์Šคํฌ๋กคํ•˜๋ฉด์„œ GIF ์บก์ฒ˜๋ฅผ ํ•ด๋ณด์•˜๋‹ค.
  • ๊ฐœ์ธ์ ์œผ๋กœ ์•„๋ž˜์— ์œ„์น˜ํ•˜๋˜ ๋‹ค์Œ ์‚ฌ์ง„์ด ์˜ฌ๋ผ์˜ค๋ฉด์„œ ๊ธฐ์กด์˜ ์‚ฌ์ง„์ด ํ๋ ค์ง€๋ฉด์„œ ์ž‘์•„์ง€๋‹ค ๋‹ค์Œ ์‚ฌ์ง„์— ๊ฐ€๋ ค์ง€๋Š”๋ฐ, ์ด ํšจ๊ณผ๊ฐ€ ๋„ˆ๋ฌด ์˜ˆ์œ๋ฐ ๋งŒ๋“œ๋Š”๋ฐ ๊ฝค๋‚˜ ํž˜๋“ค์—ˆ๋˜ ๊ฑฐ ๊ฐ™๋‹ค.

๐Ÿ’œ HTML

<div class="card-background">
    <div class="card-box">
      <img src="./img/card1.png">
    </div>
    <div class="card-box">
      <img src="./img/card2.png">
    </div>
    <div class="card-box">
      <img src="./img/card3.png">
    </div>
  </div>
  • ์ผ๋‹จ ์นด๋“œ์ด๋ฏธ์ง€๋ฅผ 3๊ฐœ ์ค€๋น„ํ•ด์„œ, card-box ํด๋ž˜์Šค์— ๊ฐ๊ฐ ๋‹ด์•„์ค€๋‹ค.

๐Ÿ’œ CSS

.card-background {
  height: 3000px;
  margin-top: 370px;
}

.card-box img {
  display: block;
  margin: auto;
  max-width: 80%;
}

.card-box {
  position: sticky;
  top: 370px;
  margin-top: 370px;
  transition: all 0.3s;
}
  • ์Šคํฌ๋กค์„ ๊ฝค ํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ฐฐ๊ฒฝ์˜ ๋†’์ด๋Š” 3000px ์ •๋„๋กœ ์žก์•„์ฃผ๊ณ  ํ™”๋ฉด ๊ฐ€์šด๋ฐ์ฏค ๋‚˜์˜ค๋„๋ก margin-top ์— ์ ๋‹นํžˆ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  card-box ํด๋ž˜์Šค์— position : sticky ์†์„ฑ์„ ๋„ฃ์–ด์ค€ ํ›„, top ์„ back-ground ์˜ margin-top ์˜ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค. (์Šคํฌ๋กค์„ ๋๋ƒˆ์„ ๋•Œ ์˜จ์ „ํžˆ ์ด๋ฏธ์ง€๊ฐ€ ๊ฒน์ณ์ง€๋„๋ก!)
  • ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ ์ด๋ฏธ์ง€๊ฐ€ ํ™”๋ฉด์ƒ์— ๋ณด์ด์ง€ ์•Š๋„๋ก margin-top ๋„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. css ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ margin ๊ณผ margin-top ์˜ ๊ฐ’์„ ์ ๋‹นํžˆ ๋งž์ถฐ์ฃผ๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค. (๊ทธ๋ž˜์•ผ ํ™”๋ฉด์ƒ์—์„œ์˜ ์œ„์น˜๊ฐ€ ์ ๋‹นํ•˜๊ณ  ๋‹ค์Œ ์ด๋ฏธ์ง€๊ฐ€ ํ™”๋ฉด์ƒ์— ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—..)
  • ๊ทธ ๋‹ค์Œ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„œ์„œํžˆ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๊ฐ€ ์ƒ๊ธฐ๋„๋ก transition ์†์„ฑ๋„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

๐Ÿ’œ JavaScript

$(window).scroll(function(){

    var h = $(window).scrollTop(); // ์Šคํฌ๋กค ์œ„์น˜

    // 1. opacity ์กฐ์ •    
    // 700~1000๊นŒ์ง€ ์Šคํฌ๋กค๋ฐ”๋ฅผ ๋‚ด๋ฆฌ๋ฉด, 
    // ์ฒซ๋ฒˆ์งธ ์นด๋“œ์˜ opacity ๋ฅผ 1~0 ์œผ๋กœ ์„œ์„œํžˆ ๋ณ€๊ฒฝํ•œ๋‹ค.

    var y1 = (1/-300) * h + (1000/300);
    var y2 = (1/-300) * h + (1950/300);

    $('.card-box').eq(0).css('opacity', y1);
    $('.card-box').eq(1).css('opacity', y2);

    // 2. scale ์กฐ์ •
    // 700~1000๊นŒ์ง€ ์Šคํฌ๋กค๋ฐ”๋ฅผ ๋‚ด๋ฆฌ๋ฉด, 
    // ์ฒซ๋ฒˆ์งธ ์นด๋“œ์˜ scale ๋ฅผ 1~0.8 ์œผ๋กœ ์„œ์„œํžˆ ๋ณ€๊ฒฝํ•œ๋‹ค.


    var s1 = (-2/3000) * h + (44/30);
    var s2 = (-2/3000) * h + (630/300);

    if(h >= 700 && h <= 1000) {
        $('.card-box').eq(0).css('transform', `scale(${s1})`);
    } else{
        $('.card-box').eq(0).css('transform', `scale(1)`);
        if(h >= 1650 && h <= 1950){
            $('.card-box').eq(1).css('transform', `scale(${s2})`);
        } else {
            $('.card-box').eq(1).css('transform', `scale(1)`);
        }
    }
})
  • JavaScript ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๋ถ€๋ถ„์—์„œ ์ž ๊น ์ˆ˜ํ•™์‹œ๊ฐ„์ด ๋˜์—ˆ๋‹ค.
  • ๋จผ์ €, ์ด๋ฏธ์ง€๊ฐ€ ํŠน์ • ์œ„์น˜์— ์™”์„ ๋•Œ ํ๋ ค์ง€๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ ์–ด๋””์ฏค ์™”์„ ๋•Œ opacity ๊ฐ€ 1์ด๊ณ , ์–ด๋””์ฏค ์™”์„ ๋•Œ 0์ด ๋˜๋Š”์ง€ ๋Œ€๋žต์ ์œผ๋กœ ์ •ํ•ด์•ผ ํ•œ๋‹ค.
      (์ด ๋•Œ, ์ฝ˜์†”์—๋‹ค๊ฐ€ scrollY ๋‚˜ $(window).scrollTop() ์„ ์ฐ์–ด๋ณด๋ฉด ๋Œ€์ถฉ ์œ„์น˜ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.)
    • ๋‚ด๊ฐ€ ์ •ํ•œ ์œ„์น˜๋Š” ์ฒซ๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋ฆด ๋•Œ์—๋Š” 700~1000, ๋‘๋ฒˆ์งธ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋ฆด ๋•Œ์—๋Š” 1650~1950 ์ด์—ˆ๋‹ค.
    • ์ด์ œ ์ด ๊ฐ’๋“ค์„ ์ด์šฉํ•ด์„œ 1์ฐจ ํ•จ์ˆ˜ ๊ณต์‹(y=ax+b)์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค. (...์ด๊ฒƒ๊นŒ์ง€๋Š” ์—ฌ๊ธฐ์— ์„ค๋ช…์„ ์ ๊ธด ํž˜๋“ค๋‹ค.)
    • ํ•จ์ˆ˜๊ฐ€ ์™„์„ฑ๋˜๋ฉด jQuery ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด์„œ, ์Šคํฌ๋กค์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜๋Š” opacity ๊ฐ’์„ css ์— ์ ์šฉ๋˜๋„๋ก ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ํ๋ ค์ง€๋Š” ๋™์‹œ์— ์ ์  ์ž‘์•„์ง€๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ๋ฐฉ๋ฒ•์€ ํ๋ ค์ง€๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•œ๋ฐ if-else ๋ฌธ์ด ์ข€ ๋ณต์žกํ•˜๋‹ค. (๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒŒ ๋„ˆ๋ฌด ํž˜๋“ค์—ˆ๋‹ค ใ…œใ…œ)
    • ๊ธฐ๋ณธ์ ์ธ ํฌ๊ธฐ๊ฐ€ 1์ด๋ผ๋ฉด ์ตœ์ข…์ ์œผ๋กœ ์ž‘์•„์ง„ ํฌ๊ธฐ๋Š” 0.8๋กœ ์ •ํ•˜๊ณ , 1์ฐจ ํ•จ์ˆ˜ ๊ณต์‹์„ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
    • ํ•จ์ˆ˜๊ฐ€ ์™„์„ฑ๋˜๋ฉด jQuery ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด์„œ, ์Šคํฌ๋กค์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜๋Š” transform ์†์„ฑ์˜ scale ๊ฐ’์„ css ์— ์ ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
    • ๋‹ค๋งŒ, ์ด ๋ถ€๋ถ„์ด opacity ์™€ ๋‹ฌ๋ฆฌ if-else ๋ฌธ์ด ์ ์šฉ๋œ ์ด์œ ๋Š” opactiy ์˜ ๊ฒฝ์šฐ ์†์„ฑ๊ฐ’์ด 0~1 ๋กœ ํ™•์ •์ ์ด๋ผ ์ด ๊ฐ’ ์‚ฌ์ด๋ฅผ ๋ฒ—์–ด๋‚˜๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ฐ˜๋ฉด, scale ์˜ ๊ฒฝ์šฐ์—๋Š” 1, 2, 3, ๋“ฑ๋“ฑ ๊ฐ’์˜ ๋ฒ”์œ„๊ฐ€ ํ›จ์”ฌ ๋„“๊ณ  ์ด์— ๋งž์ถฐ ๋ฐ˜์˜์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.
    • ๊ทธ๋ž˜์„œ ์ฒ˜์Œ ์ƒ๊ฐํ–ˆ๋˜ ๊ฑด while ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ scale ์˜ ๋ฒ”์œ„๋ฅผ 0.8~1 ๋กœ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ ์ด ๋ฐฉ๋ฒ•๋ณด๋‹ค๋Š” if-else ๋ฌธ์ด ์ฝ”๋“œ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค.
    • ๊ทธ๋ž˜์„œ ์Šคํฌ๋กค์˜ ์œ„์น˜๊ฐ€ 700~1000 ์ผ ๋•Œ๋Š” ์ฒซ๋ฒˆ์งธ ์นด๋“œ ์ด๋ฏธ์ง€๋งŒ scale ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค.
    • ์ด์™ธ์˜ ์Šคํฌ๋กค ์œ„์น˜์ผ ๋•Œ์—๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋‚˜๋‰˜๋Š”๋ฐ,
      • ์ฒซ๋ฒˆ์งธ ์นด๋“œ ์ด๋ฏธ์ง€๋Š” ํฌ๊ธฐ๊ฐ€ ๋” ์ปค์ง€๊ฑฐ๋‚˜ ์ž‘์•„์ง€์ง€ ์•Š๊ฒŒ scale ๊ฐ’์„ 1๋กœ ๊ณ ์ •ํ–ˆ๋‹ค. (๊ณ ์ •ํ•ด๋‘์ง€ ์•Š์œผ๋ฉด ์Šคํฌ๋กคํ•  ๋•Œ ํฌ๊ธฐ๊ฐ€ 0.8~1 ์„ ๋ฒ—์–ด๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ..)
      • ๋‘๋ฒˆ์งธ ์นด๋“œ ์ด๋ฏธ์ง€๋Š” ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ 1650~1950 ์ผ ๋•Œ scale ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ณ , ๊ทธ ์ด์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ์ฒซ๋ฒˆ์งธ ์นด๋“œ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ํฌ๊ธฐ๊ฐ€ ๋” ์ปค์ง€๊ฑฐ๋‚˜ ์ž‘์•„์ง€์ง€ ์•Š๊ฒŒ scale ๊ฐ’์„ 1๋กœ ๊ณ ์ •ํ–ˆ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๋‹ˆ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋‹ค๊ฐ€ ์˜ฌ๋ ธ์„ ๋•Œ์—๋„ ์ด์ƒํ•˜๊ฒŒ ํฌ๊ธฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ํ˜„์ƒ์ด ์—†์–ด์กŒ๋‹ค.
728x90
๋ฐ˜์‘ํ˜•