ram2 ๐Ÿš—

styled components ๋ณธ๋ฌธ

๐Ÿ–ฅ๏ธ react

styled components

coram22 2022. 12. 27. 07:45
728x90
๋ฐ˜์‘ํ˜•

์ฒ˜์Œ์œผ๋กœ react๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚˜์„œ css ์‚ฌ์šฉ์— ์ต์ˆ™์น˜ ์•Š๊ณ , ์•„์ง ํ๋ฆ„์„ ์ œ๋Œ€๋กœ ์žก์ง€ ๋ชปํ•œ ์ƒํƒœ์—์„œ ๊ฐœ๋ฐœ์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— component ์ด๋ฆ„์„ ์–ด๋–ป๊ฒŒ ์ •ํ•˜๋Š”์ง€๋„ ์ž˜ ์•Œ์ง€ ๋ชปํ•ด ํ˜ผ๋ž€์Šค๋Ÿฌ์› ๋‹ค.

์ผ๋‹จ ํ•ด๋ด์•ผํ•œ๋‹ค๋Š” ์ƒ๊ฐ, html, css, js ๋ชจ๋‘ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ๋งŒํผ ๊ฒฐ๊ณผ๋ฌผ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์— ์ผ๋‹จ ๋›ฐ์–ด๋“ค์—ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ๋‚˜๋กœ ์ธํ•ด style ๊ฐ„์„ญ์ด ์ผ์–ด๋‚˜๋ฒ„๋ ธ๋‹ค...

 

๊ฒฐ๊ตญ ๋‚˜๋Š” ์ž ์‹œ ํ”„๋กœ์ ํŠธ์— ์†์„ ๋–ผ๊ฒŒ ๋˜์—ˆ์ง€๋งŒ ์ด๋ฒˆ ์ผ์„ ํ†ตํ•ด style ๊ฐ„์„ญ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์‹คํ•˜๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ ,

๋‹ค์‹œ๋Š” ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ๋‹ค์ง์„ ํ–ˆ๋‹ค.

๊ณต์œ  ๋ฐ›์€ styled components์— ๋Œ€ํ•œ ๊ธ€์„ ๊ณต๋ถ€ํ•˜๊ณ , ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋‹ค.

 


styled components์˜ ํ•„์š”์„ฑ

์ค‘๋ณต๋œ ํด๋ž˜์Šค๋ช…์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด, ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋ฅธ ๋ชฉ์ ์„ ์œ„ํ•ด ๋งŒ๋“  ํด๋ž˜์Šค๊ฐ€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฉด, ๊ฐ๊ฐ์— ๊ฐ„์„ญํ•˜๊ฒŒ ๋˜์–ด ์˜ํ–ฅ์„ ๋ผ์น˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ styled components ์ด๋‹ค.

 

Styled components

styled components๋Š” ํŠน์ • ์Šคํƒ€์ผ์ด ์ฒจ๋ถ€๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํŒจํ‚ค์ง€์ด๋‹ค.

์ด ํŒจํ‚ค์ง€๋ฅผ ์ ์šฉํ•˜๋ฉด ํ•ด๋‹น ์Šคํƒ€์ผ์ด ์ฒจ๋ถ€๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ , ๋‹ค๋ฅธ ๊ฒƒ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

 

styled components ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1. styled components๋ฅผ npm ์„ค์น˜ ํ•œ๋‹ค.

2. ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•ด๋‹น ํŒจํ‚ค์ง€ import

 

styled.ํƒœ๊ทธ(๋ฐฑํ‹ฑ) ๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.  (styled.ํƒœ๊ทธ`` )

๋ฐฑํ‹ฑ ๊ด€๋ จ ๊ตฌ๋ฌธ์„ tagged template literal์ด๋ผ๊ณ  ํ•œ๋‹ค๋Š”๋ฐ,์ด ๋ถ€๋ถ„์€ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ„๋‹ค.

