특정 선택자에 다른 선택자의 css를 그대로 가져와야 하는 경우가 종종 있다.
이럴 때 extend 기능을 사용할 수 있다.
/*
@extend 클래스명;
*/
.box1 {
width: 100px;
height: 100px;
padding: 10px;
background: red;
}
.box2 {
@extend .box1;
background: blue;
}
css에서는 아래처럼 나타난다.
.box1, .box2 {
width: 100px;
height: 100px;
padding: 10px;
background: red;
}
.box2 {
background: blue;
}
클래스 명을 통해 가져오는 것이 아닌, 공통된 속성을 따로 선언하여 가져와 사용할 수도 있다.
공통된 속성을 따로 선언한 것을 %placeholder라고 한다.
그리고 %placeholder는 사용하지 않는 한 css로 출력되지 않는다.
/*
@extend %placeholder명;
*/
%red-box {
background: red;
color: #fff;
font-size: 20px;
}
.first-box {
@extend %red-box;
width: 100px;
height: 100px;
}
.second-box {
@extend %red-box;
width: 200px;
height: 200px;
}
css에서는 아래처럼 나타난다.
.first-box, .second-box {
background: red;
color: #fff;
font-size: 20px;
}
.first-box {
width: 100px;
height: 100px;
}
.second-box {
width: 200px;
height: 200px;
}
extend의 한계
extend는 다양하게 적용할 수 있지만 한계가 있다.
자식 선택자와 인접 선택자는 extend 할 수 없다.
또한 @media 내에서 영역 밖에 있는 클래스나 %placeholder를 extend 할 수 없다.
그리고 컴파일 된 결과를 보면 extend를 사용하면 ,로 구분되는 다중 선택자가 만들어진다.
내 현재 선택자가 어디에 첨부될 것인지, 원치 않는 부작용이 초래되지는 않는지 잘 고려해야 한다.
연관성 없는 값들이 한 군데에 묶이게 되고, 소스 순서가 얽혀서 혼란을 줄 수도 있다.
따라서 extend는 특정 상황이 아니라면 되도록 권장되지 않으며, mixin을 사용하는 것이 좋다.