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

๐Ÿ‘ฉ‍๐Ÿ’ป ๊ฐœ๋ฐœ ๊ณต๋ถ€/ํ•œ๊ฒฝxํ† ์Šค ๋ถ€ํŠธ์บ ํ”„(Fullstack)

[ํ•œ๊ฒฝxToss] ๐Ÿ‡์ถ”๊ฐ€๊ณต๋ถ€) CSS ๋ฐ˜์‘ ๋ฐ˜๋ณต ์„ค์ • / fade over ์œ„์น˜ / SCSS

728x90

 

๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ :

์˜ํ™”/์˜ˆ๋งค/๊ทน์žฅ ๊ฐ ๋ฒ„ํŠผ์˜ ์ˆœ์„œ๋ฅผ n์ด๋ผ๊ณ  ํ• ๋•Œ,

hover ์‹œ ๋‚˜ํƒ€๋‚˜๋Š” ์•„๋ž˜์ชฝ hidden menu ๋ฆฌ์ŠคํŠธ๋ฅผ

margin-right: calc(50%-n); ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์‚ฐํ•ด์„œ ๊ฐ ๋ฒ„ํŠผ๋งˆ๋‹ค ์œ„์น˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.


 

์•„์ง ์ˆ˜์—…์—์„œ ์ˆœ์ˆ˜ html, css๋งŒ ์‚ฌ์šฉ์ค‘์ด๋ผ

nth-child(๊ท€์ฐฎ์Œ)์ด๋‚˜ JS ์ด์™ธ์—๋„ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค!

 

chatGPTํ•œํ…Œ ์šฐ์„  ๋ฌผ์–ด๋ด„ -> ๊ฐ•์‚ฌ๋‹˜๊ป˜๋„ ์—ฌ์ญˆ์–ด๋ด„

 

1
2
3

 

 

๋ฐฉ๋ฒ• 1: nth-child์™€ calc() ์กฐํ•ฉ

CSS์˜ nth-child()๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŠน์ • ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

.hidden_menu:nth-child(1) .menulist {
  margin-right: calc(50% - 10px); /* ์ฒซ ๋ฒˆ์งธ hidden_menu */
}

.hidden_menu:nth-child(2) .menulist {
  margin-right: calc(50% - 20px); /* ๋‘ ๋ฒˆ์งธ hidden_menu */
}

.hidden_menu:nth-child(3) .menulist {
  margin-right: calc(50% - 30px); /* ์„ธ ๋ฒˆ์งธ hidden_menu */
}

 

๋ฐฉ๋ฒ• 2: JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ๊ณ„์‚ฐ

JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ hidden_menu์˜ ์ˆœ์„œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ margin-right ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<script>
  document.querySelectorAll('.hidden_menu').forEach((menu, index) => {
    const menulist = menu.querySelector('.menulist');
    if (menulist) {
      // index์— ๋”ฐ๋ผ margin-right ๊ณ„์‚ฐ
      const dynamicMargin = `calc(50% - ${10 * (index + 1)}px)`;
      menulist.style.marginRight = dynamicMargin;
    }
  });
</script>

 

๋ฐฉ๋ฒ• 3: SCSS(SASS) ์‚ฌ์šฉ

CSS ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต ์ž‘์—…์„ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

.hidden_menu {
  @for $i from 1 through 5 {
    &:nth-child(#{$i}) .menulist {
      margin-right: calc(50% - #{$i * 10}px);
    }
  }
}

 

SCSS ๋‹จ์  : npm ์„ค์น˜, ์ปดํŒŒ์ผ ํ•„์š”

 


SCSS๋ฅผ ๋“ค์–ด๋ณด๊ธด ํ–ˆ๋Š”๋ฐ, ํ•œ๋ฒˆ๋„ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์—†์–ด์„œ ๊ฐ•์‚ฌ๋‹˜๊ป˜ ๋”ฐ๋กœ ์—ฌ์ญค๋ณด์•˜๋‹ค

 

๊ฐ•์‚ฌ๋‹˜ ์„ค๋ช… =

์ „๋ฌธ ํผ๋ธ”๋ฆฌ์…”๋“ค์ด ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๊ฒƒ๊นŒ์ง€๋Š” ์ˆ˜์—…์—์„œ ๋‹ค๋ฃจ์ง„ ์•Š์„ ๊ฑฐ๋‹ค~

ํ˜„์—…์—์„œ ๊ฐ€๋” ์‚ฌ์šฉํ•œ๋‹ค.

๋ฒˆ๊ฑฐ๋กœ์›Œ์„œ ์•„์˜ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋„ ํ•œ๋‹ค

์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ํ†ตํ•ด์„œ js์ฒ˜๋Ÿผ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ๋ฐ˜๋ณต๋ฌธ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค


 

๋Š๋‚€์  :

ํ˜„์žฌ ์ƒํ™ฉ์—์„œ๋Š” SCSS๋ฅผ ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜์ง€๋Š” ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค!

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ React, CSS๋กœ ์ถฉ๋ถ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ํ•„์š”ํ•˜๋‹ค๋ฉด ๋”ฐ๋กœ ๊ณต๋ถ€ํ• ๋“ฏ

 

์•ž์œผ๋กœ ๋ฐฐ์šธ ๋ฐฑ์—”๋“œ๊ฐ€ ๋ฌด์„ญ๋‹ค ใ…œใ…กใ…œ

 

728x90