(๋ฐฑํ‹ฑ์€ ' (์ž‘์€ ๋”ฐ์˜ดํ‘œ)์™€ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ธด ๋ฌธ์ž์ด๋‹ค. ์ด๊ฒƒ์กฐ์ฐจ ๋ชฐ๋ž๋˜ ๋‚˜...)

 

styled๋Š” importํ•˜๋Š” ๊ฐ์ฒด์ด๊ณ , ๊ทธ ์˜†์— ๋ช…์‹œํ•œ 'ํƒœ๊ทธ'์˜ ๋ฉ”์†Œ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ๋ฐฑํ‹ฑ ์‚ฌ์ด์— ๋“ค์–ด๊ฐ„ ๋ถ€๋ถ„์ด ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด ๋ฐฑํ‹ฑ ์‚ฌ์ด์— ์žˆ๋Š” ๊ฒƒ์ด ๊ฒฐ๊ตญ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋กœ ์ „๋‹ฌ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํƒœ๊ทธ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ƒˆ๋กœ์šด ํƒœ๊ทธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๊ธ€์„ ๊ณ„์† ์ฝ๋‹ค ๋ณด๋‹ˆ styled components๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค.

์ด๋ฆ„์„ ์–ด๋–ค ์‹์œผ๋กœ ์ƒ์„ฑํ•˜๋Š”๊ฑด์ง€, ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š”์ง€ ์˜๋ฌธ์ด ์ƒ๊ฒผ๋‹ค.

-> styled components๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ๋“ค์˜ class ๋ช…์€ ํ•ด๋‹น ํŒจํ‚ค์ง€์— ์˜ํ•ด '๋™์ '์œผ๋กœ ์ƒ์„ฑ์ด ๋œ๋‹ค.

-> ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

styled components์—์„œ css pseudo ์„ ํƒ์ž ๋ฐ ์ค‘์ฒฉ ์„ ํƒ์ž

์ด ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•˜๊ธฐ ์ „์— css pseudo ์„ ํƒ์ž์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์•Œ๊ณ  ์‹ถ์—ˆ๋‹ค.

pseudo๋Š” ๋ณดํ†ต ๊ฐ€์ƒ์ธ ๊ฒƒ์— ์ด๋ฆ„์ด ๋ถ™๋Š”๋ฐ, ์ด ๋˜ํ•œ ๊ทธ๋Ÿฌํ–ˆ๋‹ค. ์šฐ๋ฆฌ ๋ง๋กœ๋Š” '๊ฐ€์ƒ ์„ ํƒ์ž'๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

css pseudo ์„ ํƒ์ž๋Š” html์š”์†Œ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ์š”์†Œ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ์„ ํƒํ•˜์—ฌ ๊พธ๋ฉฐ์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

css pseudo ์„ ํƒ์ž์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋Š” ์ด ๊ธ€์—์„œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค. (https://bio-info.tistory.com/67)

 

๋‹ค์‹œ ๋Œ์•„์™€ styled components์—์„œ css pseudo ์„ ํƒ์ž ๋ฐ ์ค‘์ฒฉ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด ๊ฒฝ์šฐ, & ์ด๋ ‡๊ฒŒ ์ƒ๊ธด ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. &:hover ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ค‘์ฒฉ ์„ ํƒ์ž์˜ ๊ฒฝ์šฐ, & label ํ˜น์€ &.invalid์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

& ๊ธฐํ˜ธ๋Š” ์ƒ์„ฑ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. 

 

styled components์—์„œ props ์ „๋‹ฌํ•˜๊ธฐ

styled components์— props๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฐฑํ‹ฑ ์•ˆ์—์„œ ๊ทธ props๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํƒ€์ผ์„ ๋™์ ์œผ๋กœ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” ๋ฐฑํ‹ฑ ์‚ฌ์ด์— $ ๊ธฐํ˜ธ์™€ ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„œ๋กœ ๋‹ค๋ฅธ ์„ธ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ํ†ตํ•ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

<CircleStyled invalid={true}/>
// case 1
const CircleStyled = styled.div`
  border-radius: 100%;
  background-color: ${({ invalid }) => invalid ? 'red' : 'black'};
`;
// case 2
const CircleStyled = styled.div(({ invalid ) => `
  border-radius: 100%;
  background-color: ${invalid ? 'red' : 'black'};
`);
// case 3
const CircleStyled = styled.div`
  ${({ invalid }) => `
    border-radius: 100%;
    background-color: ${invalid ? 'red' : 'black'};
  `}
`);

 

styled component์—์„œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ

๋นˆ์‘ํ˜•์„ ์œ„ํ•ด ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋ฅผ styled component์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด ๋•Œ๋Š” @media์™€ ์˜† ์กฐ๊ฑด์„ (min-width: 700px)์ฒ˜๋Ÿผ ์ ๊ณ , ํ•ด๋‹น ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ์‹œ ์ ์šฉ๋  ์Šคํƒ€์ผ์„ ์ ๋Š”๋‹ค.

const Button = styled.button`
	width: 100%;

	@media (min-width: 700px) {
		// ๋ธŒ๋ผ์šฐ์ € ํญ์ด 700px ์ด์ƒ์ธ ๊ฒฝ์šฐ์— ์ ์šฉ๋˜๋Š” ์ฝ”๋“œ
		width: auto;
	}
`

 

 

์ด๋ ‡๊ฒŒ styled component์— ๋Œ€ํ•œ ๋‹ค์Œ ๊ธ€์„ ์ฝ๊ณ  ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

https://velog.io/@jangws/%EC%8A%A4%ED%83%80%EC%9D%BC-%EA%B0%84%EC%84%AD%EC%9D%84-%EB%B0%A9%EC%A7%80%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-styled-components%EC%99%80-css-module

 

์Šคํƒ€์ผ ๊ฐ„์„ญ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ styled components์™€ css module

์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ์— css ํŒŒ์ผ์„ importํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด์˜ ์ผ๋ฐ˜์ ์ธ ์Šคํƒ€์ผ๋ง ๋ฐฉ์‹์€ ์Šคํƒ€์ผ์˜ ์Šค์ฝ”ํ”„๊ฐ€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š๋Š”๋‹ค. ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์ˆ˜๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ™์€ ์ฝ”๋“œ์—์„œ

velog.io

 

์ด์ œ๋Š” ์กฐ๊ธˆ ๋” ์ต์ˆ™ํ•˜๊ฒŒ, ํ๋ฆ„์„ ํŒŒ์•…ํ•˜์—ฌ ์ฆ๊ฒ๊ฒŒ ์ฝ”๋”ฉํ•˜๊ณ  ์‹ถ๋‹ค...

 

(์›น์„ ๋„ˆ๋ฌด ๋งŒ๋งŒํ•˜๊ฒŒ ๋ดค๋˜ ๋‚˜... ๋ฐ˜์„ฑํ•ด...)

728x90
๋ฐ˜์‘ํ˜•