hoverํ•  ๋•Œ ๋“ฑ์žฅํ•˜๋Š” ๋ฒ„ํŠผ์˜ ์ฐŒ๊ทธ๋Ÿฌ์ง ๋ฌธ์ œ (feat.flex-shrink ๋กœ์ง)

2026. 4. 11. 21:45ใ†Trouble Shooting & Issues/Linkiving

๋ฐ˜์‘ํ˜•

flex-shrink์˜ ๋™์ž‘ ์ˆœ์„œ ์ดํ•ดํ•˜๊ธฐ

๋ชฉ์ฐจ

1. ๋ฌธ์ œ ์ƒํ™ฉ: div ๋‚ด์—์„œ hover ์‹œ ๋ณด์ด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฐŒ๊ทธ๋Ÿฌ์ง

2. ํ•ด๊ฒฐ1: ๊ณ ์ • ๋„ˆ๋น„๋ฅผ ์ง€์šฐ๊ณ  IconButton์— shrink-0 ์ฃผ๊ธฐ

3. ํ•ด๊ฒฐ2: IconButton์— block ๋Œ€์‹ ์— flex ์ฃผ๊ธฐ


1. ๋ฌธ์ œ ์ƒํ™ฉ: div๋‚ด์—์„œ hover ์‹œ ๋ณด์ด๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฐŒ๊ทธ๋Ÿฌ์ง

์ธ๋„ค์ผ์—์„œ๋Š” ์ž˜๋ณด์ด๋ผ๊ณ  IconButton์„ ์ผ๋ถ€๋Ÿฌ ๊ฒ€์ •์ƒ‰์œผ๋กœ ๋’€๋Š”๋ฐ, ์‹ค์ œ ๋””์ž์ธ์€ ์™ผ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ฐฐ๊ฒฝ๊ณผ ๋น„์Šทํ•œ ํŒŒ๋ž€์ƒ‰์ด๋‹ค.

 

ํ‹ฐ๊ฐ€ ์ž˜ ์•ˆ๋‚œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์ฐŒ๊ทธ๋Ÿฌ์ง„ ์ƒํƒœ๋กœ ๋‘๊ณ  ์ผ๋‹จ ๋‹ค๋ฅธ ๋” ๊ธ‰ํ•œ ์ž‘์—…๋“ค์„ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€

ํ”ผ๋“œ๋ฐฑ ๋ฐฉ์—๋„ ์˜ฌ๋ผ์˜ค๊ณ , ๋” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์ข€ ์™„์„ฑ์ด ๋ผ์„œ ๋“œ๋””์–ด ๊ณ ์น˜๊ธฐ ์‹œ์ž‘..

 

๊ฐ„๋‹จํ•œ ๋ถ€๋ถ„์ด์ง€๋งŒ ์€๊ทผ ํ—ค๋ฉจ์—ˆ์–ด์„œ ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•ด๋ณธ๋‹ค.

 

ํ•ด๋‹น ๋ถ€๋ถ„์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์—ˆ๋‹ค.

return (
  <>
    <div
      className="group bg-btn-tertiary-subtle-onpanel flex h-9 w-48.5 cursor-pointer items-center justify-between rounded-full pr-3 pl-3 transition-colors hover:pr-1"
      ...
    >
      <span className="font-label-md text-gray500 group-hover:text-gray700 truncate group-hover:w-46">
        {label}
      </span>
      <Popover>
        <PopoverTrigger popoverKey="chat_more">
          <IconButton
            ...
            className="hidden pl-1 group-hover:block"
          />
        </PopoverTrigger>
        <PopoverContent popoverKey="chat_more">
          ...
        </PopoverContent>
      </Popover>
    </div>
  </>
);

 

<div> ํƒœ๊ทธ ์•ˆ์— Label, IconButton์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค.

์ฒ˜์Œ์— ์ €๋ ‡๊ฒŒ ๋ง‰ ๋„ฃ์—ˆ๋”๋‹ˆ IconButton์ด ์ฐŒ๊ทธ๋Ÿฌ์ง + ์Šคํฌ๋กค์— ์•„์ดํ…œ์ด ์ž˜๋ฆผ์œผ๋กœ ์ธํ•ด w-48.5, w-46, pl-1 ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ๋“ค์–ด๊ฐ€์žˆ๋‹ค.

 

flex ๋ ˆ์ด์•„์›ƒ์—์„œ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•  ๋•Œ flex-shrink๊ฐ€ ๋™์ž‘ํ•˜๋ฉฐ IconButton์ด ์••์ถ•๋œ ๋ฌธ์ œ์˜€๋‹ค.

