๐Ÿ‘โ€๐Ÿ—จjavascript(์• ๋‹ˆ๋ฉ”์ด์…˜(apple music ui), ํด๋ฆญํšŸ์ˆ˜, setTimeout, setInterval ํ•จ์ˆ˜, includes ํ•จ์ˆ˜, ์ •๊ทœ์‹(๋ฌธ์ž๊ฒ€์‚ฌ))

stayby94ยท2023๋…„ 8์›” 1์ผ

JS๋ฌธ๋ฒ•

๋ชฉ๋ก ๋ณด๊ธฐ
6/15

setTimeout() ํ•จ์ˆ˜

  • x์ดˆ ํ›„ ()์•ˆ์— ์ฝ”๋“œ ์‹คํ–‰.
  • setTimeout(function(){
    ์‹คํ–‰ํ•  ์ฝ”๋“œ}, ms)
  • ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ž๋ฆฌ์—๋Š” ๋งŒ๋“ค์–ด๋‘” ํ•จ์ˆ˜๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ.

setInterval() ํ•จ์ˆ˜

  • x์ดˆ๋งˆ๋‹ค ์ฝ”๋“œ์‹คํ–‰
  • setInterval(function(){
    ์‹คํ–‰ํ•  ์ฝ”๋“œ}, ms)

์˜ˆ์‹œ) 1์ดˆ๋งˆ๋‹ค 5๋ผ๋Š” ๋ฌธ์ž๋ฅผ 1๊ฐ์†Œ์‹œํ‚ค๊ณ  0์ด ๋˜๋ฉด ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ

<div class="alert alert-danger">
   5์ดˆ ์ด๋‚ด ๊ตฌ๋งค ์‹œ ์‚ฌ์€ํ’ˆ ์ฆ์ •!!!
</div>
   <script>
     let count = 5;
     setInterval(function(){
       --count
     if(count<=0){
       document.querySelector('.alert-danger').style.display = 'none'
      } else{
       document.querySelector('.alert-danger').innerText = `${count}์ดˆ ์ด๋‚ด ๊ตฌ๋งค ์‚ฌ์€ํ’ˆ ์ฆ์ •!`
      }
      }, 1000)
  • ์ดˆ๊ธฐ๊ฐ’ 5๋ฅผ count๋ผ๋Š” ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  setInterval ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด 1์ดˆ๋งˆ๋‹ค 1์”ฉ ๊ฐ์†Œํ•˜๊ณ 
  • ๋งŒ์•ฝ ๋ณ€์ˆ˜ count์˜ ๊ฐ’์ด 0์ด ๋˜๋ฉด alert-danger๋ผ๋Š” ํด๋ž˜์Šค๋ช…์˜ <div>์˜ display๋ฅผ none์œผ๋กœ ๋ณ€๊ฒฝ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ${count}์ดˆ ์ด๋‚ด ๊ตฌ๋งค ์‚ฌ์€ํ’ˆ ์ฆ์ •!์ด๋ผ๋Š” ํ…์ŠคํŠธ๋ฅผ ๋„ฃ์–ด์คŒ.

