Frontend/CSS

[ styled-components ] pseudo selector๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ styled-component ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ

YWTechIT 2022. 6. 1. 17:48
728x90

๐Ÿ“ pseudo selector๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ styled-component ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ

css ์Šคํƒ€์ผ๋ง์„ ํ•˜๋‹ค ๋ณด๋ฉด ์ œ์ผ ๋งˆ์ง€๋ง‰ ๊ธ€์ž๋งŒ ๋‹ค๋ฅธ ์ƒ‰์ƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ด์•ผ ํ•˜๋Š”๋ฐ, ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ styled-component๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ๊ฐ€์ƒ ์„ ํƒ์ž๋ฅผ ์ด์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ , ์ง๊ด€์ ์œผ๋กœ ์Šคํƒ€์ผ์„ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, FormTitle์„ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์ˆ˜๋กœ ์ž…๋ ฅ ํ•ด์•ผํ•˜๋Š” *๋ฅผ FormTitle ์ œ์ผ ๋งˆ์ง€๋ง‰์— ๋ถ™์—ฌ์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

์ฒ˜์Œ์—๋Š” FormTitle๊ณผ Required ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ํ•˜๋‹จ ์ฝ”๋“œ ๋ธ”๋ก์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ–ˆ๋‹ค. ์ฝ”๋“œ ๋ธ”๋ก์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด FormTitle์˜ props์—๋Š” required๊ฐ€ ๋“ค์–ด์˜ค๊ณ (์ด๋•Œ required์˜ ํƒ€์ž…์€ boolean์ด๋‹ค.), required๊ฐ€ true์ด๋ฉด ๋‚ด๋ถ€ spanํƒœ๊ทธ์˜ color๋Š” red๋กœ ์„ค์ •ํ•˜๊ณ  required๊ฐ€ false์ด๋ฉด color๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์ด๋‹ค.

// form.tsx
interface FormTitleProps {
  required: boolean
}

const FormTitle = styled.div<FormTitleProps>`
  ${({ required }) =>
    required &&
    css`
      span {
        color: red;
      }
    `}
`

function App() {
    return (
      <FormTitle required>
        ์ด๋ฉ”์ผ ์ฃผ์†Œ <Required />
      </FormTitle>
  )
}

// required.tsx
export function Required() {
  return <span>*</span>
}
728x90

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋‹ˆ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ƒˆ๋กœ required.tsxํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€๊ณผ ์ฝ”๋“œ๊ฐ€ ํ•œ ๋ฒˆ์— ์ฝํžˆ์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด๋Ÿด ๋•Œ pseudo selector ์ค‘ ํ•˜๋‚˜์ธ ::after๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ์ง๊ด€์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ::after๋Š” HTML์ฝ”๋“œ ๋’ค์— content property๋กœ ๋‚ด์šฉ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๋น„์Šทํ•œ ๊ฐ€์ƒ ์„ ํƒ์ž๋กœ๋Š” ::before๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” HTML์ฝ”๋“œ ์•ž์— content property๋กœ ๋‚ด์šฉ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ::after๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

// form.tsx
interface FormTitleProps {
  required: boolean
}

const FormTitle = styled.div<FormTitleProps>`
  ${({ required }) =>
    required &&
    css`
      ::after {
        content: " *";
      }
    `}
`

function App() {
    return (
      <FormTitle required>
        ์ด๋ฉ”์ผ ์ฃผ์†Œ
      </FormTitle>
  )
}

์ด๋ฒˆ ๊ธ€์„ ํ†ตํ•ด ์Šคํƒ€์ผ์„ ํ•˜๋‚˜ ์ง€์ •ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋กœ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ๋ณด๋‹ค ๊ฐ€์ƒ ์„ ํƒ์ž์™€ ๊ฐ™์€ css ๊ธฐ๋ณธ ์†์„ฑ์„ ์ด์šฉํ•˜๋ฉด ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋ฐฐ์› ๋‹ค.

 

Reference

  1. https://www.w3schools.com/cssref/sel_after.asp
  2. https://www.w3schools.com/cssref/sel_before.asp
  3. https://www.w3schools.com/cssref/tryit.asp?filename=trycss_content
๋ฐ˜์‘ํ˜•