๐Ÿ–ฅFrontEnd/React

Styled-Component ์‚ฌ์šฉํ•˜๊ธฐ, Styled Components ๋ฌธ๋ฒ•, ๊ตฌ์กฐ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ ๋†’๊ฒŒ react ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•, Styled-Component hover ํšจ๊ณผ ์ฃผ๊ธฐ

hellohailie 2022. 6. 30. 13:35

CDD ( Component Driven Development )

โžฅ ๋ถ€ํ’ˆ ๋‹จ์œ„๋กœ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹

โžฅ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•œ๋‹ค. 

โžฅ ์ƒํ–ฅ์‹ ๊ฐœ๋ฐœ

 

Styled-Component (CSS-in-JS๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ ๋ฐฐ๊ฒฝ)

CSS ์ „์ฒ˜๋ฆฌ๊ธฐ ( CSS Preprocessor )

โžฅ CSS๊ฐ€ ๊ตฌ์กฐ์ ์œผ๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋„์›€์„ ์ฃผ๋Š” ๋„๊ตฌ

 

* ๊ฐ CSS ์ „์ฒ˜๋ฆฌ๊ธฐ์— ๋งž๋Š” Compiler๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. (CSS ์ „์ฒ˜๋ฆฌ๊ธฐ ์ž์ฒด๋งŒ์œผ๋กœ๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•จ)

โžฅ ๊ทธ๋ž˜์„œ CSS ํŒŒ์ผ๋“ค์„ ์ž˜ ๊ตฌ์กฐํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ณ , ์ตœ์†Œํ•œ CSS ํŒŒ์ผ์„ ๋ช‡ ๊ฐœ์˜ ์ž‘์€ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ƒ๊ธด ๊ฒƒ์ด๋‹ค.

 

- CSS ์ „์ฒ˜๋ฆฌ๊ธฐ๋กœ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ SASS (CSS๋ฅผ ํ™•์žฅํ•ด ์ฃผ๋Š” ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด)