ํด๋ฆญํšŸ์ˆ˜๋ฅผ ๊ธฐ๋กํ•ด๋ณด์ž!!

  • ๋ณ€์ˆ˜์— +1 ํ•˜๋Š” ๋ฐฉ๋ฒ•

    • ๋ณ€์ˆ˜++
      ๋ณ€์ˆ˜+=1
      ๋ณ€์ˆ˜=๋ณ€์ˆ˜+1
  • badge ํด๋ฆญ ํšŸ์ˆ˜๊ฐ€ ์ง์ˆ˜์ด๋ฉด light, ํ™€์ˆ˜์ด๋ฉด dark๋ฅผ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค๋ฉด??

    <script>
        var count = 0;
        document.querySelector('.badge').addEventListener('click', function(){
            count += 1;
            if(count%2==0){
                document.querySelector('.badge').innerHTML = "Light ๐Ÿ”„"
            } else{
                document.querySelector('.badge').innerHTML = "Dark ๐Ÿ”„"
            }
        })
  • ์ดˆ๊ธฐ ๊ฐ’ 0์„ ๋ณ€์ˆ˜ count์— ํ• ๋‹นํ•ด์ฃผ๊ณ  badge๋ผ๋Š” ํด๋ž˜์Šค๋ช…์„ ๊ฐ€์ง„ button์— ํด๋ฆญ์ด๋ฒคํŠธ๋ฅผ ๋ถ€์—ฌํ•จ
  • ๊ทธ ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜๋ฉด count๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š”๋ฐ
  • ๋งŒ์•ฝ count๋ฅผ 2๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ ๋‚˜๋จธ์ง€๊ฐ€ 0์ด๋ผ๋ฉด Light๋ผ๋Š” ํ…์ŠคํŠธ๊ฐ€ ๋ณด์ด๊ณ 
  • ๋‚˜๋จธ์ง€๊ฐ€ 0์ด ์•„๋‹ ๋•Œ๋Š” Dark๋ผ๋Š” ํ…์ŠคํŠธ๊ฐ€ ๋ณด์ธ๋‹ค!

** ๋ชจ๋“  ํ™€์ˆ˜๋Š” 2๋กœ ๋‚˜๋ˆด์„๋•Œ ๋‚˜๋จธ์ง€๊ฐ€ 1์ด๊ณ  ์ง์ˆ˜๋Š” ๋‚˜๋จธ์ง€๊ฐ€ 0.

