SCSS를 검색하면, Sass에 대해서 설명하는 글을 먼저 볼 수 있다.
why?
SCSS는 Sass 3버전부터 새롭게 등장했기 때문이다.
SCSS는 Sass의 모든 기능을 지원하는 Superset이다. 게다가 SCSS는 CSS와 거의 비슷한 문법으로 Sass의 기능을 사용할 수 있어 편리하다.
(= CSS 구문과 완전히 호환되도록 새로운 구문을 도입해 만든 Sass의 모든 기능을 지원하는 CSS의 상위집합)
먼저, Sass에 대해서 잠깐 보면
: Syntactically Awesome Style Sheets
CSS(Cascading Style Sheets)의 단점들을 보완하기 위한 CSS 전처리기.
1. 선택자를 만들때 매번 불필요한 부모 요소 선택자를 적어야함
2. 작업, 코드가 많아질수록 유지보수가 불편
...
따라서,
CSS 내 반복되는 내용은 줄이고 보다 효율적으로 스타일시트를 관리하기 위해 Sass가 만들어졌고,
그다음 SCSS로 업그레이드(?) 되었음!
차이점은 (mixin 등 기능이 몇가지 다르지만, 대표적으로)
.text
font-size: 20px
a
color: #fff
.text{
font-size: 10px;
a{
color: #fff:
}
}
본격적으로 SCSS에 대해서 살펴보자.
: CSS 전처리기(Preprocessor)로써 CSS를 더욱 쉽고 편리하게 사용하게 함
SCSS(Sass)는 CSS의 확장 언어이고 스크립팅 언어이다. SCSS(Sass)가 제공하는 문법을 기반으로 코드를 작성한 다음, 이를 컴파일해 CSS 파일을 만든다.
이를 통해,
코드의 재활용성과 가독성을 높임 -> 유지보수 쉬워짐
CSS를 구조화해 사용
CSS의 한계를 보완하기 위해 SCSS(Sass)는 추가 기능과 유용한 도구들을 제공
몇 가지 예시를 보면,
변수 사용
/* css */
.box {
width: 200px;
margin-left: 200px;
background: #e96900 url("/assets/images/bg.jpg");
}
/* SCSS */
$color-primary: #e96900;
$url-images: "/assets/images/";
$w: 200px;
.box {
width: $w;
margin-left: $w;
background: $color-primary url($url-images + "bg.jpg");
}
반복문 사용
/* CSS */
.through:nth-child(1) { width: 20px; }
.through:nth-child(2) { width: 40px; }
.through:nth-child(3) { width: 60px; }
/* SCSS */
@for $i from 1 through 3 {
.through:nth-child(#{$i}) {
width : 20px * $i
}
}
선택자의 중첩(Nesting)을 통해 반복되는 부모요소 선택자 사용 줄임
/* CSS */
.section {
width: 100%;
}
.section .list {
padding: 20px;
}
.section .list li {
float: left;
}
/* SCSS */
.section {
width: 100%;
.list {
padding: 20px;
li {
float: left;
}
}
}
변수 사용 -> CSS 속성값을 통일해서 관리
조건문, 반복문 -> 동적으로 CSS 관리 가능
css-in-css 기법으로 속도가 빠름 (별도의 자바스크립트 전환이 필요 없어서 속도가 빠름)
...(더 많은 장점들이 있을 것이다)
❗️ SCSS를 사용하면 위의 장점들이 있지만, 반대로 단점도 있다.
: 컴포넌트 기반으로 CSS를 작성할 수 있게 도와주는 라이브러리
기존의 웹사이트는 HTML, CSS, JavaScript를 별도의 파일로 두었는데, 최근(벌써 시간이 좀 지났지만..)에는 React나 Vue, Angular와 같은 모던 자바스크립트 라이브러리가 인기를 끌고 컴포넌트 기반 개발 방법이 주류가 되고 있다.
따라서, 각 컴포넌트에 HTML, CSS, JS를 모두 포함하는 패턴이 많이 사용되고 있는 추세여서 CSS-in-JS방식을 많이 선택해서 사용한다.
CSS-in-JS 라이브러리에는 styled-components, emotion 등이 있지만 Styled-components는 사람들이 보편적으로 많이 사용하는 라이브러리 중 하나이다.
Styled Components를 사용하면 컴포넌트 단위로 스타일링하기 때문에 개별 케이스로 분리해 CSS를 작성할 수 있다.(라이브러리를 이용해서 스타일을 바로 입힘 -> 컴포넌트마다 고유한 클래스를 가짐)
이를 통해,
페이지에서 렌더링 되는 요소에 맞춰 자동으로 해당 스타일만 삽입 -> 그때그때 필요한 스타일만 로드 => 컴포넌트 단위의 추상화
import styled from 'styled-components';
const Button = styled.button`
display: block;
padding: 6px 10px;
color: #fff;
font-size: 18px;
border-radius: 3px;
background-color: crimson;
border: 0;
`;
function App() {
return (
<div>
<Button>버튼</Button>
</div>
);
}
export default App;
스타일에 대한 고유 클래스명 생성 -> 중복이나 오타 걱정 X => 진정한 분리 법칙
더이상 사용되지 않는 CSS를 쉽게 삭제 가능 (모든 스타일은 특정 요소와 연결되어 있기 때문에 해당 요소가 삭제되면 스타일도 삭제됨)
동적 스타일링이 편함 -> props를 통해 직관적으로 개별 스타일링 가능
import styled from 'styled-components';
const Button = styled.button`
background-color: ${(props) => porps.bgColor || 'lightgray' };
display: block;
// ...
`;
function App() {
return (
<div>
<Button bgColor="skyblue">확인</Button>
<Button bgColor="salmon">취소</Button>
</div>
);
}
export default App;
// props로 bgColor가 있을 경우 그 값이 적용되고,
// 아니라면 ‘lightgray’ 값이 적용.
밴더 프리픽스 (-webkit-, -moz, -webkit- 등)가 자동생성
SCSS와 마찬가지로 Nesting(중첩) 가능 -> &을 이용한 스타일링
...(더 많은 장점들이 있을 것이다)
❗️ StyledComponents를 사용하면 위의 장점들이 있지만, 마찬가지로 단점도 있다.
둘을 비교해봤는데, 그럼 어떤 것을 쓰는게 더 효과적일까?
어떤 프로젝트를 하느냐에 따라 다르다.
둘의 가장 큰 차이점은
SCSS : css-in-css vs Styled-components : css-in-js
프로젝트에 둘 중, 하나 효과적인 것을 선택해야할 때
css-in-css방식이 효과적일지, css-in-js의 방식이 효과적일지 비교해보고 사용하는게 좋을 듯하다.
사람들이 말하는 '좀 더 적합'한 경우
css in css (SCSS)
css in js (Styled-components)
CSS의 변천사
: CSS -> SCSS -> BEM -> CSS Moudles -> CSS-In-JS -> Tailwind(Atomic CSS) -> Vanilla Extract(Zero-Runtime CSS-In-JS)
위에서 말한 css-in-css, css-in-js 방식의 문제들로 인해 tailwindCSS(부트스트랩처럼 미리 세팅된 유틸리티 클래스 방식), Vanila Extract(Runtime CSS in JS의 문제점을 해결)도 나옴
자료 출처
https://velog.io/@gur0601/Styled-components%EC%99%80-SCSS-%EC%B0%A8%EC%9D%B4
https://nerd-animals.github.io/na-log/post/front-end/html-css/css-vs-scss
https://nykim.work/107
https://devowen.com/352
https://leesoo7595.github.io/til/css/2021/08/01/TIL_0801/
https://velog.io/@ken1204/styled-components-%EC%84%A0%EC%A0%95%EC%9D%98-%EC%9D%B4%EC%9C%A0
https://sunho-doing.tistory.com/entry/Reactjs-Styled-Component
https://sylagape1231.tistory.com/127
https://reveur1996.tistory.com/142
https://reveur1996.tistory.com/137
https://medium.com/styled-components/why-styled-components-2deeed757cfa
https://velog.io/@keumky1/Vanilla-Extract%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
https://velog.io/@lovelys0731/CSS%EC%9D%98-%EC%97%AD%EC%82%AC-%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0
https://seokzin.tistory.com/entry/SCSS-SCSS-%EB%AC%B8%EB%B2%95-%EC%A0%95%EB%A6%AC