SCSS
퓨어 CSS로 코딩을 하다 보면 코드가 길고 지저분해지는 경우가 많다.
지옥의 CSS... 내용이 너무 길어 접어둠
body {
color: #333;
font-style: 16px;
font-weight: 400;
line-height: 1.4;
font-family: 'Nanum Gothic', sans-serif;
}
img {
display: block;
}
a {
text-decoration: none;
}
.inner{
width: 1100px;
position: relative;
margin: 0 auto;
}
/* 상단 로그인바 */
.header .loginarea{
width: 100%;
position: fixed;
top: 0;
font-size: 12px;
border-bottom: 1px solid #c8c8c8;
background-color: #fff;
z-index: 9;
}
.header .inner{
height: 30px;
}
.header .loginarea .login-items {
margin: auto 0;
position: absolute;
display: flex;
right: 0;
top: 6px;
}
.header .loginarea .login-items .login-item {
color: #333;
padding-left: 15px;
}
/* 메인카테고리 */
.header .menuarea{
position: fixed;
top: 31px;
width: 100%;
border-bottom: 1px solid #c8c8c8;
background-color: #fff;
z-index: 9;
}
.header .menuarea .inner{
height: 90px;
display: flex;
align-items: center;
}
.header .menuarea .logoarea{
width: 500px;
height: 50px;
background-image: url("../images/mainlogo_wtext.png");
background-size: contain;
background-repeat: no-repeat;
}
.header .menuarea .menucontainer {
position: absolute;
right: -35px;
display: flex;
align-items: center;
height: 100%;
}
.header .menuarea .menucontainer .menu-category {
color: #333;
height: 100%;
display: flex;
text-align: center;
align-items: center;
}
.header .menuarea .menucontainer .menu-category:hover{
background-color: #509ff8;
color: #fff;
}
.header .menuarea .menucontainer .menu-category .menu-item {
margin: 0 35px;
font-weight: 700;
box-sizing: border-box;
}
.header .menuarea .menucontainer .menu-category .subcategories {
z-index: 9;
position: fixed;
left: 0;
top: 120px;
width: 100%;
background-color: #509ff8;
display: none;
}
.header .menuarea .menucontainer .menu-category:hover .subcategories {
display: block;
}
.header .menuarea .menucontainer .menu-category .subcategories .inner {
display: flex;
height: 100px;
align-items: center;
}
.header .menuarea .menucontainer .menu-category .subcategories .inner .subcategorylist {
position: absolute;
left: 0;
}
.header .menuarea .menucontainer .menu-category .subcategories .inner a {
font-weight: 700;
font-size: 14px;
color: #fff
}
.header .menuarea .menucontainer .menu-category .subcategories .inner .subcategorylist .subcategoryitems {
display: inline-block;
padding: 0 30px 0 30px;
border-right: 1px solid rgba(255,255,255, .3);
}
.header .menuarea .menucontainer .menu-category .subcategories .inner .subcategorylist .subcategoryitems:first-child {
padding: 0 30px 0 0;
}
.header .menuarea .menucontainer .menu-category .subcategories .inner .subcategorylist .subcategoryitems:last-child {
border-right: transparent;
}
이런 CSS를 좀 더 효율적으로 활용하기 위해 필요한 것이 바로 SCSS다.
SCSS의 주요 개념을 정리하고, 직접 작성한 CSS 코드를 SCSS로 리팩토링해보는 포스팅.
1. SCSS 시작하기
SCSS란 CSS의 표준 전처리기다. 이외에도 less, stylus 등 다양한 CSS 전처리기가 존재한다.
실제 브라우저에서 동작할 때는 CSS로 컴파일되기 때문에 일반 라이브서버만으로는 실행이 불가능하고, npm 환경 하에서 SASS를 인스톨해야 사용할 수 있다.
npm으로 parcel-bundler, sass를 설치해주었다. 이 포스팅은 원래 작성했던 css 코드를 리팩토링하는 과정을 기술하고 있지만, 추후 처음부터 scss로 코드를 작성하게 되더라도 내가 참여하고 있는 프로젝트에서는 scss를 사용하지 않기 때문에 결과물을 팀 vcs에 업로드할때는 아래 링크의 사이트를 통해 css로 바꿀 예정이다.
SassMeister | The Sass Playground!
SassMeister: The sassiest way to play with Sass, Compass, & LibSass! Loading...
www.sassmeister.com
SCSS를 CSS로 컴파일한 결과물을 보여주는 사이트.
2. SCSS의 주요 문법
SCSS는 일반 프로그래밍 언어에서 사용되는 반복문, 변수선언과 같은 개념들을 도입하여 CSS를 한층 더 쉽게 제어할 수 있게 해준다. 또한, 중첩선택자를 지원하여 개판오분전복잡한 CSS 선택자들의 가독성과 개발편의성을 높여준다.
(1) 중첩선택자와 변수선언
SCSS의 변수선언은 $기호를 사용하면 된다. 여러번 반복하여 사용하는 border 속성을 변수로 선언하고, 지저분한 선택자들을 중첩선택자를 통해 깔끔하게 정리해주었다. 이 변수는 여타 프로그래밍 언어와 동일하게 전역변수와 지역변수의 개념을 적용받는다.
- 산술연산자를 사용할 수 있다.
- 단, 나누기 연산자는 css 구분 기호와 동일한 형태를 지니기 때문에 사용에 주의가 필요하다.
- 1) 나눌 값을 변수에 담아 사용하거나 (2) 소괄호로 해당 나눗셈 연산 부분을 괄호로 묶은 뒤 연산을 수행해야 제대로 된 값을 얻을 수 있다.
- 단순 연산자는 단위가 같아야만 작동한다. (ex. calc(100% - 200px)은 연산이 불가능하다.)
(2) 네임스페이스가 동일한 속성들의 제어
font나 background처럼 같은 네임스페이스의 세부속성에 해당하는 항목들을 묶음으로 선언할 수 있다. [네임스페이스: {세부속성}]형태로 선언하면 된다. 그런데 VSCode에서는 이렇게 묶음으로 선언할 경우 경우 세부속성 자동완성 기능을 제공하지 않아서 각별히 편한지는... 가독성은 확실히 좋아지는것같지만.
(3) 반복문
for문을 사용할 수 있다. 아래와 같이 적고 for문을 적용하고 싶은 범위를 중괄호 블럭으로 감싸면 된다.
@for $인덱스변수 from 시작값 though 끝값{ 내용 } |
사진처럼 보간과 함께 활용하는 경우가 많다. 파이썬 포맷팅과 비슷한데 중괄호 앞에 # 하나가 더 붙는다.
(4) 상위선택자 치환
&기호를 사용하면 바로 위에 있는 선택자가 &의 위치로 치환되어 들어간다. 가상선택자 및 각종 이름이 유사한 하위선택자를 만들때 유용하게 사용할 수 있다.
![]() |
![]() |
당연히 일반선택자도 만들어진다
(5) Mixin
Mixin이란, css의 속성값을 재활용하는 것을 의미한다.
@mixin 이름 {
}
@include 이름(인수: 기본)
기본값이면 인수 없어도 됨
인수 당연히 여러개일수 있음
기본적으로는 인수 순서는 맞춰야함
키워드 인수 ($color: blue);
@import "경로1", "경로2"
확장자(SCSS) 안써도 됨
minin 사용시
@content 영역에 추가적인 내용 삽입하여 사용할수도 있음
(6) SCSS에서 함수 선언하기
- 함수
@function ratio{$size, $ratio) {
@return $size * $ratio
}
(7) SCSS의 내장함수들
- 내장함수
mix($color, red);
보라색 됨
lighten(red, 10%)
darken(1, 2)
saturate
desaturate
grayscale 1
invert1 색반전
rgba($color, .5)