๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

 

๋ชจ๋ฐ”์ผ ํ„ฐ์น˜ ํ›„ ํ˜ธ๋ฒ„ ํšจ๊ณผ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์„ ๋•Œ

 

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ํ•œ ๋ฒˆ์ฏค์€ ๊ฒช๋Š” ๋ฌธ์ œ๋‹ค. ๋ฐ์Šคํฌํ†ฑ์—์„œ๋Š” ๋ฉ€์ฉกํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋˜ ๋ฒ„ํŠผ์ด ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ํ„ฐ์น˜ ํ›„์—๋„ ํ˜ธ๋ฒ„ ์ƒํƒœ๊ฐ€ ๊ณ„์† ์œ ์ง€๋˜๋Š” ํ˜„์ƒ ๋ง์ด๋‹ค.

์ฒ˜์Œ์—๋Š” "๋ญ์ง€? ์™œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ์ƒ‰๊น”์ด ์•ˆ ๋Œ์•„์™€?" ํ•˜๋ฉด์„œ ๋‹นํ™ฉํ–ˆ๋Š”๋ฐ, ์•Œ๊ณ  ๋ณด๋‹ˆ ๋ชจ๋ฐ”์ผ๊ณผ ๋ฐ์Šคํฌํ†ฑ์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐฉ์‹์ด ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

 

 

๋ฌธ์ œ์˜ ํ•ต์‹ฌ

๋ชจ๋ฐ”์ผ์—์„œ๋Š” "๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฐ๋‹ค"๋Š” ๊ฐœ๋… ์ž์ฒด๊ฐ€ ์—†๋‹ค. ํ„ฐ์น˜์Šคํฌ๋ฆฐ์—์„œ๋Š” ํ„ฐ์น˜ํ•˜๋Š” ์ˆœ๊ฐ„ hover ์ƒํƒœ๊ฐ€ ํ™œ์„ฑํ™”๋˜๊ณ , ๋‹ค๋ฅธ ๊ณณ์„ ํ„ฐ์น˜ํ•˜๊ธฐ ์ „๊นŒ์ง€ ๊ทธ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฒ„ํŠผ์„ ํ„ฐ์น˜ํ•œ ํ›„ ๋‹ค๋ฅธ ์˜์—ญ์„ ํ„ฐ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํ˜ธ๋ฒ„ ํšจ๊ณผ๊ฐ€ ๊ณ„์† ๋‚จ์•„์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

์ตœ์‹  CSS ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ

์˜ˆ์ „์—๋Š” @media (max-width: 768px) ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋””๋ฐ”์ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ–ˆ์ง€๋งŒ, ์š”์ฆ˜์€ ๋” ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. hover์™€ pointer ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์กฐํ•ฉํ•˜๋ฉด ๋””๋ฐ”์ด์Šค์˜ ์ž…๋ ฅ ๋ฐฉ์‹์„ ์ •ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

/* ํ„ฐ์น˜์Šคํฌ๋ฆฐ ๋””๋ฐ”์ด์Šค - ์Šค๋งˆํŠธํฐ, ํƒœ๋ธ”๋ฆฟ */
@media (hover: none) and (pointer: coarse) {
  .btn-fade:active {
    background: #ff7d4d;
    transition: 200ms ease-in;
  }
}

/* ์ •๋ฐ€ํ•œ ํฌ์ธํŒ… ๋””๋ฐ”์ด์Šค - ๋งˆ์šฐ์Šค, ํŠธ๋ž™ํŒจ๋“œ */
@media (hover: hover) and (pointer: fine) {
  .btn-fade:hover {
    background: #ff7d4d;
    transition: 300ms ease-in;
  }
}

ํ„ฐ์น˜์Šคํฌ๋ฆฐ์—์„œ๋Š” :hover ๋Œ€์‹  :active๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํ„ฐ์น˜ ํŠน์„ฑ์ƒ ๋น ๋ฅธ ๋ฐ˜์‘์ด ์ค‘์š”ํ•˜๋‹ˆ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„๋„ ์กฐ๊ธˆ ๋” ์งง๊ฒŒ ์„ค์ •ํ–ˆ๋‹ค.

 

 

JavaScript๋กœ ํ„ฐ์น˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

CSS๋งŒ์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ๋ณต์žกํ•œ ์ผ€์ด์Šค๋ผ๋ฉด JavaScript์˜ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ํ„ฐ์น˜ ํ›„ ๊ฐ•์ œ๋กœ ํ˜ธ๋ฒ„ ์ƒํƒœ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

function setupTouchHandlers() {
  const buttons = document.querySelectorAll('.btn-fade');
  
  buttons.forEach(button => {
    button.addEventListener('touchend', function() {
      // ํ„ฐ์น˜ ์ข…๋ฃŒ ์‹œ hover ํด๋ž˜์Šค ์ œ๊ฑฐ
      this.classList.remove('hover-active');
      
      // ํ˜น์€ blur๋กœ focus ํ•ด์ œ
      this.blur();
    });
  });
}

 

2024๋…„ ํŠธ๋ Œ๋“œ: Container Queries ํ™œ์šฉ (UPDATE)

์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋“ค์ด Container Queries๋ฅผ ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์„œ, ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๋” ์„ธ๋ฐ€ํ•œ ๋ฐ˜์‘ํ˜• ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค. ํŠนํžˆ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ๋•Œ ์ด๋Ÿฐ ๋ฐฉ์‹์ด ์ ์  ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ๋‹ค.

@container (hover: hover) {
  .button {
    &:hover {
      transform: scale(1.05);
    }
  }
}

 

์‹ค๋ฌด์—์„œ ๋А๋‚€ ์ 

์ฒ˜์Œ์—๋Š” "๊ทธ๋ƒฅ ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ํ˜ธ๋ฒ„ ํšจ๊ณผ ๋นผ๋ฉด ๋˜์ง€ ์•Š๋‚˜?" ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ด€์ ์—์„œ๋Š” ๊ฐ ํ”Œ๋žซํผ์— ๋งž๋Š” ์ ์ ˆํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.

ํ„ฐ์น˜ ๋””๋ฐ”์ด์Šค์—์„œ๋Š” :active ์ƒํƒœ๋กœ ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘์„, ๋งˆ์šฐ์Šค ํ™˜๊ฒฝ์—์„œ๋Š” :hover๋กœ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์‹์œผ๋กœ ๋ง์ด๋‹ค. ๊ฒฐ๊ตญ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋””๋ฐ”์ด์Šค๋ฅผ ์“ฐ๋“  ์ž์—ฐ์Šค๋Ÿฌ์šด ์ƒํ˜ธ์ž‘์šฉ์„ ๋А๋‚„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒŒ ๋ชฉํ‘œ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ด ๋‹จ์ˆœํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Ÿฐ ์„ธ๋ถ€์ ์ธ ์ฐจ์ด๋“ค์„ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ€๋‹ค ๋ณด๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ๊นŠ์ด ์žˆ๋Š” ๋ถ„์•ผ๋ผ๋Š” ๊ฑธ ๋А๋ผ๊ฒŒ ๋œ๋‹ค. ํŠนํžˆ ๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค์™€ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์š”์ฆ˜์—๋Š” ๋”์šฑ ๊ทธ๋ ‡๋‹ค.

๋ฐ˜์‘ํ˜•