Javascript
파일 내에서 CSS
를 사용할 수 있게 해주는 대표적인 CSS-in-JS
라이브러리로 React
프레임워크를 주요 대상으로 한 라이브러리 입니다.$ npx create-react-app styled-components-example $ cd styled-components-example $ npm install styled-components $ code .
StyledButton.jsx 파일 생성
src
폴더안에componetns
폴더 생성componetns
폴더안에StyledButton.jsx
파일 생성
StyledButton.jsx
import styled from "styled-components" const StyledButton = styled.button` background: transparent; border-radius: 3px; border: 2px solid palevioletred; color: palevioletred; margin: 0 1em; padding: 0.25em 1em; font-size: 20px; ` export default StyledButton;
App.js
import logo from "./logo.svg" import "./App.css" import StyledButton from "./components/StyledButton" function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> <StyledButton>버튼</StyledButton> </p> </header> </div> ) } export default App
실행 결과
npm start
http://localhost:3000
StyledButton.jsx
import styled, { css } from "styled-components" const StyledButton = styled.button` background: transparent; border-radius: 3px; border: 2px solid palevioletred; color: palevioletred; margin: 0 1em; padding: 0.25em 1em; font-size: 20px; ${props => props.primary && css` background: palevioletred; color: white; `} ` export default StyledButton;
- 해당 스타일 컴포넌트에
primary
로props
가 전달되면 배경색은 연보라색 글자 색상은 흰색으로 스타일을 지정 해줍니다.
App.js
import logo from "./logo.svg" import "./App.css" import StyledButton from "./components/StyledButton" function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> <StyledButton>버튼</StyledButton> <StyledButton primary>버튼</StyledButton> </p> </header> </div> ) } export default App
- 두번째
StyleButton
컴포넌트에만props
를 전달함
실행 결과
- 두번째
StyleButton
컴포넌트에만props
를 전달해서 두번째StyledButton
컴포넌트만 배경색이 연보라색 그리고 글자 색상이 흰색으로 나타나고 있습니다.
StyledButton.jsx
import styled, { css } from "styled-components" const StyledButton = styled.button` background: transparent; border-radius: 3px; border: 2px solid palevioletred; color: palevioletred; margin: 0 1em; padding: 0.25em 1em; font-size: 20px; export default StyledButton;
App.js
import logo from "./logo.svg" import "./App.css" import StyledButton from "./components/StyledButton" import styled from "styled-components" const PrimaryStyledButton = styled(StyledButton)` background: palevioletred; color: white; ` function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> <StyledButton>버튼</StyledButton> <PrimaryStyledButton>버튼</PrimaryStyledButton> </p> </header> </div> ) } export default App
PrimaryStyledButton
스타일 컴포넌트는StyledButton
스타일 컴포넌트의 스타일 속성들을 상속받아 배경색을 연보라색 글자 색상은 흰색으로 확장했습니다.
실행 결과
as
속성을 사용하면 마치 다른 태그 또는 다른 컴포넌트처럼 사용할 수 있습니다.태그
App.js
import logo from "./logo.svg" import "./App.css" import StyledButton from "./components/StyledButton" function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> <StyledButton as="a" href="/"> //a태그로 바꾸고 href 경로로 이동 버튼 </StyledButton> </p> </header> </div> ) } export default App
- 이처럼 스타일 컴포넌트에
as
속성을 지정해주면 원하는 태그의 스타일로 바꿔줄 수 있습니다.StyledButton.jsx
import styled, { css } from "styled-components" const StyledButton = styled.button` background: transparent; border-radius: 3px; border: 2px solid palevioletred; color: palevioletred; margin: 0 1em; padding: 0.25em 1em; font-size: 20px; ${props => props.primary && css` background: palevioletred; color: white; `} ` export default StyledButton;
실행 결과
컴포넌트
App.js
import logo from "./logo.svg" import "./App.css" import StyledButton from "./components/StyledButton" const UppercaseButton = (props) => ( <button {...props} children={props.children.toUpperCase()} /> ) function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> <StyledButton as={UppercaseButton}>button</StyledButton> </p> </header> </div> ) } export default App
- 이처럼 스타일 컴포넌트에
as
속성을 지정해서 원하는 컴포넌트의 스타일을 적용시켜 줄 수 있다.StyledButton.jsx
import styled, { css } from "styled-components" const StyledButton = styled.button` background: transparent; border-radius: 3px; border: 2px solid palevioletred; color: palevioletred; margin: 0 1em; padding: 0.25em 1em; font-size: 20px; ${props => props.primary && css` background: palevioletred; color: white; `} ` export default StyledButton;
실행 결과
React
에서는 class
를 사용하지 않고 대신 JSX
문법으로 className
을 사용합니다.App.js
import logo from "./logo.svg" import "./App.css" import styled from "styled-components" import "./App.css" const StyledMyButton = styled.button`` function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> <StyledMyButton>button1</StyledMyButton> <StyledMyButton className="btn">button2</StyledMyButton> </p> </header> </div> ) } export default App
App.css
.btn { background: transparent; border-radius: 3px; border: 2px solid palevioletred; color: palevioletred; margin: 0 1em; padding: 0.25em 1em; font-size: 40px; }
실행 결과
button1
: 버튼 스타일 컴포넌트button2
: 버튼 스타일 컴포넌트에className
으로 스타일 지정을 해줌
App.js
import logo from "./logo.svg" import "./App.css" import styled from "styled-components" import "./App.css" const StyledMyButton = styled.button` border: 2px solid ${(props) => props.color || "palevioletred"}; color: ${(props) => props.color || "palevioletred"}; ` function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> <StyledMyButton className="btn">button1</StyledMyButton> <StyledMyButton className="btn" color="green"> button2 </StyledMyButton> </p> </header> </div> ) } export default App
- 첫번째
StyledMyButton
컴포넌트에는color
props
를 사용하지 않음- 두번째
StyledMyButton
컴포넌트에는color
props
를 사용함StyledMyButton
컴포넌트에color
속성이 전달되면 테두리와 글자 색상에 해당되는props.color
스타일을 적용하고 아니면 연보라 색상의 스타일을 적용함App.css
.btn { background: transparent; border-radius: 3px; border: 2px solid palevioletred; color: palevioletred; margin: 0 1em; padding: 0.25em 1em; font-size: 20px; }
실행 결과
- 첫번째
StyledMyButton
컴포넌트는color
props
속성이 없으므로className
으로 지정된btn
스타일만 적용됨- 첫번째
StyledMyButton
컴포넌트는color
props
속성이 있으므로className
으로 지정된btn
스타일과 같이props.color
스타일이 적용됨
App.js
import logo from "./logo.svg" import "./App.css" import styled from "styled-components" const StyledMyButton = styled.div` background: transparent; border-radius: 3px; border: 2px solid palevioletred; color: palevioletred; margin: 0 1em; padding: 0.25em 1em; font-size: 20px; :hover { border: 2px solid green; color: green; } ::before { content: "@"; } ` function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> <StyledMyButton>button</StyledMyButton> </p> </header> </div> ) } export default App
실행 결과
- hover 전
- hover 후
App.js
import logo from "./logo.svg" import "./App.css" import { createGlobalStyle } from "styled-components" const GlobalStyle = createGlobalStyle` .Global { color: yellow; } ` function App() { return ( <div className="App"> <GlobalStyle /> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <div className="Global">Global Test1</div> <div>Test</div> <div className="Global">Global Test2</div> </header> </div> ) } export default App
createGlobalStyle
를import
해준다.GlobalStyle
를 생성한뒤 코드 안쪽에는 적용시킬 스타일css
를 입력해준다.GlobalStyle
컴포넌트는 최상위 컴포넌트에 적어주면 적용이 된다.
실행 결과
StyledA.jsx
import styled from "styled-components" const StyledA = styled.a.attrs(props => ({ target: "_BLANK", }))` color: ${props => props.color}; ` export default StyledA
a
태그로 스타일 컴포넌트 생성a
태그로 이동시 새창으로 띄우고 싶은 경우attrs
에서target: "_BLANK"
로 설정
App.js
import logo from "./logo.svg" import "./App.css" import StyledA from "./components/StyledA" function App() { return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <p> <StyledA href="http://google.com">태그</StyledA> </p> </header> </div> ) } export default App
실행 결과
- 태그 클릭시