선택적 인수로 Sass 믹스 인 만들기


201

나는 다음과 같이 mixin을 작성하고 있습니다.

@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
    -webkit-box-shadow: $top $left $blur $color $inset;
    -moz-box-shadow: $top $left $blur $color $inset;
    box-shadow: $top $left $blur $color $inset;
}

내가 실제로 원하는 것은 $inset값이 전달 되지 않으면 다음과 같이 컴파일하는 것보다 아무것도 출력되지 않는다는 것입니다.

-webkit-box-shadow: 2px 2px 5px #555555 "";
-moz-box-shadow: 2px 2px 5px #555555 "";
box-shadow: 2px 2px 5px #555555 "";

$inset전달 값이 없으면 출력 이 없도록 믹스 인을 어떻게 다시 작성 합니까?


6
SASS에 blank또는 nil값 이 없다는 것은 부끄러운 일입니다 .
Joshua Pinter

1
Btw는 다른 SASS 제한을 살펴보면서 이러한 상황에서 따옴표를 제거하는 좋은 방법을 발견했습니다. 나는 그것에 대한 답변을 추가했습니다.
Joshua Pinter

4
이제 2015 년에 nullattr / prop를 건너 뛰기 위해 사용할 수 있습니다 . ie @include box-shadow($top, $left, $blur, $color, null)
삭제

답변:


257

건조하게하는 방법

그리고 일반적으로 따옴표를 제거하는 깔끔한 트릭입니다.

@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
  -webkit-box-shadow: $top $left $blur $color #{$inset};
  -moz-box-shadow:    $top $left $blur $color #{$inset};
  box-shadow:         $top $left $blur $color #{$inset};
}

SASS 버전 3 이상에서는 다음을 사용할 수 있습니다 unquote().

@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
  -webkit-box-shadow: $top $left $blur $color unquote($inset);
  -moz-box-shadow:    $top $left $blur $color unquote($inset);
  box-shadow:         $top $left $blur $color unquote($inset);
} 

SASS에서 단일 인수로 목록을 믹스 인에 전달 하십시오.


6
Bob Sammers가 지적했듯이 최신 버전의 SASS에서는 # {} 대신 unquote () 메서드를 사용하여 따옴표를 제거 할 수도 있습니다. 건배.
Joshua Pinter

4
가장 간단한 방법은 null대신에 선택적 매개 변수의 기본값 을 사용 하는 ""것이며 출력에서 ​​렌더링되지 않습니다! @mixin box-shadow($top, $left,... , $inset:null) {}
S.Serpooshan

@ S.Serpooshan이 버전에 추가 된 버전이 궁금합니다. 2012 년에는 지원되지 않았습니다.
Joshua Pinter

79

훨씬 더 나은 DRY 방식

에 전달 $args...하는 것 @mixin입니다. 그렇게하면 얼마나 많은 사람들 $args이 통과 할 수 있습니다. 에서 @input전화, 당신은 필요한 모든 인수를 전달할 수 있습니다. 이렇게 :

@mixin box-shadow($args...) {
  -webkit-box-shadow: $args;
  -moz-box-shadow: $args;
  box-shadow: $args;
}

이제 필요한 모든 인수를 전달하여 원하는 모든 클래스에서 상자 그림자를 재사용 할 수 있습니다.

.my-box-shadow {
  @include box-shadow(2px 2px 5px #555, inset 0 0 0);
}

11
의 좋은 알고 있지만 종종 것을 그것은 무엇 인수를 나타 내기 위해 더 분명 mixin같은, 기대 $top, $left, $blur당신이 보여준 것처럼, 등 변수 인수, 최고의 유연성을위한 중대한는하지만.
Joshua Pinter

1
고마워 친구 나에게 많은 도움이
Nilesh Sutar

48

Sass는 @if진술을 지지 합니다. ( 문서를 참조하십시오 .)

다음과 같이 믹스 인을 작성할 수 있습니다.

@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
  @if $inset != "" {
    -webkit-box-shadow:$top $left $blur $color $inset;
    -moz-box-shadow:$top $left $blur $color $inset;
    box-shadow:$top $left $blur $color $inset;
  }
}

이것은 유용 inset하지 않습니다. 모든 박스-섀도우 속성이 아니라 null 일 때 부분 만 제외해야합니다.
S.Serpooshan