includes() ํ•จ์ˆ˜

  • ์ด ํ•จ์ˆ˜๋Š” ๋ฌธ์ž๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•

    • ์˜ˆ๋ฅผ๋“ค์–ด 'abc'.includes('a')์˜ ๊ฒฐ๊ณผ๋Š” true์ด๊ณ 
      'abc'.includes('n')์˜ ๊ฒฐ๊ณผ๋Š” false์ž„.
  • ์ด ํ•จ์ˆ˜์˜ ํ•œ๊ณ„ : ํ•œ๊ธ€์ด ๋“ค์–ด์žˆ๋Š”์ง€, ์˜์–ด๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š”์ง€ ๋“ฑ์˜ ๊ธฐ๋Šฅ์€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Œ.. ๊ทธ๋ž˜์„œ ์ •๊ทœ์‹์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅํ•จ.

    ์ •๊ทœ์‹

  • ์ •๊ทœ์‹์„ ์“ฐ๋ฉด ๋ฌธ์ž๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•จ.

    • /a/.test('abcde') โ†’ a๋ผ๋Š” ๋ฌธ์ž๊ฐ€ abcde์•ˆ์— ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์ค˜~
      /a/ โ†’ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•  ๋ฌธ์ž
      .test('abcde') โ†’ ๊ฒ€์‚ฌ๋‹นํ•  ๋ฌธ์ž
  • ์žฅ์ !

      1. ๋ฌธ์ž ๋ฒ”์œ„ ์ง€์ •๊ฐ€๋Šฅ
      • ๋งŒ์•ฝ /[a-z]/.test('abcde') ๋ผ๊ณ  ์“ฐ๋ฉด a~z ์ค‘ ์•„๋ฌด๊ธ€์ž 1๊ฐœ๊ฐ€ abcde์— ๋“ค์–ด์žˆ๋ƒ๋ผ๋Š” ๋œป.
      • /[a-zA-Z]/.test('abcdeA')๋Š” ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„์—†์ด ์•ŒํŒŒ๋ฒณ ์ค‘ 1๊ฐœ๊ฐ€ abcdeA์•ˆ์— ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธ.
      • /[ใ„ฑ-ใ…Ž๊ฐ€-ํžฃ]/ ์€ ๋ชจ๋“  ํ•œ๊ตญ์–ด๋ฅผ ์˜๋ฏธ
      • /[๋ฐฑ์Šฌ๋ ˆ์‹œS]/๋Š” ์•„๋ฌด ๋ฌธ์ž 1๊ธ€์ž๋ฅผ ์˜๋ฏธ(ํŠน์ˆ˜๊ธฐํ˜ธ ํฌํ•จ)
      1. ์‹œ์ž‘๊ณผ ๋์„ ์•Œ ์ˆ˜ ์žˆ์Œ
      • /^a/ : a๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€
      • /a$/ : a๋กœ ๋๋‚˜๋Š”์ง€
      • /a|b/ : a ๋˜๋Š” b๊ฐ€ ๋“ค์–ด์žˆ๋Š”์ง€
  • ์˜ˆ์‹œ) ๋น„๋ฐ€๋ฒˆํ˜ธ์— ๋Œ€๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€, ์ด๋ฉ”์ผ ํ˜•์‹์ด ๋งž๋Š”์ง€?

    document.querySelector('form').addEventListener('submit', function(event){
              
    const inputId = document.querySelector('#inputId').value;
    const inputPw = document.querySelector('#inputPw').value; 
    
    if(inputId==""||inputPw==""){
       alert('์ž…๋ ฅํ•œ ๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.')
       event.preventDefault();
    }else if(inputPw.length<6){
       alert('๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 6์ž๋ฆฌ ์ด์ƒ์œผ๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”')
       event.preventDefault();
    }
                                
    if(/\S+@\S+\.\S+/.test(inputId)){
    
    }else{
       alert('์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค!!')
       event.preventDefault();
    }
    if(/[A-Z]/.test(inputPw)){
    
    }else{
       alert('๋Œ€๋ฌธ์ž 1๊ฐœ๋ฅผ ํฌํ•จํ•ด์ฃผ์„ธ์š”')
       event.preventDefault();
      }
    })
    • inputId์™€ inputPw์— ์ž…๋ ฅํ•œ ๋‚ด์šฉ์ด ์—†์œผ๋ฉด ๊ฒฝ๊ณ ์ฐฝ ๋„์šฐ๊ณ  ๋งŒ์•ฝ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด
    • inputPw์˜ ๊ธธ์ด๊ฐ€ 6์ž๋ฆฌ ์ดํ•˜๋ผ๋ฉด ๊ฒฝ๊ณ ์ฐฝ์„ ๋„์›€.
    • ๋‹ค๋ฅธ ์กฐ๊ฑด๋ฌธ์œผ๋กœ inputId์˜ ๊ฐ’์ด ์ด๋ฉ”์ผ ํ˜•์‹์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์•„๋‹ˆ๋ผ๋ฉด ๊ฒฝ๊ณ ์ฐฝ.
    • ๋‹ค๋ฅธ ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด inputPw์— ๋Œ€๋ฌธ์ž 1๊ฐœ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ.