์žฅ์  : ์Šคํƒ€์ผ์ด ๊ฒน์น˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. (๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

๋‹จ์  : ์šฉ๋Ÿ‰์ด ์ปค์ง„๋‹ค. 

 

- CSS ๋ฐฉ๋ฒ•๋ก ์˜ ๊ณตํ†ต๋œ ์ง€ํ–ฅ์ 

* ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ

* ์ฝ”๋“œ์˜ ๊ฐ„๊ฒฐํ™”(์œ ์ง€ ๋ณด์ˆ˜ ์šฉ์ด)

* ์ฝ”๋“œ์˜ ํ™•์žฅ์„ฑ

* ์ฝ”๋“œ์˜ ์˜ˆ์ธก์„ฑ(ํด๋ž˜์Šค ๋ช…์œผ๋กœ ์˜๋ฏธ ์˜ˆ์ธก)

 

CSS ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ๋Œ€๋‘๋œ BEM, OOCSS, SMACSS ๋“ฑ๋“ฑ

๋‹จ์  : ํด๋ž˜์Šค๋ช… ์„ ํƒ์ž๊ฐ€ ์žฅํ™ฉํ•ด์ง€๊ณ , ์บก์Šํ™”์˜ ๊ฐœ๋…์ด ์—†๋‹ค.

 

๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๊ฐœ๋ฐœ ๋ฐฉํ–ฅ์ด ์ง„ํ™”ํ•˜๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ๊ฐœ๋ฐœ์€ ์บก์Šํ™”์˜ ์ค‘์š”์„ฑ์„ ๋ถˆ๋Ÿฌ์™”๋‹ค. 

CSS๋„ ์ปดํฌ๋„ŒํŠธ ์˜์—ญ์œผ๋กœ ๋ถˆ๋Ÿฌ๋“ค์ด๊ธฐ ์œ„ํ•ด์„œ CSS-in-JS๊ฐ€ ํƒ„์ƒํ–ˆ๋‹ค. 

๋Œ€ํ‘œ์ ์œผ๋กœ Styled-Component๊ฐ€ ์žˆ๋‹ค. 

 

์žฅ์  : ๊ธฐ๋Šฅ์  ๋˜๋Š” ์ƒํƒœ๋ฅผ ๊ฐ€์ง„ ์ปดํฌ๋„ŒํŠธ๋“ค๋กœ๋ถ€ํ„ฐ UI๋ฅผ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ฃผ ๋‹จ์ˆœํ•œ ํŒจํ„ด์„ ์ œ๊ณตํ•œ๋‹ค. 

 

  ํŠน์ง• ์žฅ์  ๋‹จ์ 
CSS ๊ธฐ๋ณธ์ ์ธ ์Šคํƒ€์ผ๋ง ๋ฐฉ๋ฒ• - ์ผ๊ด€๋œ ํŒจํ„ด์„ ๊ฐ–๊ธฐ ์–ด๋ ต๋‹ค. 
!important์˜ ๋‚จ์šฉ
SASS ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•๋ก ์„ ๋„์ž…ํ•ด์„œ ์ปดํŒŒ์ผ๋œ css๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ๋ณ€์ˆ˜,ํ•จ์ˆ˜,์ƒ์† ๊ฐœ๋…์„ ํ™œ์šฉํ•ด์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ, css์˜ ๊ตฌ์กฑํ™” ์ „์ฒ˜๋ฆฌ ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ณ , ๋””๋ฒ„๊น…์˜ ์–ด๋ ค์›€์ด ์žˆ๋‹ค. 
์ปดํŒŒ์ผํ•œ cssํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์ด ์ปค์ง
BEM css ํด๋ž˜์Šค๋ช… ์ž‘์„ฑ์— ์ผ๊ด€๋œ ํŒจํ„ด์„ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  ๋„ค์ด๋ฐ์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ, ์ „์ฒ˜๋ฆฌ ๊ณผ์ • ํ•„์š”์—†์Œ ์„ ํƒ์ž์˜ ์ด๋ฆ„์ด ์žฅํ™ฉํ•ด์ง€๊ณ , ํด๋ž˜์Šค ๋ชฉ๋ก์ด ๋„ˆ๋ฌด ๋งŽ์•„์ง.
Styled-Component
(CSS-in-JS)
์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ css๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ css๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์œผ๋กœ ์บก์Šํ™”, ๋„ค์ด๋ฐ์ด๋‚˜ ์ตœ์ ํ™”๋ฅผ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์Œ ๋น ๋ฅธ ํŽ˜์ด์ง€ ๋กœ๋“œ์— ๋ถˆ๋ฆฌํ•จ.

 


Styled Components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ => ๋ฆฌ์•กํŠธ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅ!!

CSS๋ฅผ ์ปดํฌ๋„ŒํŠธํ™” ์‹œํ‚จ๋‹ค!!

 

์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ์  ํƒ€ํŒŒ!! ๐Ÿงจ

--------------------------------------------------------------

1. class, id ์ด๋ฆ„ ์ง“๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค. 

2. css ํŒŒ์ผ ์•ˆ์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ถ€๋ถ„ ์ฐพ๊ธฐ ํž˜๋“ค๋‹ค. 

3. css ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ์„œ ํŒŒ์ผ์„ ์ชผ๊ฐœ๊ฑฐ๋‚˜ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ฒˆ๊ฑฐ๋กญ๋‹ค. 

4. ์Šคํƒ€์ผ ์†์„ฑ์ด ๊ฒน์น˜๋Š” ๋ฐ”๋žŒ์— ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค. 

--------------------------------------------------------------------

 

                                                                                                                                                                                                              CSS in JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CSS๋„ ์‰ฝ๊ฒŒ Javascript ์•ˆ์— ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, HTML + JS + CSS๊นŒ์ง€ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ JSํŒŒ์ผ ์•ˆ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.    

 

CSS in JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ˜„์žฌ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ => Styled Components

 

Styled Components ์˜ ์„ค์น˜ ๋ฐฉ๋ฒ•

 

# with npm
$ npm install --save styled-components

# with yarn
$ yarn add styled-components

 

package.json์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ (์ถ”๊ฐ€ ์—ฌ๋ถ€๋Š” ์˜ต์…˜์ด์ง€๋งŒ, ์ถ”๊ฐ€ํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ Styled Components๊ฐ€ ์„ค์น˜๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ค„์—ฌ์ค€๋‹ค.)   

 

{
  "resolutions": {
    "styled-components": "^5"
  }
}

           

Styled Components๋ฅผ ์‚ฌ์šฉํ•  ํŒŒ์ผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

 

import styled from "styled-components"

                           


Styled Components ๋ฌธ๋ฒ•

1. ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

 

import styled from "styled-components";

const BlueButton = styled.button`
	background-color : blue;
    color : white;
`;

function App() {
	return <BlueButton>ํŒŒ๋ž€๋ฒ„ํŠผ</BlueButton>
}

export default App;

                                                       

์ด๋Ÿฐ์‹์œผ๋กœ ๋‚˜์˜จ๋‹ค. 

 

 

2. ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌํ™œ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•˜๊ณ  styled() ์— ์žฌํ™œ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ „๋‹ฌํ•ด์ค€ ๋‹ค์Œ, ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ์Šคํƒ€์ผ ์†์„ฑ์„ ์ž‘์„ฑํ•ด์ฃผ๊ธฐ.

     

import styled from "styled-components";

const BlueButton = styled.button`
	background-color : blue;
    color : white;
`;

const RedButton = styled.button`
	background-color : red;
`;

function App() {
	return (
    	<>
        	<BlueButton>ํŒŒ๋ž€๋ฒ„ํŠผ</BlueButton>
            <br />
            <br />
            <RedButton>๋นจ๊ฐ„๋ฒ„ํŠผ</RedButton>
        </>
	);
}

export default App;

                                                                                                                                                                                                                                                                                                                                               

์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๋‹ค. 

 

3. Props ํ™œ์šฉํ•˜๊ธฐ

 

React ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ props๋ฅผ ๋‚ด๋ ค์ค„ ์ˆ˜ ์žˆ๊ณ , ๋‚ด๋ ค์ค€ props ๊ฐ’์— ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

1) Props๋กœ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋งํ•˜๊ธฐ

