비스 2021. 9. 10. 16:39

퓨어 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로 바꿀 예정이다.

 

https://www.sassmeister.com/

 

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 속성 묶음
bg속성 묶음

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)