์• ๋‹ˆ๋ฉ”์ด์…˜

  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋งŒ๋“œ๋Š” ๋ฒ•์น™

      1. ์‹œ์ž‘์Šคํƒ€์ผ ๊ตฌํ˜„
      2. ์ตœ์ข…์Šคํƒ€์ผ ๊ตฌํ˜„(class๋ช…์„ ํ™œ์šฉํ•ด์„œ css์— ๋ฏธ๋ฆฌ ๊ตฌํ˜„)
      3. ์›ํ•  ๋•Œ ์ตœ์ข…์Šคํƒ€์ผ๋กœ ๋ณ€ํ•˜๋ผ๊ณ  ์ฝ”๋“œ ์ž‘์„ฑ
      4. ์‹œ์ž‘์Šคํƒ€์ผ์— transition ์ถ”๊ฐ€
  • apple music UI ๋งŒ๋“ค๊ธฐ!

    • ๋จผ์ € HTML๊ณผ CSS, ์ด๋ฏธ์ง€๋ฅผ ์ค€๋น„ํ•œ๋‹ค.

      <div class="card-background">
      <div class="card-box">
        <img src="์นด๋“œ์ด๋ฏธ์ง€1๊ฒฝ๋กœ">
      </div>
      <div class="card-box">
        <img src="์นด๋“œ์ด๋ฏธ์ง€2๊ฒฝ๋กœ">
      </div>
      <div class="card-box">
        <img src="์นด๋“œ์ด๋ฏธ์ง€3๊ฒฝ๋กœ">
      </div>
      </div>
      .card-background {
      height: 3000px;
      margin-top: 800px;
      margin-bottom: 1600px;
      }
      .card-box img {
      display: block;
      margin: auto;
      max-width: 80%;
      }
      .card-box {
      position: sticky;
      top: 400px;
      margin-top: 200px;
      }
      • ๋†’์ด๊ฐ€ 3000px๋‚˜ ๋˜๋Š” ๊ธด ๋ฐฐ๊ฒฝ์— ์นด๋“œ๋ฅผ ์„ธ๋กœ๋กœ ๋ฐฐ์น˜ํ–ˆ๊ณ  position : sticky ๋ฅผ ํ†ตํ•ด ์Šคํฌ๋กค ์‹œ ํ™”๋ฉด์— ๊ณ ์ •๋˜๋„๋ก ํ•ด๋†“์•˜์Œ.
      • ์ด์ œ ์Šคํฌ๋กค ์‹œ opacity๊ฐ€ ์ ์  ์ค„์–ด๋“œ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์ง€๊ธˆ ์Šคํฌ๋กค ์œ„์น˜์— ๋”ฐ๋ผ opacity๊ฐ€ 1~0๊นŒ์ง€ ์ค„์–ด๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•จ.
    • ์Šคํฌ๋กค ์‹œ ํ˜„์žฌ ์Šคํฌ๋กค๋ฐ”์˜ ๋†’์ด๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค!

      $(window).scroll(function(){
        var ๋†’์ด = $(window).scrollTop();
      });
      • ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜„์žฌ ์ฐฝ์˜ ์Šคํฌ๋กค๋ฐ” ๋†’์ด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” $(window).scrollTop() ํ•จ์ˆ˜ ์‹คํ–‰.
        ์ฝ˜์†”์ฐฝ์— ์ฐ์–ด๋ณด๋ฉด ์Šคํฌ๋กค๋ฐ” ๋†’์ด๊ฐ€ ์ธก์ •๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ.
    • ํ˜„์žฌ ์Šคํฌ๋กค ๋ฐ”์˜ ์œ„์น˜์— ๋”ฐ๋ผ opacity๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜๊ณ  ์‹ถ๋‹ค!

      • ์ด์ œ 650px์ฏค ์Šคํฌ๋กค ํ•˜๋ฉด opacity๋ฅผ 1๋กœ, 900px์—์„œ๋Š” opacity๋ฅผ 0.5๋กœ 1150px์—์„œ๋Š” opacity๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ.
      $(window).scroll(function(){
      
      var ๋†’์ด = $(window).scrollTop();
          
      $('.card-box').eq(0).css('opacity', ???);
      }); 
      • ์—ฌ๊ธฐ์„œ ??? ๋Š” ์Šคํฌ๋กค๋ฐ” ๋†’์ด๊ฐ€ 650~1150์ด ๋  ๋•Œ, 1~0์ด ๋˜๋Š” ๊ฐ€๋ณ€์ ์ธ ๊ฐ’์ด๋ฏ€๋กœ
        ๋ฏธ์ง€์˜ ๋ณ€์ˆ˜ y๋ผ๊ณ  ํ‘œํ˜„์„ ํ•˜๋ฉด
      $(window).scroll(function(){
      
      var ๋†’์ด = $(window).scrollTop();
      
      var y = ๋ฏธ์ง€์˜ ๋ณ€์ˆ˜;
      $('.card-box').eq(0).css('opacity', y);
      });
      • ๊ทธ๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ y๊ฐ’์„ ๊ตฌํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ž ์‹œ ์ค‘ํ•™ ์ˆ˜ํ•™์„ ๋– ์˜ฌ๋ ค๋ณด๋ฉด
        ์Šคํฌ๋กค๋ฐ”๋†’์ด๊ฐ€ 650~1150์ด ๋  ๋•Œ 1~0์ด ๋˜๋Š” ๊ฐ€๋ณ€์ ์ธ ๊ฐ’ = y๋Š” ์ค‘ํ•™๊ต ๋•Œ ๋ฐฐ์šด์ ์ด ์žˆ์Œ.
      • ์ด๊ฑธ ์ˆ˜์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด y์— ๋Œ€ํ•œ ์ผ์ฐจํ•จ์ˆ˜์ž„. y = ax + b
        ์—ฌ๊ธฐ์„œ a๋Š” ๊ธฐ์šธ๊ธฐ b๋Š” y์ ˆํŽธ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ๋„ˆ๋ฌด ์–ด๋ ค์šฐ๋‹ˆ๊นŒ ๋Œ€์ž…๋ฒ•์„ ์ด์šฉํ•˜๋ฉด
      //์ˆ˜ํ•™์‹œ๊ฐ„
      1 = a * 650 + b
      0 = a * 1150 + b
      a = -1/500
      b = 115/50
      • ์ด๊ฑธ ๋‹ค์‹œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์— ๋Œ€์ž…ํ•˜๋ฉด
      var y = -1/500 * ๋†’์ด + 115/50
      • ์ด์ œ y์˜ ๊ฐ’์„ ์•„๋‹ˆ๊นŒ ์•„๊นŒ ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Œ!
      $(window).scroll(function(){
      
      var ๋†’์ด = $(window).scrollTop();
      
      var y =  -1/500 * ๋†’์ด + 115/50;
      $('.card-box').eq(0).css('opacity', y);
      });
    • ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ํˆฌ๋ช…๋„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์นด๋“œ ์‚ฌ์ด์ฆˆ๊ฐ€ ์„œ์„œํžˆ ์ž‘์•„์ง€๋Š” ๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ํ• ๊นŒ??

      • ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š”๊ฑด transform : scale(0.9) ์†์„ฑ์„ ์ด์šฉํ•˜๋ฉด 0.9๋ฐฐ๋กœ ์ž‘์•„์ง.
      • ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ๋„ ๊ทธ๋Œ€๋กœ 0.9 ๋ผ๋Š” ์ˆ˜์น˜๋ฅผ ๋„ฃ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฏธ์ง€์˜ ๋ณ€์ˆ˜ z ๊ฐ™์€๊ฑธ ๋งŒ๋“ค์–ด์„œ
      • z = a * ๋†’์ด + b ์ด๋ ‡๊ฒŒ ์ˆ˜์‹์„ ์„ธ์šฐ๊ณ  ๋†’์ด๊ฐ€ 650px์ผ ๋•Œ z = 1, ๋†’์ด๊ฐ€ 1150px์ผ๋•Œ z = 0.9 ์ด๋Ÿฐ ์‹์œผ๋กœ ์“ฐ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Œ.
      • ์•„๊นŒ์™€ ๋™์ผํ•˜๊ฒŒ ๋Œ€์ž…๋ฒ•์œผ๋กœ a์™€ b์˜ ์ƒ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ฉด
      z = (-1/5000) * ๋†’์ด + 565/500
      • ์ด์ œ z๊ฐ’์„ ์•Œ์•˜์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด
      var z = (-1/5000) * ๋†’์ด + 565/500;
      $('.card-box').eq(0).css('transform', `scale( ${z} )`);

      ๋—.

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