React 애플리케이션에서 사용되는 CSS-in-JS 라이브러리입니다.
이 라이브러리를 사용하면 JavaScript 파일 안에서 CSS를 작성할 수 있습니다.
이러한 방식은 컴포넌트 지향 아키텍처와 잘 어울리며,
CSS를 컴포넌트와 함께 유지 및 관리할 수 있도록 도와줍니다.
styled-component 는 제가 제일 좋아하는 CSS-in-JS 라이브러리 입니다. 그리고 제가 가장 많이 쓰는 css 스타일 방법 중에 하나입니다. 하지만 문득 내가 진짜 styled-component 를 재대로 사용하고 있는 것이 맞을까?? 라는 의문이 생겼습니다. 그래서 좀더 자세히 공부를 하다 보니 제가 모르는 부분이 많다는 것을 느껴 제대로 styled-component 를 정리할 겸 이러한 정보들을 공유하기 위해 만들어 보았습니다.
설치
npm install styled-components
사용해보기
사용법은 css 를 사용하고 있을때와 크게 다르지 않습니다.
import styled from "styled-components";
const Box = styled.div`
width: 100px;
height: 100px;
background-color: red;
border-radius: 15px;
`;
function App() {
return <Box />;
}
export default App;
확장
만약 똑같은 styled component 에 각기 다른 배경색을 추가하고 싶다면 어떻게 해야 할까요?
똑같은 styled component 를 만들고 배경만 다르게 만들면 중복 코드가 발생해 코드의 가독성이 안좋아집니다.
그럴 때 사용할 수 있는 방법이 확장 입니다.
css 구조가 거의 동일한데, 몇가지 속성만 다른 경우 사용합니다.
const Box = styled.div`
background-color: ${(props) => props.bgColor};
width: 100px;
height: 100px;
border-radius: 15px;
`;
function App() {
return (
<Container>
<Box bgColor="royalblue" />
<Box bgColor="deeppink" />
</Container>
);
}
bgColor 라는 이름은 개발자 마음대로 이름을 정해줄 수 있습니다.
이렇게 정해준 이름은 styled 안에서 props 로 꺼내줄 수 있습니다.
상속 확장
상속 확장은 다른 styled component 의 스타일을 상속받아 css 를 더 추가하고 싶을 때 사용합니다.
기존에 있던 css 스타일에 border, outline 같은 css 스타일도 추가하고 싶을 때 사용하죠.
const Box = styled.div`
background-color: ${(props) => props.bgColor};
width: 100px;
height: 100px;
border-radius: 15px;
`;
const BigBox = styled(Box)`
padding: 30px;
color: white;
`
function App() {
return (
<Container>
<Box bgColor="royalblue" />
<Box bgColor="deeppink" />
<BigBox bgColor="red"/>
</Container>
);
}
태그 변경을 위한 확장
기존의 styled component 가 <p> Tag 일 때 해당 스타일을 그대로 쓰는 <span> Tag 를 쓰고 싶다면 새로 만들어야 할까요???
만약 새로 만들게 되면 <p> Tag 인 styled component 와 <span> Tag 인 styled component 의 코드가 중복되는 상황이 발생하게 됩니다.
해결 방법은 태그 변경을 위한 확장입니다.
const Text = styled.p`
color: purple;
font-size: 2rem;
font-weight: bold;
`;
function App() {
return (
<>
<Text>Hello</Text>
<Text as="span">Home</Text>
</>
);
}
as 속성을 부여함으로써 <Text> 라는 <p> 를 <span> 으로 만들어 줍니다.
태그 속성 기본값 설정
<input>, <a> Tag 들의 경우에 기본값으로 설정해야 하는 속성들이 있습니다.
예를 들어 <input> 에 경우 type="text" 가 있을 것이고, <a> 는 alt="#" 이 있겠죠.
개발을 하다 동일한 스타일의 <input type="text"/> 를 사용한다면 type="text" 를 계속 써주어야 하는 귀찮음이 있습니다.
styled-components 는 이러한 귀찮음을 해결할 수 있게 도와줍니다.
import styled from 'styled-components';
const CustomInput = styled.input.attrs(props => ({
type: 'text',
placeholder: props.placeholder || 'Enter text here',
}))`
border: 1px solid #ccc;
padding: 10px;
font-size: 16px;
`;
const CustomImage = styled.img.attrs({alt: 'This is an image'})`
width: 300px;
height: 300px;
`
const App = () => {
return (
<div>
<CustomInput placeholder="Type something..." />
<CustomImage src="image.jpg" />
</div>
);
};
애니메이션 추가
styled-components 에 애니메이션을 추가하려면 keyframes 을 import 해주어야 합니다.
import styled, { keyframes } from "styled-components";
const rotate = keyframes`
from {
transform: rotate(0deg);
}
to{
transform:rotate(360deg);
}
`;
const Elem = styled.div`
background-color: royalblue;
width: 100px;
height: 100px;
border-radius: 20px;
animation: ${rotate} 3s linear infinite;
`;
function App() {
return <Elem />;
}
상태 선택자
개발을 하다 보면 hover, active 같은 상태에 따라 스타일을 적용하고 싶을 때가 있을 것입니다.
그럴때 &를 통해 자기자신에 대한 css를 추가적으로 정의할 수 있습니다.
const List = styled.li`
color: black;
&:hover {
color: white;
}
`;
TSX 를 사용하고 있을 때 styled-components
npm i --save-dev @types/styled-components
많은 개발자들이 JSX 로 개발하지만 어떤 사람들은 TypeScript 를 이용해서 개발하는 사람들도 있습니다.
그 때 styled-component 의 props 같은 속성을 사용하게 된다면 Type 속성을 정의해 주어야 합니다.
interface TextData {
bgColor: string;
color?: string;
}
const Text = styled.p<TextData>`
background-color: ${(props) => props.bgColor}
color: purple;
font-size: 2rem;
font-weight: bold;
`;
function App() {
return (
<>
<Text bgColor="orange">Hello</Text>
</>
);
}
이렇게 interface 를 이용해서 styled component 에 들어갈 타입을 정의해 줄 수 있고,
타입을 정의해 주어야 Error 가 발생하지 않습니다.
개발을 하다 보면 그때 그때 필요한 정보들을 찾고 쓴 뒤에 기억속에서 사라져 버리기 때문에 이렇게 정리하는
습관도 나쁘지 않다고 생각합니다. 정리할 때는 시간이 많이 걸리지만 이것도 쌓이고 쌓이면 제 커리어에
많은 도움을 주지 않을까 싶습니다. 😊😊😊😊😊😊😊
'라이브러리' 카테고리의 다른 글
browser-image-compression (1) | 2024.07.15 |
---|---|
React 에서 emtion 사용하기 (1) | 2024.07.09 |
React 에서 gsap 사용하기 (0) | 2024.07.03 |
React 에서 AOS 사용하는 방법 (1) | 2024.05.18 |
React-router-dom (1) | 2024.05.01 |