IconButton์— ์•„๋ž˜์™€ ๊ฐ™์€ ์Šคํƒ€์ผ๋ง์ด ์ ์šฉ๋˜์–ด ์žˆ๋‹ค.

className="hidden group-hover:block"

์ด๋Š” ํ™”๋ฉด์— ์กด์žฌํ•˜์ง€ ์•Š๋˜ IconButton์ด hover๋กœ ์ƒˆ๋กœ ๋ ˆ์ด์•„์›ƒ์— ์ฐธ์—ฌํ•˜๋ฉฐ ๊ณต๊ฐ„ ์žฌ๋ถ„๋ฐฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ด ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋Š” IconButton์„ ์œ„ํ•ด์„œ ์ „์ฒด div์—๋Š” hover:pr-1์ด ์ ์šฉ๋œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ธ pr-3์€ IconButton์ด ๋“ค์–ด์™”์„ ๋•Œ ๋„ˆ๋ฌด ๋„“์–ด๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

label์—๋Š” hover:w-46, div๋Š” w-48.5๋กœ ๊ณ ์ •๋œ ๋„ˆ๋น„๋ฅผ ๊ฐ€์ ธ์„œ ํŒจ๋”ฉ๊ฐ’์œผ๋กœ width๋ฅผ ์ฐจ์ง€ํ•˜๋Š” IconButton์ด ์ฐŒ๊ทธ๋Ÿฌ์ง„ ๊ฒƒ์ด๋‹ค.

 


2. ํ•ด๊ฒฐ1: ๊ณ ์ • ๋„ˆ๋น„๋ฅผ ์ง€์šฐ๊ณ  IconButton์— shrink-0 ์ฃผ๊ธฐ

์šฐ์„  ๊ณ ์ • ๋„ˆ๋น„๊ฐ€ ์žˆ๋Š” ๋ชจ์–‘์ด ์ด์ƒํ•ด์„œ ๊ณ ์ •๋„ˆ๋น„๋ฅผ ์ง€์›Œ๋ดค๋Š”๋ฐ ์Šคํฌ๋กค๋ฐ”์— ์˜ํ•ด ์ž˜๋ฆฌ๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š์•˜๋‹ค.

๊ณผ๊ฑฐ์˜ ๋‚ด๊ฐ€ ์™œ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋Š”.. 

 

ํ•˜์ง€๋งŒ IconButton์€ ์—ฌ์ „ํžˆ ์ฐŒ๊ทธ๋Ÿฌ์ ธ์žˆ์—ˆ๋‹ค. ์™œ์ผ๊นŒ?

 

flex item์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

min-width: auto;  /* min-content size๋ฅผ ๋”ฐ๋ฆ„ */
flex-shrink: 1;   /* ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ค„์ด๊ฒ ๋‹ค */

flex item์˜ ๊ธฐ๋ณธ๊ฐ’์ธ min-width: auto๋Š” <span>์— ๋“ค์–ด๊ฐ€๋Š” ๊ธ€์ž ์ˆ˜๋งŒํผ ์ตœ์†Œ ๋„ˆ๋น„๋ฅผ ํ™•๋ณดํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

IconButton์ด ๊ฐ€์ง„ px๋Š” ์ €๋Ÿฐ ์ตœ์†Œ ๋„ˆ๋น„ ๊ณ„์‚ฐ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— IconButton์ด ์ฐŒ๊ทธ๋Ÿฌ์ง€๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด span์— min-w-0์„ ์ฃผ๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ์ด ๋ ๊นŒ? ๊ทธ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค.

ํ˜„์žฌ span, IconButton์€ ๋‘˜๋‹ค ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ flex-shrink: 1์„ ๊ฐ€์ง„๋‹ค.

 

flex-shrink์˜ ๋ฐฐ๋ถ„ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

์š”์ปจ๋Œ€, flex-shrink๊ฐ€ 0์ด๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ a๋‹จ๊ณ„์—์„œ ๊ณต๊ฐ„ ๋ฐฐ๋ถ„ ๊ณ„์‚ฐ ์ž์ฒด์—์„œ ์ œ์™ธ๋œ ์ฑ„ ๊ณต๊ฐ„์„ ์œ ์ง€ํ•˜์ง€๋งŒ,

๊ธฐ๋ณธ๊ฐ’์ธ 1์„ ๊ฐ€์ง€๋ฉด ๋น„์œจ์— ๋”ฐ๋ผ์„œ ์ค„์–ด๋“ค ๋ชซ์„ ๋‚˜๋ˆ ๋ฐ›๊ณ  ์ค„์–ด๋“ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

