Frontend/CSS

[ styled-components ] override ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ œ์ผ ๋†’๊ฒŒ ์„ค์ •ํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•

YWTechIT 2023. 4. 17. 21:28
728x90

๐Ÿ“ override ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ œ์ผ ๋†’๊ฒŒ ์„ค์ •ํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•

styled-components๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ์กด style์„ overrideํ•˜๋Š” ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ œ๋Œ€๋กœ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฒˆ์— ๋งˆ์ฃผํ•œ ์ด์Šˆ๋Š” headlessUI ํŒจํ‚ค์ง€์˜ Dialog ์ปดํฌ๋„ŒํŠธ์— custom style์„ overrideํ•˜๋ ค๋Š”๋ฐ ์˜๋„๋Œ€๋กœ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์Šˆ์˜€๋‹ค.

 

๋ถ€์ง€๋Ÿฐํžˆ ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ styled-component issues - #2620์— ๋‚˜์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ๋Š” ๊ธ€์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์›์ธ์€ React์˜ createPortal์ด์—ˆ๋Š”๋ฐ, portal์˜ ํŠน์„ฑ์ƒ portal์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น element์˜ DOM์ด ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์œ„์น˜๋กœ ๋ณ€๊ฒฝ๋˜๋Š”๋ฐ, styled component๊ฐ€ ๋ฐ”๋€ DOM์˜ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

728x90

์ด๋Ÿฐ ๊ฒฝ์šฐ styled-component์— override๋ฅผ ํ•  ์ˆ˜ ์—†๋ƒ? ๊ทธ๊ฑด ์•„๋‹ˆ๋‹ค. styled-component์—์„œ override๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ œ์ผ ๋†’๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด 2๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ๋Š” !important์ด๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” &&&๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

!important๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๊ณ  ์˜๋„์น˜ ์•Š์€ ๋ถ€์ž‘์šฉ์„ ๋งŽ์ด ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์–ด ์‚ฌ์šฉ์„ ํ•˜์ง€ ์•Š๋Š” ํŽธ์ธ๋ฐ, ๊ตฌ์ฒด์ ์ธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํŠน์ด์„ฑ์— ๊ด€๊ณ„์—†์ด ํ•ด๋‹น ์†์„ฑ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์Šคํƒ€์ผ ์„ ์–ธ์„ ์žฌ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  2. ์—ฌ๋Ÿฌ๊ฐœ์˜ !important๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์œ ์ง€๋ณด์ˆ˜์™€ ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค.
  3. !important์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•œ Style์„ ๋‹ค๋ฅธ element์— ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  4. ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž์™€ ํ˜‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ์˜๋„์น˜ ์•Š์€ ๋ฒ„๊ทธ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๋ก ์ ์œผ๋กœ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ &์€ hash๋กœ ๋ณ€๊ฒฝ๋œ ํด๋ž˜์Šค๋กœ ๋Œ€์ฒด๋œ๋‹ค. ๋”ฐ๋ผ์„œ &๋ฅผ 3๋ฒˆ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ๋‹ค.

const MyStyledComponent = styled(AlreadyStyledComponent)`
  &&& {
    color: palevioletred;
    font-weight: bold;
  }
`

// injected CSS then looks like this
.MyStyledComponent-asdf123.MyStyledComponent-asdf123.MyStyledComponent-asdf123 {
  color: palevioletred;
  font-weight: bold;
}

์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ ์„ ์–ธํ•˜์—ฌ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

const Modal = styled(Dialog)`
  &&& {
    padding: 30px;
  }
`

Reference

๋ฐ˜์‘ํ˜•