인자를 가지는 믹스인
지난 포스팅에서는 기본적인 믹스인에 대해 알아보았습니다.
이 글에서는 인자를 이용한 믹스인과 그외 믹스인 용법에 대해 계속 알아보도록 하겠습니다.
Parametric Mixins
LESS에는 특별한 유형의 룰셋이 있습니다.
믹스인은 인자를 취할 수 있기 때문에 믹스인을 호출할 경우에 인자를 전달할 수 있습니다.
다음의 예제를 살펴봅니다.
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
그리고 우리는 다음과 같이 인자를 전달함으로서 호출할 수 있습니다
#header {
.border-radius(4px); // 4px 전달
}
.button {
.border-radius(6px); // 6px 전달
}
#header {
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
.button {
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
}
인자를 지니는 믹스인은 또한 그 매개 변수의 기본 값을 정의할 수 있습니다.
.border-radius(@radius: 5px) { // 여기서는 기본값 5px을 전달
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
#header {
.border-radius; // 인자를 전달하지 않고 호출
}
#header {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
인자를 전달하지 않더라도 믹스인에 기본 값을 정의해 놓았기 때문에 기본 값으로 출력되어 나타납니다.
그리고 파라미터를 취하지 않는 파라미터 믹스인을 사용할 수 있습니다.
이것은 CSS의 출력에서 믹스인 룰셋을 숨길 때(컴파일하지 않음) 유용할 수 있습니다.
.wrap() { // () 안에 인자를 취하지 않음
text-wrap: wrap;
white-space: -moz-pre-wrap;
white-space: pre-wrap;
word-wrap: break-word;
}
pre { .wrap }
pre {
text-wrap: wrap;
white-space: -moz-pre-wrap;
white-space: pre-wrap;
word-wrap: break-word;
}
위와 같이 정의된 믹스인은 출력되지 않고 믹스인을 호출하는 경우에만 출력됩니다.
Mixins with Multiple Parameters
믹스인은 여러 매개 변수를 사용할 수 있으며 매개변수 분리는 세미콜론(;) 또는 쉼표(,)를 작성하여 여러 매개변수를 구분 작성합니다.
일반적으로 세미콜론을 사용하는 것이 좋습니다. 쉼표 기호는 이중 의미를 가지고 있습니다.
쉼표는 매개변수들 각각의 구분과 CSS 속성값들은 구분자(margin: 2px, 4px, 6px, 8px; )로 해석될 수 있습니다.
그래서 믹스인 구분자로 쉼표를 사용하는 것은 인자로 구분된 목록을 만들 수 없을 수도 있습니다.
다른 한편으로, 컴파일러는 믹스인 호출 또는 선언(정의)에 적어도 하나의 세미콜론을 보면 한편 그것은 인자가 세미콜론으로 구분되어있는 것을 전제로하고 모든 콤마는 CSS 리스트에 속하게 합니다.
다음의 코드를 살펴봅니다.
.mixin(@color; @padding: 2px) {
color: @color;
padding: @padding;
}
.mixin(@color; @padding; @margin: 2px) {
color-3: @color;
padding: @padding;
margin: @margin @margin @margin @margin;
}
.some .selector div {
.mixin(#008000);
}
.some .selector h1 {
.mixin(red; 5px 10px; @margin:3px)
}
.some .selector p {
.mixin(blue, 7px 10px 4px, @margin:10px)
}
.some .selector div {
color: #008000;
padding: 2px;
}
.some .selector h1 {
color-3: red;
padding: 5px 10px;
margin: 3px 3px 3px 3px;
}
.some .selector p {
color-3: blue;
padding: 7px 10px 4px;
margin: 10px 10px 10px 10px;
}
Named Parameters(이름있는 인자들)
믹스인의 참조는 위치 대신에 이름으로 유연한 인자값들을 제공할 수 있습니다.
어느 인자는 특별한 순서없이 이름으로 참조될 수 있습니다.
.namePara(@color: black; @margin: 10px; @padding: 20px) {
color: @color;
margin: @margin;
padding: @padding;
}
.demo-01 {
.namePara(@margin: 20px; @color: #33acfe);
}
.demo-02{
.namePara(#efca44; @padding: 40px);
}
.demo-01 {
color: #33acfe;
margin: 20px;
padding: 20px;
}
.demo-02 {
color: #efca44;
margin: 10px;
padding: 40px;
}
The @arguments Variable
@arguments
는 믹스인 안에서 특별한 의미가 있습니다.
믹스인을 호출할 때, @arguments는 넘겨받은 인자를 모두 가지고 있습니다.
인자들을 개별적으로 다루는 경우가 아니라면, 매우 유용하게 사용할 수 있습니다.
.box-shadow(@x: 0; @y: 0; @blur: 1px; @color: #000) {
-webkit-box-shadow: @arguments;
-moz-box-shadow: @arguments;
box-shadow: @arguments;
}
.big-block {
.box-shadow(2px; 5px);
}
.big-block {
-webkit-box-shadow: 2px 5px 1px #000;
-moz-box-shadow: 2px 5px 1px #000;
box-shadow: 2px 5px 1px #000;
}
Advanced Arguments and the @rest Variable(고급인자와 @rest 변수처리)
믹스인 선언에 ...
을 사용할 경우 가변 수의 인자를 취할 수 있습니다.
변수 이름 뒤에 ...
사용하면 변수에 그 인수를 할당합니다.
.mixin(...) { // 0-N 까지의 수를 일치 }
.mixin() { // 정확히 0 인수를 일치 }
.mixin(@a: 1) { // 0-1 인수를 일치 }
.mixin(@a: 1; ...) { // 0-N 까지의 수를 일치 }
.mixin(@a; ...) { // 1-N 인수를 일치 }
.mixin() {
이렇게 정의하면 전달인자를 못 받고
.mixin(...) {
로 정의하면 전달인자가 없어도 되고 다수 있어도 모두 처리하고
.mixin(@a: 1) {
이렇게 정의하면 초기 값이 1이니 인자를 전달하지 않아도 되고, 전달하면 그것이 변수 @a 값이 될 것이고
.mixin(@a: 1; …) {
이렇게 쓰면 위에서 설명한 것 처럼 인자를 몇 개든 받을 수 있다는 것을 말하는데
.mixin(@a; …) {
이렇게 쓸 경우엔 첫번째 인자는 반드시 받아야 합니다.
하지만 문제가 나머지 인자를 나타내는 변수가 없어 나머지 인자를 지칭할 수 없어 제어가 힘들어 질 수 있습니다.
.mixin(@a; @rest...) {
// @rest 는 @a 변수뒤에 있는 인자들을 한데 묶어주는 것
// @arguments 는 모든 인자를 묶어주는 것
}
자바스크립트의 경우 함수 내부에서 arguments 키워드를 통해 전달인자(유사 배열)를 참조할 수 있습니다.
위에서 설명했듯이 LESS도 @arguments 참조 키워드가 있어 이를 사용하면 사용자가 전달한 모든 인자를 참조할 수 있습니다.
거기에 한술 더 떠 @rest 변수를 처리하여 첫번째 인자를 제외한 나머지 인자를 참조할 수 있게 만들어 놓은 것입니다.
결론은 @rest(나머지 변수들)를 사용하면 믹스인 정의할 경우 제작자가 정의한 인자 @a를 제외한 나머지 인자를 참조하는 키워드 @rest를 통해 사용자가 전달한 인자를 확인하여 처리할 수 있을 것입니다.
그리고 더 나아가 좀더 활요하면 사용자가 어떤 값을 던졌는지 반복문을 통해 확인하여 개별 조건에 맞춰 코드를 분기하여 처리할 수도 있을 것입니다.
.mixin-01(@listofvariables...) {
p: @listofvariables;
}
p {
.mixin-01(one; two; three);
}
.mixin-02(@a; ...) {
color: @a;
}
.mixin-02(@a) {
background-color: contrast(@a);
width:100%;
}
.mixin-02(@a; @b;) {
background-color: contrast(@a);
width:@b;
}
div {
.mixin-02(red);
}
div.small {
.mixin-02(red,50%);
}
.rest-mixin(@color, @padding...) {
color: @color;
padding: @padding;
}
.rest-class {
.rest-mixin(red; 10px; 20px; 5px; 5px);
}
.mixin-03(...) {
color: @arguments;
background-color: @arguments;
}
.demo-01 {
.mixin-03(red, blue)
}
div {
.mixin-02(red);
}
div.small {
.mixin-02(red,50%);
}
.rest-mixin(@color, @padding...) {
color: @color;
padding: @padding;
}
.rest-class {
.rest-mixin(red; 10px; 20px; 5px; 5px);
}
.mixin-03(...) {
color: @arguments;
background-color: @arguments;
}
.demo-01 {
.mixin-03(red, blue)
}
Pattern-matching(패턴 매칭)
가끔은 사용자는 전달한 매개변수에 따라 믹스인의 동작을 변경하고 싶을 수 있습니다.
mixin이 @switch에 따라서 다른 행동을 하고 싶은 상황에 대해 살펴 봅시다.
.pattern-mixin 을 다음처럼 정의하면 됩니다.
다음의 예제를 살펴봅니다.
.pattern-mixin (dark, @color) {
color: darken(@color, 10%);
}
.pattern-mixin (light, @color) {
color: lighten(@color, 10%);
}
.pattern-mixin (@_, @color) {
display: block;
}
@switch: light;
.pattern-matching {
.pattern-mixin(@switch, #888);
}
.pattern-matching {
color: #a2a2a2;
display: block;
}
.mixin에 색상을 넘겨준 곳에는, 색상이 밝아졌습니다.
만약 @switch의 값이 dark인 경우에는 색상이 CSS에 어두운 색상으로 출력될 것입니다.
위와 같은 결과가 나온 것은 :
- 첫번째 믹스인 정의에는 동작하지 않습니다. 왜냐하면 첫번째 인자로 dark가 올거라고 예상했기 때문입니다.
- 두번째 정의에서는 동작합니다. 왜냐하면 인자로 @switch가 light로 선언되어 있기 때문입니다.
- 세번째 정의도 동작합니다. 왜냐하면 어떤 값이 인자로 와도 상관없기 때문입니다.
들어맞는 믹스인 정의만 사용됩니다.
변수가 들어맞으면, 값이 무엇인지에 관계없이 연결(bind)됩니다.
변수가 아닌 경우에는, 자신과 똑같은 것 하고만 들어맞습니다.
인자의 개수에 대해서도 들어맞는지 확인할(match) 수 있습니다.
다음의 코드를 봅니다.
.pattern-match (@a) {
color: @a;
}
.pattern-match (@a, @b) {
color: fade(@a, @b);
}
.matching-01 {
.pattern-match(hsl(90, 90%, 50%))
}
.matching-02 {
.pattern-match(#ccc, 10%)
}
.matching-01 {
color: #80f20d;
}
.matching-02 {
color: rgba(204, 204, 204, 0.1);
}
'StyleSheet > LESS' 카테고리의 다른 글
LESS Extend (0) | 2016.09.29 |
---|---|
Mixins as Functions & Passing Rulesets to Mixins (0) | 2016.09.29 |
LESS 변수 & 믹스인(Mixins) (2) | 2016.09.29 |
LESS 변수 (0) | 2016.09.29 |
LESS Syntax 시작하기 (0) | 2016.09.29 |