[JavaScript30] ๐Ÿ–ฑ 16. Mouse Move Shadow

์กฐ์ค€ํ˜•ยท2021๋…„ 7์›” 11์ผ
0

JavaScript30

๋ชฉ๋ก ๋ณด๊ธฐ
16/30

๐Ÿ–ฑ 16. Mouse Move Shadow

๋งˆ์šฐ์Šค ์ด๋™์— ๋”ฐ๋ผ ํ…์ŠคํŠธ๊ทธ๋ฆผ์ž ํšจ๊ณผ๋ฅผ ์ฃผ์–ด ์›€์ง์ด๊ฒŒ ํ•จ.

์ดˆ๊ธฐ์ฝ”๋“œ

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mouse Shadow</title>
</head>
<body>
    <div class="hero">
        <h1 contenteditable>๐Ÿ”ฅWOAH!</h1>
    </div>

    <style>
        html{
            color:#000;
            font-family:sans-serif;
        }
        body{
            margin: 0;
        }
        .hero{
            min-height:100vh;
            display:flex;
            justify-content: center;
            align-items: center;
            color:#000;
        }
        h1{
            text-shadow: 10px 10px 0 rgba(0,0,0,1);
            font-size:100px;
        }
    </style>
    <script>

    </script>
</body>
</html>

์ดˆ๊ธฐํ™”๋ฉด

๐ŸŒ ๊ณผ์ •

๐Ÿ‘‰ 1. ๋ณ€์ˆ˜ ์„ ์–ธ

const hero = document.querySelector('.hero');
const text = hero.querySelector('h1');
const walk = 500; // 100px;

heroํด๋ž˜์Šค, h1ํƒœ๊ทธ๋ฅผ ๊ฐ€์ ธ์˜ด.
walk๋Š” ์˜ด์ง์ด๋Š” ๋ฒ”์œ„.

๐Ÿ‘‰ 2. ๊ทธ๋ฆผ์ž๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ ๋ฐ ์ขŒํ‘œ๊ฐ’ ๊ธฐ์ค€ ์„ค์ •

function shadow(e){
            // console.log(e);
            const {offsetWidth:width, offsetHeight: height} = hero;
            let {offsetX: x, offsetY: y} = e;
            // console.log(x, y);
    
    		// this๋Š” <div class="hero">, target์€ h1
            if(this !== e.target){
                x = x + e.target.offsetLeft;
                y = y + e.target.offsetTop;
            }

๐Ÿ‘‰ ES6 ๊ตฌ์กฐ ํ• ๋‹น

const width = hero.offsetWidth;
const height = hero.offsetHeight;

์œ„ ๋‘์ค„์„

const {offsetWidth:width, offsetHeight: height} = hero;

ํ•œ ์ค„๋กœ ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค.

  • offsetWidth, offsetHeight๋Š” border๋“ฑ์˜ ๊ธธ์ด๊นŒ์ง€ ํฌํ•จํ•œ ๋„“์ด,๋†’์ด์ด๋‹ค.
  • x,y์— ๋งˆ์šฐ์Šค ์œ„์น˜๋ฅผ ๋‹ด๊ณ ,
  • ํ˜„์žฌ ๋งˆ์šฐ์Šค ์œ„์น˜๊ฐ€ heroํด๋ž˜์Šค์•ˆ์˜ h1ํƒœ๊ทธ์— ์žˆ์„๋•Œ ์ฐธ์„ ๋ฐ˜ํ™˜.

๐Ÿ‘‰ 3. ๋งˆ์šฐ์Šค ์ด๋™์‹œ ๊ธ€๋ฏธ์ž ์œ„์น˜, ์ƒ‰์ƒ ์„ค์ •.

const xWalk = Math.round((x / width * walk) - (walk / 2));
const yWalk = Math.round((y / height * walk) - (walk / 2));

    text.style.textShadow = `
    ${xWalk}px ${yWalk}px 0 rgba(255, 0, 255, 0.7),
    ${xWalk * -1}px ${yWalk}px 0 rgba(0,255,255,0.7),
    ${yWalk}px ${xWalk * -1}px 0 rgba(0,255,0,0.7),
    ${yWalk * -1}px ${xWalk}px 0 rgba(0,0,255,0.7)
    `;
}

h1ํƒœ๊ทธ์˜ ๊ทธ๋ฆผ์ž๋ฅผ ์„ค์ •ํ•ด์คŒ.

๐Ÿ‘‰ 4. ํ•จ์ˆ˜ ํ˜ธ์ถœ

hero.addEventListener('mousemove', shadow);

๋งˆ์šฐ์Šค๊ฐ€ ์›€์ง์ด๋ฉด shadowํ•จ์ˆ˜๋ฅผ ์‹คํ–‰.

profile
๊นƒํ—ˆ๋ธŒ : github.com/JuneHyung

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