@ S.Serpooshan 그냥 else내부에 모든 비 삽입 속성을 추가 하고 포함하십시오.
mbomb007

@ mbomb007 알고 있습니다.이 솔루션에 문제가 있다고보고합니다. 그리고 위에 제공된 다른 답변이 절대적으로 좋습니다.
S.Serpooshan

26

속성을 기본값으로 null로 설정할 수 있으며 매개 변수를 전달하지 않으면 해석되지 않습니다.

@mixin box-shadow($top, $left, $blur, $color, $inset:null) {
  -webkit-box-shadow: $top $left $blur $color $inset;
  -moz-box-shadow:    $top $left $blur $color $inset;
  box-shadow:         $top $left $blur $color $inset;
}

이것은 다음과 같이 include 문을 작성할 수 있음을 의미합니다.

@include box-shadow($top, $left, $blur, $color);

이렇게 쓰는 대신에.

@include box-shadow($top, $left, $blur, $color, null);

여기 에 답변에 표시된 것처럼


1
이 답변은 기존 답변보다 새로운 것을 제공하지 않습니다 ( stackoverflow.com/a/23565388/1652962 참조 )
cimmanon

9
@cimmanon 반대로, @include box-shadow($top, $left, $blur, $color);대신 가져 오기를 쓸 수 있으므로 추가 유틸리티가 제공 됩니다 @include box-shadow($top, $left, $blur, $color, null);. 따라서이 답변은 훨씬 더 유익합니다.
Dan

1
@ Dan 실제로 실제로는 가독성이 떨어 지므로 파생 된 답변보다 유익합니다.
TylerH

@TylerH 사실입니다
Dan

14

오래된 질문이지만, 나는 이것이 여전히 관련이 있다고 생각합니다. 아마도이 작업을 수행하는보다 명확한 방법은 unquote () 함수 (SASS가 3.0.0 이후 버전)를 사용하는 것입니다.

@mixin box-shadow($top, $left, $blur, $color, $inset:"") {
  -webkit-box-shadow: $top $left $blur $color unquote($inset);
  -moz-box-shadow: $top $left $blur $color unquote($inset);
  box-shadow: $top $left $blur $color unquote($inset);
}

이것은 Josh의 대답과 거의 동일하지만 명시 적으로 명명 된 함수는 문자열 보간 구문보다 덜 난독하다고 생각합니다.


12

나는 정확히 당신이 찾고있는 답을 알지 못하지만 믹스 인 "null"할 때 마지막 인수로 전달할 수 있습니다. . 해당 "라인"에 둘 이상의 인수가있는 경우 널 (NULL)로 설정 한 인수 만 컴파일되지 않습니다 (귀하의 경우).@include box-shadow@include box-shadow(12px, 14px, 2px, green, null);

CSS 출력은 정확히 원하는대로이지만 nulls 를 작성해야 합니다. :)

  @include box-shadow(12px, 14px, 2px, green, null);

  // compiles to ...

  -webkit-box-shadow: 12px 14px 2px green;  
  -moz-box-shadow: 12px 14px 2px green;  
  box-shadow: 12px 14px 2px green;

1
확실히 내가 가장 좋아하는 방법은 스크립트로 돌아와야 할 때 모든 것을 읽고 이해하기 쉽게 만듭니다. thnx 상품.
Plentybinary

7

다음은 메모와 함께 사용하는 솔루션입니다.

@mixin transition($trans...) {
  @if length($trans) < 1 {
    $trans: all .15s ease-out;
  }
  -moz-transition: $trans;
  -ms-transition: $trans;
  -webkit-transition: $trans;
  transition: $trans;
}

.use-this {
  @include transition;
}

.use-this-2 {
  @include transition(all 1s ease-out, color 2s ease-in);
}
  • "혀"에 가깝게 유지하기 위해 속성 값을 네이티브 CSS로 전달하는 것을 선호합니다.
  • 가변 개수의 인수 전달 허용
  • 게으름에 대한 기본값을 정의

이것이 기존 답변 위에 무엇을 추가합니까 (즉 : stackoverflow.com/a/28072864/1652962 합니까 )?
cimmanon

그는 둘 이상의 인수가 함수에 전달되는지 확인하는 방법에 대해 설명했으며, 그렇다면 출력을 변경하십시오. 다른 대답은 그렇지 않았습니다.
TetraDev