min-w-0์„ ์ฃผ๋ฉด '0๊นŒ์ง€ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค'๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ด์ง€, ์•ˆ์ค„์–ด๋“ค๊ฒ ๋‹ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ.

 

๋”ฐ๋ผ์„œ IconButton์ด ์•„์˜ˆ ์ค„์–ด๋“ค์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด shrink-0์„ ์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๊ทธ๋Ÿผ IconButton์— shrink-0๋งŒ ์ฃผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฑธ๊นŒ?

์•ˆํƒ€๊น์ง€๋งŒ ์•„๋‹ˆ๋‹ค!

IconButton ์ž์ฒด๊ฐ€ ์ฐŒ๊ทธ๋Ÿฌ์ง€์ง€๋Š” ์•Š์•˜๋Š”๋ฐ, ์ •์ค‘์•™์— ์žˆ์–ด์•ผํ•  ์•„์ด์ฝ˜์˜ ์œ„์น˜๊ฐ€ ์ด์ƒํ•ด์กŒ๋‹ค.

 


3. ํ•ด๊ฒฐ2: IconButton์— block ๋Œ€์‹  flex ์ฃผ๊ธฐ

์‚ฌ์‹ค IconButton ๋‚ด๋ถ€์—์„œ Icon์˜ ์œ„์น˜๊ฐ€ ์ด์ƒํ•ด์ง€๋Š” ์ด์œ ๋Š” ๋ช…ํ™•ํ•˜๋‹ค.

<IconButton
  contextStyle="onPanel"
  size="sm"
  icon="IC_MoreVert"
  ariaLabel="์ฑ„ํŒ…๋ฐฉ ๋ฉ”๋‰ด ๋”๋ณด๊ธฐ ๋ฒ„ํŠผ"
  className="hidden shrink-0 group-hover:block"
  onClick={handleButtonClick}
/>

flex์˜ ์†์„ฑ์„ ๋ฏธ์ฒ˜ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•˜๊ณ  '์•ˆ๋ณด์ด๋‹ค๊ฐ€ hoverํ•˜๋ฉด ๋ณด์ด๋„๋กํ•  ๋• ๋ณดํ†ต hidden, block์„ ์‚ฌ์šฉํ–ˆ์ง€!' ์ด ๊ฒฝํ—˜/์ƒ๊ฐ์— ๊ฝ‚ํ˜€์„œ

IconButton์— className์œผ๋กœ block์„ ๋ฎ์–ด์จ๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Icon์ด ์ •์ค‘์•™์— ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” flex์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” items-center, justify-center ๋•๋ถ„์ด๋‹ค.

 

๋”ฐ๋ผ์„œ ์œ„์—์„œ block ๋Œ€์‹  flex๋ฅผ ์ฃผ๋ฉด ์ฐŒ๊ทธ๋Ÿฌ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋œ๋‹ค.

 

 

 

 

 

ํฌ๊ฒŒ ๋ณ„ ๊ฒŒ ์žˆ์—ˆ๋˜ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ flex-shrink๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ๊ฒŒ๋œ ๊ฒƒ ๊ฐ™์•„์„œ ์ •๋ฆฌํ•ด๋ดค๋‹ค.

w3.org๋ฅผ ํ‰์†Œ์— ์ •๋…ํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•  ์ˆ˜๋Š” ์—†๊ฒ ์ง€๋งŒ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฌธ์ œ ์ƒ๊ฒผ์„ ๋•Œ ํ•œ๋ฒˆ์”ฉ ์ฝ์–ด๋ณด๋ฉด ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.

ํŠนํžˆ flex์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์‹ค ํฌ์ง€์…”๋‹ ํ‚ค์›Œ๋“œ์™€ ๋™์ž‘ ์ž์ฒด๋งŒ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ

๋ฌธ์ œ๋Š” ๊ทธ ๋™์ž‘์ด ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋˜๋Š”์ง€ ๋ชจ๋ฅด๋Š” ๋ฐ์—์„œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค.

 

๋‹จ์ .. ๊ฐ€๋…์„ฑ ๊ฝค ๋–จ์–ด์ง€๊ณ  ํ•œ๊ตญ์–ด๊ฐ€ ๋งŽ์ด ๋ถ€์‹คํ•ด์„œ ์˜์–ด๋กœ ์ฝ์–ด์•ผํ•จ

 

 

 

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•