복잡한 작업 쉽게, 스타일 코드의 재활용성, 가독성 높여 유지보수 쉽게
.scss와 .sass가 있지만 css 문법과 비슷한 .scss 사용
설치 : yarn add node-sass@4.14.1
변수 사용하기
$red: $fa5252;
...
background: $red
CSS selector 편리하게 사용
.SassComponent{
.box{
...
}
}
.SassComponent{
.box{
&.red
}
}
mixin : 재사용되는 스타일 블록을 함수처럼 사용가능
@mixin square($size){
$calculation: 32px * $size;
width:$calculation;
height: $calculation;
}
&.red{
@include square(1)
}
스타일 적용하는 JS에 import './SassComponent.scss'
프로젝트 폴더 구조가 깊어졌다면 그 파일에 접근하기 위해 ../../../ 이런식으로 복잡해진다.
sass-loader 커스타마이징으로 해결이 가능하다.
순서
concat({
loader: require.resolve('sass-loader'),
options: {
sassOptions: {
includePaths: [paths.appSrc + '/styles'],
},
sourceMap: isEnvProduction && shouldUseSourceMap,
//prependData: `@import 'utils';`,
},
}),
sass-loader을 커스터마이징 했다면 @import 'utils.scss' 만 적으면 된다.
@import 'utils';
, 주석을 지우면 알아서 import 해준다.파일이름 .module.css 확장자로 저장하면 알아서 작동
CSSModule.module.css
.wrapper{
...
}
:global .something{
...
}
해당 JS 파일에서
import style from './CSSModule.module.css'
<div classNames={styles.wrapper}>
global로 전역 스타일을 지정할 수 있다.
<span classNames="something">
클래스를 두 개 이상 넣어야 할 때
<CSS>
.wrapper{
...
}
.inverted{
...
}
<JS>
<div classNames={`${styles.wrapper} ${styles.inverted}`}>
classnemes('one','two') // one two
classnemes('one', {two: true}) // one two
classnemes('one', {two: false}) // one
<div className={classnames('MyComponent',{highlight}, theme)}>
<div className={classnames(`MyComponent ${theme} {hightlight ? 'highlight' : ''}`)}>
bind 함수를 사용하여 CSS Module의 styles.[클래스 이름]에서 styles.를 제거
코드
import classNames from 'classnames/bind'
import styles from './CSSModule.module.css'
cosnt cx = classNames.bind(styles)
<div className={cx{'wrapper', 'inverted'}}>
SCSS도 module로 만들어 쓸 수 있음.
CSS Module이 아닌데 쓰는 방법
:local .wrapper
자바스크립트 파일 안에 스타일 선언하기 ( CSS-in-JS 방식 )
여러 라이브러리 중 Styled-components
설치 yarn add styled-components
사용법
import styled, {css} from 'styled-components';
const Box = styled.div`
background: ${props => props.color || 'blue'}
`;
<Box color="black">
로 만든 문자열에 스타일 정보 넣음~~
;~~
const MyComponent = styled.div`
...
`
const MyInput = styled('input');
const StyledLink = styled(Link)``
컴포넌트에게 전달된 props값 참조 가능
const Box = styled.div`
background: ${props => props.color || 'blue'}
`;
<Box color="black">
코드
const Button = styled.button`
~~~
${props =>
props.inverted &&
css`
`
};
<Button inverted= {true}>테두리만</Button>
`
styled-components 안에서 쉽게 설정가능
const Box = styled.div`
width: 1024px;
margin : 0 auto;
@media (max-width: 1024px){
width: 768px
}
`
함수화해서 사용할 수 있음