css를 모듈화
하는 방법
CSS 파일
필요CSS 전처리기 활용(SCSS)
javascript 안에서 css를 정의하는 방법입니다. 코드를 구성하는 더 나은 방법으로는 코로케이션
이 있습니다. 이는 단일 컴포넌트에 관련된 모든 것을 같은 위치
에 두는 것입니다. CSS-in-JS는 이러한 코로케이션 방법을 사용할 수 있습니다. 가장 유명한 CSS-in-JS 라이브러리에는 styled-components, emotion 가 있습니다.
코로케이션에 대해 자세히 알아보기: https://kentcdodds.com/blog/colocation
emotion의 사용 방법을 간단하게 살펴보려고 합니다.
emotion은 css함수를 사용합니다. import를 해주고 css Prop(css 함수)를 사용하기 위한 준비를 해줍니다.
// JSX Pragma
/** @jsxImportSource @emotion/react */
//css 함수
import { css } from '@emotion/react';
{
"presets": ["@emotion/babel-preset-css-prop"]
}
/** @jsx jsx */
import { jsx } from '@emotion/react'
위 세가지의 방법중 하나를 선택해서 css prop을 사용할 준비를 합니다. 두가지 모두 React.createElemet 대신 emoion's jsx 함수로 컴파일 되도록 해줍니다.
html에 태그에 css 속성을 넘기고 해당 속성에 css 함수의 결과값을 넘깁니다.
html에 태그에는 css 속성이 없지만 위에서 React.createElemet 대신 emoion's jsx 함수로 컴파일 되도록 해주었기 때문에 사용 가능
css 함수의 결과값을 넘기는 방법은 2가지가 있습니다.
function App() {
return <div css={css`
backgroud: yellow;
`}>노란색 영역</div>
}
function App() {
return <div css={css({
backgroud: "yello";
})}>노란색 영역</div>
}
//css 함수 생략
function App() {
return <div css={{
backgroud: "yello";
}>노란색 영역</div>
}
스타일을 지정할때 보통 css에서 사용하는 케밥 케이스(rocket-launch-duration)가 아닌 자바스크립트에서 사용하는 카멜 케이스(rocketLaunchDuration) 사용
const Button({children}) => {
return (
<button css={
다른 스타일...
}>
{children}
</button>
);
}
function App() {
return <Button>Button</Button>;
}
export default App;
const colors = {
default = "rgb(36, 41, 47)",
danger = "rgb(207, 34, 46)",
outline = "rgb(9, 105, 218)",
}
const Button({children}) => {
return (
<button css={
다른 스타일...
}>
{children}
</button>
);
}
function App() {
return <Button>Button</Button>;
}
export default App;
const colors = {
default = "rgb(36, 41, 47)",
danger = "rgb(207, 34, 46)",
outline = "rgb(9, 105, 218)",
}
const Button({children, variant="defualt"}) => {
return (
<button css={
다른 스타일...
}>
{children}
</button>
);
}
function App() {
return (
<Button variant="defualt">Button</Button>;
<Button variant="danger">Button</Button>;
<Button variant="outline">Button</Button>;
);
}
export default App;
const colors = {
default = "rgb(36, 41, 47)",
danger = "rgb(207, 34, 46)",
outline = "rgb(9, 105, 218)",
}
const Button({children, variant="defualt"}) => {
return (
<button css={
다른 스타일...,
color: colrs[variant],
}>
{children}
</button>
);
}
function App() {
return (
<Button variant="defualt">Button</Button>;
<Button variant="danger">Button</Button>;
<Button variant="outline">Button</Button>;
);
}
export default App;
const Button({children}) => {
return (
<button css={
다른 스타일...
}>
{children}
</button>
);
}
function App() {
return <Button>Button</Button>;
}
export default App;
const sizeStyles = {
sm: {
fontSize: '12px',
padding: '3px 12px'
},
md: {
fontSize: '14px',
padding: '5px 16px'
},
lg: {
fontSize: '16px',
padding: '9px 20px'
}
}
const Button({children}) => {
return (
<button css={
다른 스타일...
}>
{children}
</button>
);
}
function App() {
return <Button>Button</Button>;
}
export default App;
const sizeStyles = {
sm: {
fontSize: '12px',
padding: '3px 12px'
},
md: {
fontSize: '14px',
padding: '5px 16px'
},
lg: {
fontSize: '16px',
padding: '9px 20px'
}
}
const Button({children, size='sm'}) => {
return (
<button css={
다른 스타일...
}>
{children}
</button>
);
}
function App() {
return (
<Button size="sm">Button</Button>;
<Button size="md">Button</Button>;
<Button size="lg">Button</Button>;
);
}
export default App;
스프레드 연산자 사용
)const sizeStyles = {
sm: {
fontSize: '12px',
padding: '3px 12px'
},
md: {
fontSize: '14px',
padding: '5px 16px'
},
lg: {
fontSize: '16px',
padding: '9px 20px'
}
}
const Button({children, size="sm"}) => {
return (
<button css={
다른 스타일...,
...sizeStyles[size]
}>
{children}
</button>
);
}
function App() {
return (
<Button size="sm">Button</Button>;
<Button size="md">Button</Button>;
<Button size="lg">Button</Button>;
);
}
export default App;
Bootstrap, Material, Tailwind