Placeholder Mixin SCSS/CSS

Я пытаюсь создать mixin для заполнителей в sass.

Это микширование, которое я создал.

@mixin placeholder ($css) {
  ::-webkit-input-placeholder {$css}
  :-moz-placeholder           {$css}
  ::-moz-placeholder          {$css}
  :-ms-input-placeholder      {$css}  
}

Вот как я хотел бы включить mixin:

@include placeholder(font-style:italic; color: white; font-weight:100;);

Очевидно, что это не сработает из-за всех двоеточий и полуколонов, которые передаются в mixin, но... Мне бы очень хотелось просто ввести статический css и передать его точно так же, как выше функция.

Возможно ли это?

Ответ 1

Вы ищете директиву @content:

@mixin placeholder {
  ::-webkit-input-placeholder {@content}
  :-moz-placeholder           {@content}
  ::-moz-placeholder          {@content}
  :-ms-input-placeholder      {@content}  
}

@include placeholder {
    font-style:italic;
    color: white;
    font-weight:100;
}

SASS Reference содержит дополнительную информацию, которую можно найти здесь: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


Как и в случае Sass 3.4, этот mixin может быть написан так, чтобы работать как вложенным, так и нечувствительным:

@mixin optional-at-root($sel) {
  @at-root #{if(not &, $sel, selector-append(&, $sel))} {
    @content;
  }
}

@mixin placeholder {
  @include optional-at-root('::-webkit-input-placeholder') {
    @content;
  }

  @include optional-at-root(':-moz-placeholder') {
    @content;
  }

  @include optional-at-root('::-moz-placeholder') {
    @content;
  }

  @include optional-at-root(':-ms-input-placeholder') {
    @content;
  }
}

Использование:

.foo {
  @include placeholder {
    color: green;
  }
}

@include placeholder {
  color: red;
}

Вывод:

.foo::-webkit-input-placeholder {
  color: green;
}
.foo:-moz-placeholder {
  color: green;
}
.foo::-moz-placeholder {
  color: green;
}
.foo:-ms-input-placeholder {
  color: green;
}

::-webkit-input-placeholder {
  color: red;
}
:-moz-placeholder {
  color: red;
}
::-moz-placeholder {
  color: red;
}
:-ms-input-placeholder {
  color: red;
}

Ответ 2

Я нашел подход, предложенный cimmanon и Курт Мюллер, почти работал, но мне нужно было родительская ссылка (т.е. мне нужно добавить префикс "&" для каждого префикса поставщика); например:

@mixin placeholder {
  &::-webkit-input-placeholder {@content}
  &:-moz-placeholder           {@content}
  &::-moz-placeholder          {@content}
  &:-ms-input-placeholder      {@content}  
}

Я использую mixin следующим образом:

input { @include placeholder {
    font-family: $base-font-family;
    color: red;
}}

С исходной ссылкой на место, затем исправить сгенерированный css, например:

input::-webkit-input-placeholder {
  font-family: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Liberation Serif", Georgia, serif;
  color: red; }

Без родительской ссылки (&), тогда пространство вставлено перед префиксом поставщика, а процессор CSS игнорирует объявление; это выглядит так:

input ::-webkit-input-placeholder {
  font-family: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Liberation Serif", Georgia, serif;
  color: red; }

Ответ 3

Это для сокращенного синтаксиса

=placeholder
  &::-webkit-input-placeholder
    @content
  &:-moz-placeholder
    @content
  &::-moz-placeholder
    @content
  &:-ms-input-placeholder
    @content

используйте его как

input
  +placeholder
    color: red

Ответ 4

Почему не что-то вроде этого?

Он использует комбинацию списков, итераций и интерполяции.

@mixin placeholder ($rules) {

  @each $rule in $rules {
    ::-webkit-input-placeholder,
    :-moz-placeholder,
    ::-moz-placeholder,
    :-ms-input-placeholder {
      #{nth($rule, 1)}: #{nth($rule, 2)};
    }  
  }
}

$rules: (('border', '1px solid red'),
         ('color', 'green'));

@include placeholder( $rules );

Ответ 5

Чтобы избежать "Unclosed block: CssSyntaxError" ошибки, возникающие из компиляторов sass, добавьте ';' до конца @content.

@mixin placeholder {
   ::-webkit-input-placeholder { @content;}
   :-moz-placeholder           { @content;}
   ::-moz-placeholder          { @content;}
   :-ms-input-placeholder      { @content;}
}