🔮

2. 파일 분리와 Nesting

파일을 다운로드 받아 살펴봐주세요.

1. 파일 분리 및 주석

1-1. 파일 분리

본격적으로 코딩에 들어가기 전에 프로젝트를 진행할 때 파일들을 어떻게 저장하여 코드들을 관리하는지 보도록 하겠습니다. 아래 이미지를 보면 각 프레임 별(_header.scss, _home.scss) css를 분리하고, variable과 mixin 파일도 따로 분리하였습니다. 그리고 메인 파일인 style.scss에 분리했던 파일들을 import하였습니다. 이렇게 파일을 스타일 별로 기능별로 분리하여 사용할 수 있으며 파일을 기능 별, 레이아웃 별로 분할해서 사용하기 때문에 코드를 관리하기 편리해집니다.(아래 파일을 참고해 주세요)
notion imagenotion image
위 파일에 style.scss파일을 보면 나머지 파일들을 아래처럼 import 하고 있는 것을 볼 수 있습니다. 이때, style.scss 파일에는 @import와 주석 외에는 다른 코드들을 작성하지 않습니다.
notion imagenotion image
 

1-2. 파일명 앞에 언더바 _를 붙이는 이유

  • Partial : '_'(언더스코어)를 붙이지 않는다면 분할 된 파일들 모두가 컴파일되기 때문에 여러개의 .css파일이 나눠서 저장됩니다. 그러나 scss파일의 이름 앞에 ‘_’(언더스코어)를 붙여서 파일명을 정한다면, Sass에게 이 파일이 main파일의 일부분임을 알려줘서 해당 파일은 css파일로 컴파일하지 않고 내부에서 @import 형태로 작동하게 됩니다.
 
※ css는 import할 때 파일 URL을 적어줘야 하지만, Sass에서 import할 때는 확장명을 제외하고 파일명만을 사용할 수 있습니다.
 

1-3. 주석

주석을 한 줄 작성할 때는 //을 사용하고, 작성한 주석 내용은 sass 내에서만 볼 수 있습니다. 여러 줄을 작성할 경우 /*을 사용하고, scss파일이 컴파일 될 때 주석 내용이 css 파일에 나타납니다.
/* 여러줄 주석은 볼 수 있습니다. */ // 한 줄 주석은 볼 수 없습니다.
 

2. 중첩(Nesting)

2-1. 중첩(Nesting)

Nesting(중첩)을 사용하면, html의 시각적 계층 방식과 동일하게 CSS를 중첩하여 작성할 수 있습니다. CSS코드가 구조화 되어 가독성이 높아지며 유지 보수하기 편리해집니다.
<!--HTML--> <nav> <!--nav안에 ul이 중첩되어 있고--> <ul> <!--ul안에 세가지 li가 중첩되어 있다.--> <li>one</li> <li>two</li> <li>three</li> <li>four</li> </ul> </nav>
//Scss //Scss에서도 HTML처럼 계층구조로 스타일을 적용할 수 있다. nav { background : #C39BD3; padding : 10px; height: 50px; ul { display: flex; list-style : none; justify-content: flex-end; li { color: white; margin-right: 10px; } } }
 
 
 
