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;}
}