CSS 전처리기?
다른 웹 퍼블리셔의 포트폴리오를 찾아 보다 보면 능력(어빌리티) 항목에 HTML, CSS, JS, jQuery와 함께 쓰여있는 Sass, Less, Stylus를 보신 적이 있나요? 우리는 잘 알지 못했지만, 실제로 실무에서도 많이 사용하고 있는 CSS 전처리기(Pre-Processor) 입니다. 그렇다면 전처리기는 무엇이고, 왜 사람들이 많이 사용할까요?
CSS는 쉽다. 하지만...
우리가 익혀 왔듯 CSS는 웹 언어 중에서 쉽고 간결한 편에 속합니다. 하지만 우리가 프로젝트(대표적으로 각자가 만들고 있는 개인 포트폴리오가 있겠죠)를 진행하면 할 수록, 작업량이 많아지면 많아질 수록, 그리고 작업이 고도화 될 수록 불편함 역시 같이 커지게 됩니다. 페이지의 컨텐츠와 요소의 양에 따라 선택자는 기하급수적으로 늘어나고, 코드가 쉽게 지저분해지면서 불편한 부분들이 발생할 수 밖에 없습니다. 색상코드를 일일이 기억해야 한다던지, 상속 문제로 인해 특정 class의 이름이 겹쳐서 겹치거나 깨지는 등의 문제가 발생하기도 하고 이는 결국 유지보수도 어려워 진다는 단점이 있습니다. 결국 단순해서 익히기 쉬웠던 CSS가 같은 이유로 우리의 발목을 잡는 경우가 발생합니다.
CSS 전처리기의 등장
"아, 주조색 맨날 똑같은거 쓰는데 변수같은걸로 선언해두고 꺼내쓰는 방법 없나?" 혹시 생각 해본 적 없으세요? 우리만 이런 생각을 한게 아닙니다. 필요성을 느낀 사람들이 스크립트를 이용해 만든 것이 바로 CSS 전처리기입니다. CSS를 HTML처럼 중첩화 하여 구조적으로 보기 쉽게 정리도 가능하고, 변수 사용은 물론 연산, 조건문(if)과 반복문(for), 함수와 매개변수 까지도 사용 가능합니다.
하지만 단점도 분명 존재하죠. 우리가 일반적으로 사용하는 웹브라우저에서는 이 전처리기로 작성된 파일을 CSS로 인식하지 못합니다. 그래서 꼭 거쳐야 하는 것이 바로 컴파일(트랜스파일링)인데요.
쉽게 설명하자면 컴파일은 번역이고, 컴파일러는 구글 번역기입니다. Sass나 Less로 작성한 파일을 컴파일러에 넣게 되면, CSS로 번역을 해주는 거죠. 컴파일을 해서 나온 CSS 파일을 웹으로 연결시켜주면 짜잔! 하고 우리가 원하는 결과물을 얻게 되는 것입니다. 오늘은 여러 전처리기 중 Sass를 기반으로 소개해드릴까 합니다.
Sass, 문법적으로 개 쩌는 스타일시트
시작부터 극찬을 하는게 아니라, 얘 이름의 뜻이 원래 그러합니다. Syntactically Awesome Style Sheets의 줄임말이거든요. (ㅋㅋ;) CSS 전처리기 중에서는 가장 먼저 등장했고, Bootstrap에 쓰여서 많은 사용자를 보유한 Less와 함께 대표적인 전처리기입니다. 프로젝트마다 Less나 Sass를 다르게 쓰는 경우도 있다고는 하는데, 쓰는 방법이 조금 다를 뿐 기능적인 부분에서 큰 차이는 없다고 합니다.
Sass는 .scss 문법이 표준입니다. CSS와 크게 다른 점은 없고, 단순히 기능이 추가 된 수준의 문법이라 아마 처음 접한 여러분들도 손쉽게 따라할 수 있을겁니다.
일단 시작은 프로그램 세팅부터
Visual Studio Code를 이용해 Sass를 처음 만나봅시다.
- VSCode에서 확장 프로그램을 설치합니다.
- Sass
- Live Sass Compiler
- 설정창 오픈(Ctrl+,) 후 최상단 검색창에 Live Sass Compile Map 을 입력합니다. 그 다음 "settings.json에서 편집" 을 클릭하세요.
- settings.json 파일에서 "liveSassCompile~"로 시작하는 설정값에 false 가 들어가 있는지 확인 후 저장합니다.
index.html
파일을 만들고, css 폴더를 만들고, css 폴더 안에style.scss
파일을 생성한 후index.html
에link
태그를 이용하여style.css
를 연결해둡시다.style.css
를 만들 필요는 없습니다. 확장프로그램이 알아서 생성해주니까요.
- 마지막으로
index.html
를 열고, 최하단에 있는 "Watch Sass" 버튼과 "Go Live"(없을 시 Ctrl+L, O) 버튼을 눌러주면 준비가 끝났습니다.
Sass 기능 소개
앞서 소개해드렸듯 Sass에는 기존 CSS에서 제공하지 않았던 많은 기능을 제공합니다. 오늘은 그 중에서 가장 기초적인 기능들을 소개합니다.
주석
Sass에서는 기존 CSS의 주석(/* */
) 말고도 JS에서 사용하던 한 줄 주석(//
) 도 사용 가능합니다. 한 줄 주석은 CSS로 컴파일 되었을 때 나타나지 않습니다.
/* You can See me */
// You can't see me
/* You
Can
See
Mee
*/
/* You can See me */
/* You
Can
See
Mee
*/
변수 (Variable)
Sass에서는 변수 개념을 사용할 수 있습니다. 변수 안에는 숫자, 문자, 폰트, 색상, null 등이 들어갈 수 있고, 선언은 $
문자를 사용합니다. 변수 선언은 CSS로 컴파일이 되더라도 나타나지 않습니다.
$mainColor: #333333; // 주조색
$subColor: #aaaaaa; // 보조색
#header{
background-color: $subColor;
color: $mainColor;
}
#header {
background-color: #aaaaaa;
color: #333333;
}
또한, JS와 마찬가지로 전역변수와 지역변수의 개념이 존재합니다. 변수를 특정 선택자 안에서 선언하면 해당 선택자에서만 사용이 가능합니다. 위치와 관계 없이 전역 변수로 설정 할 때는 !global; 플래그를 붙이면 됩니다.
$mainColor: #333333 !global; // 주조색
$subColor: #aaaaaa !global; // 보조색
#header{
$subColor: #ffffff;
// 헤더 내 보조색은 흰색 사용
background-color: $subColor;
color: $mainColor;
}
#nav{
background-color: $subColor;
color: $mainColor;
}
#header {
background-color: #ffffff;
color: #333333;
}
#nav {
background-color: #aaaaaa;
color: #333333;
}
수학 연산자 (Math Operators)
Sass에서 수학 연산자들을 사용할 수 있습니다. 지원되는 연산자들은 다음과 같습니다.
단, +
와 -
의 경우 단위를 항상 통일시켜 줘야 합니다. 예를 들어, $box-width: 100% - 20px;
는 동작하지 않습니다.
.container { width: 100%; }
section.contents {
float: left;
width: 600px / 960px * 100%;
}
aside.sidebar {
float: right;
width: 300px / 960px * 100%;
}
.container {
width: 100%;
}
section.contents {
float: left;
width: 62.5%;
}
aside.sidebar {
float: right;
width: 31.25%;
}
내장 함수 (Built-in Functions)
Sass에서 기본적으로 제공하는 함수들이 존재합니다. jQuery의 메소드와 비슷한 역할이라고 보시면 되고, 아래에는 색깔을 어둡게 만들어주는 darken
이라는 내장 함수를 사용한 모습입니다. 내장 함수의 종류는 정말 많기에 이 곳에서 모두 소개해드리는 것은 무리이고, 대신 사용 빈도수가 높은 내장 함수를 정리한 블로그를 소개해드립니다. https://m-veloper.github.io/devlog/2020/03/22/sass-15/
$mainColor: #2ecc71;
$mainDark: darken($mainColor, 10%);
#header{
background-color: $mainDark;
}
#header {
background-color: #25a25a;
}
중첩 (Nesting)
저는 사실 다른 기능보다 이걸 처음 봤을때 와 개쩐다! 하는 생각이 들었습니다. Sass에서는 CSS를 HTML처럼 구조화 하여 사용이 가능합니다. 또한 부모 선택자를 다시 들고 와야 하는 경우(가상 요소, 가상 선택자 등) 내부에 &
만 입력하면 바로 적용됩니다.
ul {
li {
float: left;
a {
display: block;
width: 10%;
height: 60px;
color: black;
&:hover {
text-decoration: underline;
color: gray;
}
&::before {
content: "";
display: inline-block;
width: 1px;
height: 14px;
background-color: #333;
}
@at-root .active{
color: red;
}
}
}
}
ul li {
float: left;
}
ul li a {
display: block;
width: 10%;
height: 60px;
color: black;
}
ul li a:hover {
text-decoration: underline;
color: gray;
}
ul li a::before {
content: "";
display: inline-block;
width: 1px;
height: 14px;
background-color: #333;
}
.active {
color: red;
}
단, 위의 예시처럼 중첩해서 넣어 둔 속성(.active
)이 바깥에서도 사용되는 경우도 있을텐데요. 이 땐 해당 선택자 앞에 @at-root
를 넣어주면 됩니다...만, 사실 이 경우는 코드를 잘라서 밖에다 꺼내 놓는게 맞습니다. 다만 이런 기능도 있다~ 정도로 알아두시면 됩니다.
불러오기 (Import)
@import를 사용해 다른 특정 .scss
파일을 불러올 수도 있습니다. 이 때 확장자를 붙이지 않아도 되며, .scss
파일 이름의 시작이 언더바(_
)로 시작하면 CSS 파일로 컴파일 되지 않습니다.
@import "reset.scss";
@import "laysout";
상속 (Extend)
Sass에서 특정 선택자를 상속하는 기능입니다. @extend 선택자;
를 입력하면 해당 속성을 모두 가져올 수 있습니다.
.box {
border: 1px solid gray;
padding: 10px;
display: inline-block;
}
.success-box {
@extend .box;
border: 1px solid green;
}
.box, .success-box {
border: 1px solid gray;
padding: 10px;
display: inline-block;
}
.success-box {
border: 1px solid green;
}
만약, 상속 시킬 선택자가 컴파일이 되지 않는 것을 원하는 경우에는 %(Placeholder) 선택자;
를 만들어 쓰면 됩니다. 프리셋 느낌으로 사용이 가능합니다.
%title_text{
font-family: 'Noto Sans KR';
font-size: 24px;
font-weight: bold;
}
%cont_text{
font-family: 'Noto Serif KR';
font-size: 16px;
font-weight: normal;
}
section{
h3{
@extend %title_text;
}
p{
@extend %cont_text;
}
}
section h3 {
font-family: "Noto Sans KR";
font-size: 24px;
font-weight: bold;
}
section p {
font-family: "Noto Serif KR";
font-size: 16px;
font-weight: normal;
}
믹스인 (Mixin)
Mixin은 Sass의 가장 유용한 기능 중 하나입니다. Placeholder를 이용한 extend와 비슷하지만, Mixin은 매개변수를 받을 수 있어서 코드를 간결하게 만들어주는 일등 공신입니다. 선언은 @mixin
으로, 사용 할 땐 @include
로 사용합니다.
@mixin notosans {
font-family: 'Noto Sans KR';
}
@mixin text-set ($color, $size, $weight) {
color: $color;
font-size: $size;
font-weight: $weight;
}
section{
h3{
@include notosans;
@include text-set(#000, 24px, bold);
}
p{
@include notosans;
@include text-set(#333, 16px, normal);
}
}
section h3 {
font-family: "Noto Sans KR";
color: #000;
font-size: 24px;
font-weight: bold;
}
section p {
font-family: "Noto Sans KR";
color: #333;
font-size: 16px;
font-weight: normal;
}
함수 (Function)
내장 함수가 아닌 직접 함수를 만들어서 쓸 수도 있습니다. 방금 전 알려드린 Mixin과 비슷하게 생겼지만 Mixin은 속성들을 반환하는 반면 Function은 값을 반환합니다. 선언은 @function
, 리턴은 @return
입니다.
@function calc-percent($target, $container) {
@return ($target / $container) * 100%;
}
.my-module {
width: calc-percent(650px, 1000px);
}
.my-module {
width: 65%;
}
출처
Uploaded by N2T