설치
npm i styled-components
컴포넌트 생성 및 적용
import styled from "styled-components";
const Main = styled.div`
background: #555;
`;
function App() {
return (
<Main>
<div>
<h1>Hi</h1>
</div>
</Main>
);
}
export default App;
styled
뒤에 붙는 태그는 유효한 HTML
태그여야 한다.백틱(``)
내부에는 CSS
프로퍼티여야 한다.className
을 갖는다.className
도 같다.props
를 이용해 커스텀 프로퍼티를 보낼 수 있다.const Box = styled.div`
background-color: ${(props) => props.bgColor};
width: 100px;
height: 100px;
`;
function App() {
return (
<Father>
<Box bgColor="teal" />
<Box bgColor="tomato" />
</Father>
);
}
styled(component)
를 통해 해당 컴포넌트가 가진 속성을 다른 컴포넌트의 기본 속성으로 이용할 수 있다.const Box = styled.div`
background-color: ${(props) => props.bgColor};
width: 100px;
height: 100px;
`;
const Circle = styled(Box)`
border-radius: 50px;
`;
function App() {
return (
<Father>
<Box bgColor="teal" />
<Circle bgColor="tan" />
</Father>
);
}
as
를 사용한다.const Btn = styled.button`
color: white;
background: tomato;
border: 0;
border-radius: 15px;
`;
function App() {
return (
<Father>
<Btn>Log in</Btn>
<Btn as="a" href="/">
Log in
</Btn>
</Father>
);
}
button
대신 a
임을 확인할 수 있다.attrs
는 styled components
에서 attributes를 추가하는 기능이다.input
에 required
를 추가한다면, styled.input.attrs({ required: true })``;
을 입력한다.keyframes
함수를 불러와 사용한다.import styled, { keyframes } from "styled-components";
const Rotation = keyframes`
0% {
transform:rotate(0deg);
border-radius:0px;
}
50% {
border-radius:100px;
}
100%{
transform:rotate(360deg);
border-radius:0px;
}
`;
const Box = styled.div`
height: 100px;
width: 100px;
background-color: tomato;
display: flex;
justify-content: center;
align-items: center;
animation: ${Rotation} 1s linear infinite;
`;
keyframes
에 사용하는 문법은 CSS
에서의 애니메이션과 동일하다.
컴포넌트 적용 시에는 props
와 마찬가지로 ${}
를 사용한다.
import styled from "styled-components";
const Box = styled.div`
span {
font-size: 36px;
&:hover {
transform: scale(2);
}
&:active {
opacity: 0;
}
}
`;
function App() {
return (
<Box>
<span>😍</span>
</Box>
);
}
export default App;
부모 컴포넌트 내부에 자식 태그명을 입력하고 스타일을 적용한다.
hover
, active
등의 부가적인 효과는 &:효과
와 함께 사용하거나 태그:효과
로 사용한다.
&
은 자기 자신을 의미한다.span
을 p
로 바꾸면 스타일이 적용되지 않는다.import styled from "styled-components";
const Happy = styled.span`
font-size: 98px;
`;
const Box = styled.div`
${Happy}:hover {
transform: scale(2);
}
`;
function App() {
return (
<div>
<Box>
<Happy>😍</Happy>
</Box>
<Happy>💥</Happy>
</div>
);
}
Box
에 속해있는 Happy
는 hover
효과를 받지만, 외부의 Happy
는 효과 적용이 되지 않는다.index.js
에 theme
프로퍼티를 설정해 하위 컴포넌트로 넘겨 커스텀 테마를 사용할 수 있다.// index.js
import React from "react";
import ReactDOM from "react-dom/client";
import { ThemeProvider } from "styled-components";
import App from "./App";
const darkTheme = {
textColor: "whitesmoke",
backgroundColor: "#111",
};
const lightTheme = {
textColor: "#111",
backgroundColor: "whitesmoke",
};
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<ThemeProvider theme={darkTheme || lightTheme}>
<App />
</ThemeProvider>
</React.StrictMode>
);
ThemeProvider
를 호출해 프로퍼티를 설정한다.drakTheme
와 lightTheme
의 프로퍼티가 같기 때문에 설정에 따라 값만 바뀌게 된다.// App.js
import styled from "styled-components";
const Title = styled.h1`
color: ${(props) => props.theme.textColor};
`;
const Wrapper = styled.div`
display: flex;
height: 100vh;
width: 100vw;
justify-content: center;
align-items: center;
background-color: ${(props) => props.theme.backgroundColor};
`;
function App() {
return (
<Wrapper>
<Title>Hello</Title>
</Wrapper>
);
}
export default App;
props
를 통해 theme
를 스타일링한다.theme
별 프로퍼티를 동일하게 설정해야 한다.darkTheme
에 textColor
와 backgroundColor
를 가졌다면, lightTheme
도 textColor
와 backgroundColor
를 가져야 한다.