Day 16 - CSS Text Shadow Mouse Move Effect

2020. 11. 14. 12:31ใ†JavaScript30-Challenge

Demo

Day 16 - CSS Text Shadow Mouse Move Effect

HTML ์ฝ”๋“œ

<body>
  <div class="hero">
    <h1 contenteditable>๐Ÿ”ฅWOAH!</h1>
  </div>
</body>

CSS ์ฝ”๋“œ

.hero {
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  color: black;
}

h1 {
  text-shadow: 10px 10px 0 rgba(0, 0, 0, 1);
  font-size: 100px;
}

JavaScript ์ฝ”๋“œ

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

function shadow(e) {
  const { offsetWidth: width, offsetHeight: height } = hero;
  let { offsetX: x, offsetY: y } = e;

  if (this !== e.target) {
    x = x + e.target.offsetLeft;
    y = y + e.target.offsetTop;
  }

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

  console.log(xWalk, yWalk);

  text.style.textShadow = `
  ${xWalk}px ${yWalk}px 0 red,
  ${xWalk * -1}px ${yWalk}px 0 blue,
  ${xWalk}px ${yWalk * -1}px 0 green,
  ${xWalk * -1}px ${yWalk * -1}px 0 black
  `;
}

function init() {
  hero.addEventListener("mousemove", shadow);
}

init();

์ฒ˜์Œ์— ๋ณผ ๋•Œ CSS Text Shadow๊ฐ€ ๋งˆ์šฐ์Šค ์›€์ง์ž„์— ๋ฐ˜์‘ํ•ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์‹ ๊ธฐํ–ˆ์—ˆ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ž‘๋™๋˜๋Š” ๊ฒƒ์ธ์ง€ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ์ฑŒ๋ฆฐ์ง€์—์„œ๋Š” ES6 ๋ฒ„์ „์œผ๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋‹ค.

heroํƒœ๊ทธ๋Š” ์Šคํฌ๋ฆฐ์—์„œ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ ํฌ๊ธฐ๋งŒํผ์˜ width์™€ height๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋งˆ์šฐ์Šค ์›€์ง์ž„์€ heroํƒœ๊ทธ์— ์ƒ๋Œ€์ ์œผ๋กœ ์›€์ง์ด๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.(offsetX / offsetY)

์•Œ์•„๋‘์–ด์•ผ ํ•  ๊ฒƒ์€ ์Šคํฌ๋ฆฐ์—์„œ e.target์„ ์ฝ˜์†”๋กœ๊ทธ ์ฐ์–ด๋ณด๋ฉด ๊ฐ‘์ž๊ธฐ ์–ด๋А์ˆœ๊ฐ„ x์ขŒํ‘œ์™€ y์ขŒํ‘œ๊ฐ€ ์ด์ƒํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•˜๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” e.target์ด heroํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” h1ํƒœ๊ทธ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ target์ด ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ e.target์ด h1์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ x๊ฐ’๊ณผ y๊ฐ’์„ ๊ทธ์— ๋งž์— ๋ณ€๊ฒฝํ•ด์ค€ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

์ด์ œ css text shadow์˜ px๊ฐ’์„ ์–ด๋А์ •๋„๋กœ ์„ค์ •ํ• ์ง€ ์ •ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒ๋‹จ์— walk๋ผ๋Š” ๋ณ€์ˆ˜์— 100๊ฐ’์„ ์ฃผ์—ˆ๋Š”๋ฐ ์ด๊ฒƒ์€ ๋‚˜์ค‘์— shadow x, y์˜ ์›€์ง์ž„์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ’์ด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ์˜ ์ค‘์•™์„ 0,0์œผ๋กœ ๋‘๊ณ  ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๋กœ ์ด๋™ํ•˜๋ฉด x / y ์ขŒํ‘œ๋Š” (50, 50) ์™ผ์ชฝ ์•„๋ž˜๋กœ ์ด๋™ํ•˜๋ฉด (-50, -50)์ด ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ 100์„ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ˜์„ ๋‚˜๋ˆ„์„œ ํ•œ์ชฝ์€ + ๋ฐ˜๋Œ€์ชฝ์€ -๊ฐ’์œผ๋กœ ์ง€์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ง€์ •ํ•ด์ค€ xWalk / yWalk๋ฅผ text shadow์— ์ ์šฉํ•ด๋ณด๋ฉด ๊ทธ๋งŒํผ์˜ ๊ธฐ์šธ๊ธฐ๋กœ shadow๊ฐ€ ์›€์ง์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :)

๊ฒฐ๋ก  -> ์Šคํฌ๋ฆฐ ์ƒ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์— ๋”ฐ๋ผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” offset, offsetWidth ๋“ฑ ์ขŒํ‘œ์— ๊ด€ํ•œ ๊ฒƒ๋“ค์„ ์ด์šฉํ•˜๋ฉด ๋ญ๋“ ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

'JavaScript30-Challenge' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Day 18 - Tally String Times with Reduce  (0) 2020.11.14
Day 17 - Sorting Band Names without Articles  (0) 2020.11.14
Day 15 - LocalStorage and Event Delegation  (0) 2020.11.14
Day 14 - Object and Arrays Reference VS Copy  (0) 2020.11.13
Day 13 - Slide In On Scroll  (0) 2020.11.13