때때로, 당신은 세계적인 행동을 정의하고 싶어합니다. 예를 들어, 일반적으로 매우 균일 한 경험을 원하고해야 할 일을 결정할 때 "창의적인 개발자 재량"을 감수하지 않으려는 애니메이션 전환. 이것은 재정의 될 수있는 기본값을 정의하지만 인수를 전달하지 않을 때 더 간결한 구문으로 인해 발생하지 않는 경우가 많습니다. 이런 식으로 단일 위치에서 전역 동작을 변경할 수도 있습니다.
duggi

3

sass@3.4.9 사용 :

// declare
@mixin button( $bgcolor:blue ){
    background:$bgcolor;
}

값없이 사용하면 버튼이 파란색이됩니다.

//use
.my_button{
    @include button();
}

값이 있으면 버튼이 빨간색이됩니다.

//use
.my_button{
    @include button( red );
}

hexa 와도 작동합니다.


이것이 기존 답변 위에 어떻게 추가됩니까?
cimmanon

3

건조기까지!

@mixin box-shadow($args...) {
  @each $pre in -webkit-, -moz-, -ms-, -o- {
    #{$pre + box-shadow}: $args;
  } 
  #{box-shadow}: #{$args};
}

이제 상자 그림자를 더 똑똑하게 재사용 할 수 있습니다.

.myShadow {
  @include box-shadow(2px 2px 5px #555, inset 0 0 0);
}

이 메모는 읽기만 가능하며 DRY 코드와 가독성 / 유지 보수성 사이에 경계를 두어야 합니다 .
레오 나폴레옹

가독성 / 유지 보수성 을 높이기 위해 다른 믹스 인에서 재사용 할 수있는 "브라우저 목록"을 작성 한다는 데 동의합니다 . 이것은 또한 다른 css 속성에 매우 쉽게 조립 될 수 있으며, 이는 일련의 건식 믹스 인으로 실행될 수 있습니다. 2014 년 의이 기사 는 여전히 훌륭한 예입니다.
벤 칼 스키

1
@mixin box-shadow($left: 0, $top: 0, $blur: 6px, $color: hsla(0,0%,0%,0.25), $inset: false) {
    @if $inset {
        -webkit-box-shadow: inset $left $top $blur $color;
        -moz-box-shadow: inset $left $top $blur $color;
        box-shadow: inset $left $top $blur $color;
    } @else {
        -webkit-box-shadow: $left $top $blur $color;
        -moz-box-shadow: $left $top $blur $color;
        box-shadow: $left $top $blur $color;
    }
}

이것은 다른 모든 답변보다 더 나쁩니다. 또한 다른 답변 중 하나 와 충분히 가까워서 중복으로 계산됩니다.
cimmanon

1

매우 간단한 방법

none$ inset에 기본값을 추가하십시오.

@mixin box-shadow($top, $left, $blur, $color, $inset: none) { ....

이제 $ inset이 전달되지 않으면 아무것도 표시되지 않습니다.


1

선택적 인수에 항상 null을 할당 할 수 있습니다. 간단한 수정 사항은 다음과 같습니다.

@mixin box-shadow($top, $left, $blur, $color, $inset:null) { //assigning null to inset value makes it optional
    -webkit-box-shadow: $top $left $blur $color $inset;
    -moz-box-shadow: $top $left $blur $color $inset;
    box-shadow: $top $left $blur $color $inset;
}

0

CSS 컴파일러가 처음입니다.이 도움이되기를 바랍니다.

        @mixin positionStyle($params...){

            $temp:nth($params,1);
            @if $temp != null{
            position:$temp;
            }

             $temp:nth($params,2);
            @if $temp != null{
            top:$temp;
            }

             $temp:nth($params,3);
            @if $temp != null{
            right:$temp;
            }

             $temp:nth($params,4);
            @if $temp != null{
            bottom:$temp;
            }

            $temp:nth($params,5);
            @if $temp != null{
            left:$temp;
            }

    .someClass{
    @include positionStyle(absolute,30px,5px,null,null);
    }

//output

.someClass{
position:absolute;
 top: 30px;
 right: 5px;
}

이것이 기존 답변 위에 어떻게 추가됩니까?
cimmanon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.