Why. 중첩을 사용하는 이유는?
기존 CSS는 부모에게 상속된 자식 요소에게 스타일을 적용하려고 할 때마다 최상위 선택자를 반복 선언해야 합니다. 하지만 중첩을 사용하면 최상위 선택자를 한번만 선언하여도 자식 선택자에게 스타일을 적용할 수 있게 되어 코드 반복을 줄이게 됩니다.
/*CSS*/ .info-list div { display: flex; font-size: 14px; color: #4f4f4f; } .info-list div dt { font-weight: 700; margin-right: 7px; } /*기존 CSS : info-list에 있는 자식과 자손에게 스타일을 적용하려고 할때마다 부모 선택자를 적어준다*/
//Scss .info-list { div { display: flex; font-size: 14px; color: #4f4f4f; dt { font-weight: 700; margin-right: 7px; } } } // 중첩을 사용하여 부모선택자를 한번만 사용한다. // 그리고 코드를 봤을 때 info-list div tag안에 dt가 들어있음을 한눈에 알아볼 수 있다
⚠️하지만 지나친 중첩된 코드는 삼가 해주세요. 깊이 중첩되면 코드를 보는 게 불편하고 컴파일 했을 경우 불필요한 선택자를 사용하게 됩니다.
 

2-2. 속성 Nesting

중첩은 선택자뿐만 아니라 스타일 속성들도 가능합니다. 아래 예시를 보면 .add-icon이라는 클래스 선택자에게 background 스타일을 주려고 합니다. 이때, background 이름을 가진 속성( background-image, background-position 등)들을 background안에 중첩 시켜서 스타일 코드를 작성할 수 있습니다. 속성을 중첩 할 때는 콜론:을 사용합니다. Sass는 속성이 중첩되었음을 인지하고 css 속성들로 변환합니다.
//Scss .add-icon { background : { image: url("./assets/arrow-right-solid.svg"); position: center center; repeat: no-repeat; size: 14px 14px; } }
/*CSS*/ .add-icon { background-image: url("./assets/arrow-right-solid.svg"); background-position: center center; background-repeat: no-repeat; background-size: 14px 14px; }
 

2-3. ampersand 앰퍼샌드

"&"는 상위에 있는 부모선택자를 가리킵니다.
1) &을 이용하여 after, hover 등의 가상요소, 가상클래스, class나 id 셀렉터 등을 참조할 수 있습니다.
//Scss .box { &:focus{} // 가상선택자 &:hover{} &:active{} &:first-child{} &:nth-child(2){} &::after{} // 가상요소 &::before{} }
/*CSS*/ .box:focus{} /* 가상선택자 */ .box:hover{} .box:active{} .box:frist-child{} .box:nth-child(2){} .box::after{} /* 가상요소 */ .box::before{}
 
Example
//Scss ul { li { &:hover { background: white; cursor: pointer; // 가상요소 } &:last-child { border-bottom: 2px solid black; // 가상클래스 } } } //li 태그의 가상요소와 가상클래스에게 스타일을 적용한 예시 //&을 사용하여 li와 :hover, :last-child를 연결
/*CSS*/ ul li:hover { background-color: white; cursor: pointer; } ul li:last-child { border-bottom: 2px solid black; }
 
2) & 를 응용하면 아래 예시와 같이 공통 클래스 명을 가진 선택자들을 중첩시킬 수 있습니다.
//Scss .box { &-yellow { background: #ff6347; } &-red { background: #ffd700; } &-green { background: #9acd32; } } //.box라는 이름이 같기 때문에 &를 사용해 중첩구조로 만들 수 있다
/*CSS*/ .box-yellow { background: #ff6347; } .box-red { background: #ffd700; } .box-green { background: #9acd32; }
 
💡
⚠️깊은 중첩을 하게 되면서 불필요한 선택자들이 사용되었습니다. 중첩을 과하게 사용하지 않도록 주의해 주세요.
//Scss .nav { height: 60px; font-size: 18px; .nav-list { background: #3e68ff; span { padding: 10px 13px; a { color: white; .one { .two { color: skyblue; } } } } } }
.nav { height: 60px; font-size: 18px; } .nav .nav-list { background: #3e68ff; } .nav .nav-list span { padding: 10px 13px; } .nav .nav-list span a { color: white; } .nav .nav-list span a .one .two { color: skyblue; }
//Scss, 이렇게 사용해도 됩니다. .nav { height: 60px; font-size: 18px; .nav-list { background: #3e68ff; span { padding: 10px 13px; a { color: white; } } } } .one { .two { color: skyblue; } }

2-4. @at-root

@at-root 키워드를 사용하면 중첩에서 벗어날 수 있습니다. 중첩에서 벗어나고 싶은 선택자 앞에 @at-root 를 작성합니다. 컴파일된 css 코드에서 @at-root 를 사용한 선택자가 중첩에서 벗어났음을 확인할 수 있습니다. 중첩된 선택자에게만 사용할 수 있습니다.
//Scss .article { display: flex; justify-content: space-between; align-items: center; margin-top: 10px; .article-content { font-size: 14px; opacity: 0.7; @at-root i { opacity: 0.5; } } }
/*CSS*/ .article { display: flex; justify-content: space-between; align-items: center; margin-top: 10px; } .article .article-content { font-size: 14px; opacity: 0.7; } /*중첩을 빠져나온 것을 확인할 수 있다.*/ i { opacity: 0.5; }
 

3. 전체 실습 코드