const Button = styled.button`
	background:${(props) => props.skyblue ? "skyblue" : "white"}
`;

<Button> ์ปดํฌ๋„ŒํŠธ์— skyblue๋ผ๋Š” props๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์žˆ์œผ๋ฉด ๋ฐฐ๊ฒฝ์ƒ‰์œผ๋กœ skyblue, ์—†์œผ๋ฉด white๋กœ ์ง€์ •

 

<Button skyblue>๋ฒ„ํŠผ</Button>

์ด๋ ‡๋‹ค๋ฉด

์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๋‹ค.

 

 

import styled from "styled-components";

const Button1 = styled.button`
  background: ${(props) => (props.skyblue ? "skyblue" : "white")};
`;

export default function App() {
  return (
    <>
      <Button1 skyblue>Button1</Button1>
      <br/>
      <br/>
      <Button1>Button1</Button1>
    </>
  );
}

๊ฒฐ๊ณผ๊ฐ’

2) Props ๊ฐ’์œผ๋กœ ๋ Œ๋”๋งํ•˜๊ธฐ

props์˜ ๊ฐ’์„ ํ†ต์งธ๋กœ ํ™œ์šฉํ•ด์„œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ผญ ์‚ผํ•ญ์—ฐ์‚ฌ์ž๋ฅผ ์“ธ ํ•„์š” ์—†๋‹ค. 

 

import styled from "styled-components";

const Button1 = styled.button`
	backbround: ${(props) => (props.color ? props.color : "white")};
`;

const Button2 = styled.button`
	backbround: ${(props) => (props.color || "white")};
`;

export default function App() {
	return (
    	<>
        	<Button1>Button1</Button1>
     		<Button1 color="orange">Button1</Button1>
      		<Button1 color="tomato">Button1</Button1>
      		<br />
            <br />
      		<Button2>Button2</Button2>
      		<Button2 color="pink">Button2</Button2>
      		<Button2 color="turquoise">Button2</Button2>
        </>
    )
}

 

๊ฒฐ๊ณผ

 

 

4. ์ „์—ญ ์Šคํƒ€์ผ ์„ค์ •ํ•˜๊ธฐ

 

1. GlobalStyle ํŒŒ์ผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์•„๋ž˜ import ํ•ด์ฃผ๊ธฐ

import { createGlobalStyle } from "styled-components";

2. ์„ค์ •ํ•ด์ฃผ๊ณ  ์‹ถ์€ ์Šคํƒ€์ผ ์ž‘์„ฑํ•˜๊ธฐ

const GlobalStyle = createGlobalStyle`
	button {
		padding : 5px;
    	margin : 1px;
    	border-radius : 5px;
	}
`

3. <GlobalStyle> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•ด์ฃผ๊ธฐ

function App() {
	return (
		<>
			<GlobalStyle />
			<Button>์ „์—ญ ์Šคํƒ€์ผ ์ ์šฉํ•˜๊ธฐ</Button>
		</>
	);
}

 


hover ํšจ๊ณผ ์ฃผ๋Š” ๋ฐฉ๋ฒ•

 

import styled from "styled-components";

const NewButton = styled.button`
  padding: 1rem;
  font-size: 2rem;
  background: powderblue;
  border-radius: 1rem;
  transition: 0.5s;
`;

const HoveringButton = styled(NewButton)`
  &:hover {
    background: cornflowerblue;
    color: white;
    transition: 0.5s;
  }
`;

export default function App() {
  return <HoveringButton>Practice!</HoveringButton>;
}

 

https://codesandbox.io/embed/upbeat-panka-6gpmdt?fontsize=14&hidenavigation=1&theme=dark

 

 

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“