함수로서의 믹스인 & 믹스인에 룰셋 전달하기
이번 시간에는 믹스인의 활용법에 대해 좀더 살펴보기로 합니다.
Mixins as Functions(믹스인으로부터 변수 또는 믹스인 반환하기)
믹스인에 정의된 변수와 믹스인은 호출자 범위에서 나타내고 사용할 수 있습니다.
단 한가지 예외는 호출자가 같은 이름으로 변수를 포함하고 있는 경우에는 복사되지 않습니다.
같은 이름의 경우 또 다른 믹스인 호출에 의해 정의된 변수를 포함하게 됩니다.
오직 호출 로컬 범위 내에 존재하는 변수만이 보호되어 있습니다.
부모 스코프에서 상속된 변수는 덮어쓰게 됩니다.
.caller {
.mixin();
width: @width;
height: @height;
}
.caller {
width: 100%;
height: 200px;
}
위와 같이 믹스인에 정의된 변수는 그 반환값으로서 역할을 할 수 있습니다.
그리고 사용자는 거의 함수처럼 사용할 수있는 믹스인을 만들 수 있습니다.
.average(@x, @y) {
@average: ((@x + @y) / 2);
}
div {
.average(16px, 50px); // 믹스인 호출
padding: @average; // 믹스인의 반환값을 사용
}
div {
padding: 33px;
}
호출 스코프 내에서 직접 정의된 변수는 전역 범위의 변수로 오버라이드되지 않고 호출 부모 범위에 정의된 변수를 덮어 쓰게 됩니다.
.mixin() {
@size: in-mixin; // 호출자 안에서 재정의됨
@definedOnlyInMixin: in-mixin;
}
.class {
margin: @size @definedOnlyInMixin;
.mixin();
}
@size: globaly-defined-value; // 호출자의 부모 영역 - 보호되지 않음
.global-var {
content: '@{size}';
}
.class {
margin: in-mixin in-mixin;
}
.global-var {
content: 'globaly-defined-value';
}
마지막으로 믹스인 내부에 정의된 믹스인은 반환값으로 역할을 합니다.
.unlock(@value) { // 외부(부모) 믹스인
.doSomething() { // 중첩된 믹스인
declaration: @value;
}
}
#namespace {
.unlock(5); // unlock 믹스인에 5를 전달
.doSomething(); // 중첩 믹스인을 여기서 사용 가능하다
}
#namespace {
declaration: 5;
}
Passing Rulesets to Mixins(믹스인에 룰셋 전달하기)
사용자의 룰셋은 다른 구조에 그것을 포함할 수 있으며 룰셋의 모든 속성을 다른 구조에 복사할 수 있습니다.
또한 믹스인의 인수로 사용하고 다른 변수로 그것에 전달할 수 있습니다.
// 분리된 룰셋을 선언
@detached-ruleset: {
background: red;
padding: 10px;
};
// 분리된 룰셋 사용하기
.top {
@detached-ruleset(); // () 괄호 필수
}
.top {
background: red;
padding: 10px;
}
위와 같이 분리된 룰셋 뒤에 괄호()는 필수입니다.
괄호없이 @detached-ruleset;
호출하면 동작하지 않습니다.
사용자는 어떤 미디어 쿼리 또는 미지원되는 브라우저 클래스 이름에서 코드의 일부를 래핑,추상화하여 믹스인을 정의하려는 경우에 유용합니다.
룰셋은 콘텐츠를 감쌀 수 있기 위해서 믹스인에 전달될 수 있습니다.
.desktop-and-old-ie(@rules) {
@media screen and (min-width: 1200px) {
@rules();
}
html.lt-ie9 & { // 미지원 브라우저
@rules();
}
}
header {
background-color: blue;
.desktop-and-old-ie({
background-color: red;
});
}
header {
background-color: blue;
}
@media screen and (min-width: 1200px) {
header {
background-color: red;
}
}
html.lt-ie9 header {
background-color: red;
}
위와 같이 desktop-and-old-ie 믹스인은 미디어쿼리, 루트클래스를 정의해서 믹스인을 코드의 일부 조각으로 감쌀 수 있습니다.
룰셋은 현재 변수에 할당하거나 믹스인에 전달되어서 전체 세트를 포함 할 수 있습니다.
@my-ruleset-01: {
.my-selector {
background-color: black;
}
};
.demo-01 {
@my-ruleset-01();
}
.demo-01 .my-selector {
background-color: black;
}
사용자는 미디어쿼리 버블링을 활용할 수도 있습니다. 예를 들어 :
@my-ruleset-02: {
line-height: 1.5;
.my-selector {
@media tv {
background-color: black;
}
}
};
@media (orientation:portrait) { // 위 룰셋에 정의된 미디어 쿼리에 버블링되어 합쳐진다.
padding: 10px;
@my-ruleset-02();
}
@media (orientation: portrait) {
padding: 10px;
line-height: 1.5;
}
@media (orientation: portrait) and tv {
.my-selector {
background-color: black;
}
}
룰셋에 믹스인을 선언하여 사용하는 경우에 믹스인 호출과 룰셋호출을 다음과 같이 사용합니다.
// 믹스인과 룰셋 사용하기
@detached-ruleset: {
.mixin() {
color:blue;
@aa : red;
}
};
// 분리된 룰셋 호출하기
.caller {
@detached-ruleset();
.mixin();
}
.caller {
color: blue;
}
그리고 룰셋 내부에 정의된 변수는 반환되지 않습니다. 즉, 지역변수처럼 비공개 영역입니다.
@detached-ruleset: {
@color:blue; // 이 변수는 비공개
};
.caller {
color: @color; // 문법 에러
}
Scoping(범위 지정)
Definition and Caller Scope Visibility(정의와 호출 범위 가시성)
분리된 룰셋은 호출자의 변수와 믹스인을 바라봅니다. 다음과 같이 :
\@detached-ruleset: {
caller-variable: @caller-variable; // 변수가 이곳에 정의되어 있지 않음
.caller-mixin(); // 믹스인이 이곳이 정의되어 있지 않음
};
.selector {
// 룰셋 사용하기
@detached-ruleset();
// 룰셋 내에서 필요한 변수와 믹스인을 정의함
@caller-variable: value;
.caller-mixin() {
variable: declaration;
}
}
.selector {
caller-variable: value;
variable: declaration;
}
정의된 곳으로부터 접근 가능한 변수와 믹스인은 호출자 안에서 이용할 수 있는 것을 끌어들인다.
// 전역변수
@variable: global;
@detached-ruleset: {
// 호출자 내에 정의된 변수가 사용될 것이다.
content: '@{variable}';
};
.selector {
@detached-ruleset();
@variable: variable defined in caller; // 호출자 내의 지역변수
}
.selector {
content: 'variable defined in caller';
}
Referencing Won't Modify Detached Ruleset Scope(참조는 분리된 룰셋 스코프를 변경하지 않음)
룰셋은 다음과 같이 참조될 뿐 새로운 스코프에 접근할 수 없습니다.
@detached-1: {
scope-detached: @one @two;
};
.one {
@one: visible;
.two {
@detached-2: @detached-1; // 룰셋을 복사하여 이름 다시짓기
@two: visible;
}
}
.use-place {
@two : unreferenced;
.one > .two();
@detached-2();
}
.use-place {
scope-detached: visible visible;
}
'StyleSheet > LESS' 카테고리의 다른 글
LESS Parent Selector(&) (0) | 2016.09.29 |
---|---|
LESS Extend (0) | 2016.09.29 |
LESS Parametric Mixins (0) | 2016.09.29 |
LESS 변수 & 믹스인(Mixins) (2) | 2016.09.29 |
LESS 변수 (0) | 2016.09.29 |