styled-components를 이용하지 않고 React만을 통해서 웹 퍼블리싱을 하는 방법은 크게 3가지가 있다.
해서... 원래는 3가지 방법을 모두 설명하려 했지만.... 다음에 기회가 되면 하기로 하고, 바로 styled-components로 들어가보자.
어차피 지금 시점에서 React를 쓰면서, styled-components 를 쓰지 않는다는 것은 어불성설이다.
설치
npm i styled-components
주의할 점이 딱 하나 있다. styled-component가 아니라 styled-components 이다. 맨 끝에 s가 반드시 붙어야한다.
실제로 npm 에 styled-component라는 패키지가 이미 존재한다. 따라서 주의가 필요하다. 뭐 악성프로그램은 아니지만, 더 이상 관리가 되지 않는 패키지이며, 우리가 쓰려는 패키지가 아니다!
기본 문법
const Alias = styled.div`
width: 100px;
height: 100px;
`;
function App() {
return(
<div>
<Alias></Alias>
</div>
);
}
////위 문법은 아래와 정확히 같은 기능을 수행한다
function App() {
return(
<div>
<div style={{width : 100, height : 100}}>
</div>
</div>
);
}
보다시피 styled의 메서드로 원하는 HTML 태그를 적어준 뒤 Back Tick 안에 구현하고 싶은 CSS 문법을 그대로 써주면 된다!
참고로 <Alias></Alias>로 쓰나, <Alias />로 쓰나 동일하다. 후자가 전자의 short-cut 인 셈.
응용
말 그대로, 스타일이 입혀진 컴포넌트(styled-components)를 응용하는 방법을 알아보자.
1. Props 활용하기
스타일의 대부분이 비슷하게 겹치는 와중에 한 두개만 달라지는 경우 아래 방법을 유용하게 쓸 수 있다.
가령, 똑같은 디자인의 네모 상자를 두 개 만들고 이들의 색상만 달리하고 싶다면 아래와 같이 작성하면 된다.
import styled from "styled-components";
const Alias = styled.div`
background-color: ${(props) => props.color};
width: 100px;
height: 100px;
`;
function App() {
return (
<div>
<Alias color="blue" />
<Alias color="red" />
</div>
);
}
export default App;
눈치 챘겠지만, 그냥 props를 통해 옵션을 전달한 것 뿐이다.
2. 확장하기
이번에는 확장하는 방법이다. 마치 class 의 상속과 같다. 즉, 여기서 말하는 확장이란, 확장의 대상이 되는 컴포넌트의 모든 CSS 설정을 그대로 승계한 뒤, 독자적인 CSS 설정을 추가하는 것을 의미한다.
import styled from "styled-components";
const Square = styled.div`
background-color: ${(props) => props.color};
width: 100px;
height: 100px;
`;
const Circle = styled(Square)`
border-radius: 50px;
`;
function App() {
return (
<div>
<Square color="blue" />
<Circle color="red" />
</div>
);
}
export default App;
Circle 부분을 유심히 보자. styled에서 이번에는 메서드로 접근하지 않고, styled 함수의 인자로 확장하고 싶은 styled-component인 Square를 전달해주었다. 그리고 해당 컴포넌트에 추가하고 싶은 스타일을 Back Tick 안에 적으면 끝.
3. 태그 바꿔쓰기
내 맘대로 태그 바꿔쓰기가 가능하다. props 를 전달할 때, as라는 props 명으로 원하는 HTML 태그를 전달하면 된다.
import styled from "styled-components";
const Square = styled.div`
background-color: ${(props) => props.color};
width: 100px;
height: 100px;
`;
const Circle = styled(Square)`
border-radius: 50px;
`;
function App() {
return (
<div>
<Square color="blue" />
<Circle color="red" as="button">
Push
</Circle>
</div>
);
}
export default App;
Circle 컴포넌트에서 as를 통해 button 태그를 할당해주었다. 그랬더니 아래와 같이 div가 아닌 button 태그로 HTML이 작성된 모습을 확인할 수 있다.
4. 공통 속성 추가하기
styled-components의 기본 문법에서 HTML태그 부분 하위에는 하나의 메서드가 더 존재한다. 바로 attrs 메서드.
아래와 같이 작성하면, attrs에 적힌 속성을 공통으로 추가 가능하다.
import styled from "styled-components";
const Square = styled.div`
background-color: ${(props) => props.color};
width: 100px;
height: 100px;
`;
const Diamond = styled(Square).attrs({ value: "yes" })`
transform: rotate(45deg);
margin: 20px;
`;
function App() {
return (
<div>
<Diamond color="red" as="button" />
<Diamond color="green" as="button" />
<Diamond color="yellow" as="button" />
<Diamond color="black" as="button" />
<Diamond color="wheat" as="button" />
<Diamond color="tomato" as="button" />
<Diamond color="blue" as="button" />
<Diamond color="orange" as="button" />
<Diamond color="navy" as="button" />
</div>
);
}
export default App;
5. 애니메이션 추가하기
styled-components로부터 styled 뿐만 아니라 keyframes를 추가로 import 해주자.
import styled, {keyframes} from 'styled-components'
그 후 애니메이션을 설명하는 변수를 하나 만들어준다.
const ani = keyframes`
CSS 코드로 작성한 애니메이션
`
이렇게 선언된 변수를 애니메이션을 넣고 싶은 컴포넌트의 styled에 추가해주면 끝.
import styled, { keyframes } from "styled-components";
const ani = keyframes`
0% {
border-radius:0px;
}
50%{
border-radius:100px;
}
100%{
border-radius:0px;
}
`;
const Square = styled.div`
background-color: ${(props) => props.color};
width: 100px;
height: 100px;
`;
const Diamond = styled(Square).attrs({ value: "yes" })`
transform: rotate(45deg);
margin: 20px;
animation: ${ani} 1s linear infinite;
`;
function App() {
return (
<div>
<Diamond color="red" as="button" />
<Diamond color="green" as="button" />
<Diamond color="yellow" as="button" />
<Diamond color="black" as="button" />
<Diamond color="wheat" as="button" />
<Diamond color="tomato" as="button" />
<Diamond color="blue" as="button" />
<Diamond color="orange" as="button" />
<Diamond color="navy" as="button" />
</div>
);
}
export default App;
6. SCSS 문법의 구현
기본적으로 styled-components 문법은 Back Tick 안에 있는 코드를 CSS로 전환시키는데, 이 과정에서 SCSS의 문법을 차용하여 개발 생산성을 끌어올렸다.
참고로 아래와 같은 문법을 Pseudo Selector라고 부르긴 한다.
import styled, { keyframes } from "styled-components";
const ani = keyframes`
0% {
border-radius:0px;
}
50%{
border-radius:100px;
}
100%{
border-radius:0px;
}
`;
const Square = styled.div`
background-color: ${(props) => props.color};
width: 100px;
height: 100px;
`;
const Diamond = styled(Square).attrs({ value: "yes" })`
transform: rotate(45deg);
margin: 20px;
animation: ${ani} 1s linear infinite;
span {
font-size: 40px;
&:hover {
font-weight: bolder;
}
}
`;
function App() {
return (
<div>
<Diamond color="red" as="button" />
<Diamond color="green" as="button" />
<Diamond color="yellow" as="button" />
<Diamond color="black" as="button" />
<Diamond color="wheat" as="button">
<span>Hi</span>
</Diamond>
<Diamond color="tomato" as="button" />
<Diamond color="blue" as="button" />
<Diamond color="orange" as="button" />
<Diamond color="navy" as="button" />
</div>
);
}
export default App;
참고로, span 대신에 styled-components 로 만든 컴포넌트가 오는 것은 당연히 가능하다!
import styled, { keyframes } from "styled-components";
const ani = keyframes`
0% {
border-radius:0px;
}
50%{
border-radius:100px;
}
100%{
border-radius:0px;
}
`;
const Hello = styled.span`
font-size: 40px;
`;
const Square = styled.div`
background-color: ${(props) => props.color};
width: 100px;
height: 100px;
`;
const Diamond = styled(Square).attrs({ value: "yes" })`
transform: rotate(45deg);
margin: 20px;
animation: ${ani} 1s linear infinite;
${Hello}:hover {
font-weight: bolder;
}
`;
function App() {
return (
<div>
<Diamond color="red" as="button" />
<Diamond color="green" as="button" />
<Diamond color="yellow" as="button" />
<Diamond color="black" as="button" />
<Diamond color="wheat" as="button">
<Hello>Hi</Hello>
</Diamond>
<Diamond color="tomato" as="button" />
<Diamond color="blue" as="button" />
<Diamond color="orange" as="button" />
<Diamond color="navy" as="button" />
</div>
);
}
export default App;
7. GlobalStyle 만들기
styled-components는 본질적으로 css설정을 각 컴포넌트 단위로 분리시켜준다. 하지만, 가끔은 웹페이지 전체에 공통으로 적용할 글로벌 설정이 필요하다. 그럴때 필요한 것이 바로 GlobalStyle이다.
const GlobalStyle = createGlobalStyle`
CSS 코드
`
이렇게 작성한 GlobalStyle은 Fragment 문법으로 적용하면 된다.(컴포넌트의 병렬적 나열)
'Learning-Log > Computer Science' 카테고리의 다른 글
[ReactJS] react-router의 useParams 에 대해 알아보자 (0) | 2022.07.16 |
---|---|
[JS] 모듈을 받아오는 import와 모듈을 내보내는 export (0) | 2022.07.15 |
[NestJS] NestJS, 한 번 빠지면 벗어날 수 없는 마성의 늪(3) : NestJS를 이해하기 위한 First Class Function, Closure 그리고 Decorator (0) | 2022.07.11 |
[NestJS] NestJS, 한 번 빠지면 벗어날 수 없는 마성의 늪(2) : NestJS 시작하기 & Express 프로젝트를 Nest로 마이그레이션 하는 경우 (0) | 2022.07.11 |
[WSL] Ubuntu에서 현재 디렉토리를 윈도우 탐색기로 열기 (0) | 2022.07.11 |