📢 어렵고 정석적인 개념 설명보다는 저같은 초보자도 이해하기 쉽게 정리하는 것을 원칙으로 포스팅하고 있습니다. 😄

[SCSS] 선택자 중첩(Nesting)과 부모 선택자 참조 '&'

선택자 중첩

<body>
    <div class="wrap">
        <h1>Hello! Shawn.</h1>
        <ul class="font">
            <li class="font-large">Large</li>
            <li class="font-medium">Medium</li>
            <li class="font-small">Small</li>
        </ul>
        <div id="login">
            <input type="text" />
            <input type="password" />
            <input type="email" />
            <input type="checkbox" />
        </div>
    </div>
</body>
/* 기존 CSS */
.wrap {
    background-color: #eee;
}
.wrap h1 {
    color: red;
}
.wrap .font {
    text-align: center;
}
.wrap .font li {
    list-style: none;
}

/* SCSS */
.wrap {
    background-color: #eee;
    h1 {
        color: red;
    }
    .font {
        text-align: center;
        li {
            list-style: none;
        }
    }
}

선택자 중첩이란, 기존의 CSS에서처럼 일일이 부모 선택자를 앞에 입력하는 형태가 아닌 부모 선택자가 자식 선택자를 품고 있는 형태를 말한다. 위의 예시 코드를 보면 확실하게 알 수 있다. 기존 CSS에서는 .wrap을 모두 써줘야 했지만, SCSS에서는 그럴 필요없이 .wrap 안에 h1과 .font를 넣고, .font 안에 li를 넣는 형태로 간단하게 스타일을 줄 수 있다. 

 

중첩 나가기

/* SCSS */
.wrap {
    background-color: #eee;
    h1 {
        color: red;
    }
    @at-root .font {
        text-align: center;
        li {
            list-style: none;
        }
    }
}

간혹 중첩을 이용해서 CSS를 주다가 해당 부모 선택자의 중첩을 벗어나고 싶은 경우가 있을 수 있다.

예를 들면, .font의 경우 .wrap .font로 중첩되어 있다가 그냥 .wrap의 자식이 아닌 전체의 .font에 스타일을 주고 싶을 경우 .wrap에서 .font를 빼서 단독으로 쓰는 방법도 있지만, @at-root를 앞에 붙이면 쉽게 중첩을 나갈 수 있다.

 

부모 선택자 참조 '&'

.wrap {
    .font {
        &-large {
            &:hover {
            }
            &::after {
            }
            &::before {
            }
        }
        &-medium {
        }
        &-small {
        }
    }
}

'&'(앰퍼샌드)는 바로 위의 부모 요소를 그대로 가져오는 부모 선택자 참조 역할을 한다.

예를 들어, .font가 부모라면 &-large는 .font-large가 되는 것이다. 또는 부모가 button 태그라면, $.btn은 button 태그 중 btn이 class인 요소를 가리킨다. 즉, '&'는 부모 선택자를 그대로 가져온다고 생각하면 된다.

 

1. 선택자 중첩(Nesting)이란 부모 안에 자식을 넣는 구조의 SCSS 형태이다.
2. SCSS의 '&' 기호는 부모 선택자를 가리킨다.
3. 중첩을 나갈 때는 @at-root