Заполнитель Mixin SCSS / CSS


122

Я намагаюся створити міксин для заповнювачів у sass.

Це міксин, який я створив.

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

Ось як я хотів би включити міксин:

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

Очевидно, що це не спрацює через усі колонки і напівколонки, які передаються до міксину, але ... я дуже хотів би просто ввести статичний css і передати його точно так, як описано вище.

Чи можливо це?

Відповіді:


253

Ви шукаєте @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 містить більше інформації, яку можна знайти тут: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


Станом на Sass 3.4, цей міксин можна записати так, щоб він працював як вкладеним, так і нестеповим:

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

1
Ідеально, саме те, що мені було потрібно.
Шеннон Хочкінс

4
Не впевнений, чому це було відмінено, але відповідь невірна. Вам потрібно "@" на початку кожного з префіксів постачальника. Подивіться на відповідь, що надалі Даєв Хайн, а ще краще - спробуйте запустити цей код, і ви побачите, що він не спрацює.
Sk446

1
@RickM Це було повернено, оскільки внесені вами модифікації не компілюються (помилка: правила базового рівня не можуть містити символу, що посилається на вибір-селектор '&'.). Це створює точний вихід, який шукає ОП, відповідь, яку ви стверджуєте, "правильна", не відповідає.
Кімманон

Цікаво ... Ви збираєтеся через кліп? Схоже, має бути конфлікт між версіями, оскільки у мене відбувається навпаки, і, судячи з інших відповідей, ще кілька інших.
Sk446

4
Так, CLI: Sass 3.3.0.rc.3 через Compass. Двічі перевіряється за допомогою CodePen та Sassmeister . Це &необхідно, якщо ви хочете отримати можливість вибору селектора, як input::-webkit-input-placeholderі міксин, але це не дозволить вам використовувати його на кореневому рівні. sassmeister.com/gist/9469073 . Тепер, якщо ви використовуєте LibSass, це вже інша історія.
cimmanon

168

Я знайшов підхід Цимманона і Курта Мюллера майже спрацював, але мені потрібна батьківська посилання (тобто мені потрібно додати префікс '&' до кожного префікса постачальника); подобається це:

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

Я використовую міксин так:

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

9
Велике спасибі. Ви врятували мені години проб і помилок, щоб зробити прийняту відповідь / рішення справою ...
tmuecksch

Варто зазначити, що ваші селектори зараз трохи завищені (якщо ви справді не хочете, щоб вони працювали на введенні чи виділенні елементів). Додавання батьківського селектора заважає використовувати mixin без вкладення (саме це шукало ОП).
cimmanon

1
Це &абсолютно необхідно. Відредагував популярну відповідь, щоб відобразити це.
AlexKempton

1
+1. Деякі браузери зараз підтримують офіційну ::placeholderвласність, тому я рекомендую додати це вгорі:&::placeholder {@content}
Метт Браун

11

Це для скороченого синтаксису

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

використовувати його як

input
  +placeholder
    color: red

4
Я чесно думаю, що це важче читати, а також не так охайно, як звичайний синтаксис
Шеннон Хочкінс

Я намагався викласти це як коментар, але занадто великий. Я скоріше використовую цей синтаксис, і не міг змусити обрану відповідь занадто легко працювати. Я думав, що це може бути корисним для когось іншого.
igrossiter

2
цей найкращий, легкий для розуміння та реалізації.
arslion

3

Чому б не щось подібне?

Він використовує комбінацію списків, ітерації та інтерполяції.

@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 );

1
Це просто трохи складно, я шукав директиву щодо вмісту, але дякую!
Шеннон Хочкінс

3

Щоб уникнути "Незакритого блоку: CssSyntaxError", які викидаються з компіляторів sass, додайте ";" до кінця @content.

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

0

Я використовую абсолютно той самий заповнювач sass mixin, як написав NoDirection. Я знаходжу це в колекції sass mixins тут, і я дуже задоволений цим. Там є текст, який більше пояснює варіант змішування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.