プレースホルダーミックスイン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
完璧、まさに私が必要としていたもの。
Shannon Hochkins 2013年

4
これが元に戻された理由はわかりませんが、答えは正しくありません。個々のベンダープレフィックスの先頭に「@」が必要です。Dave Hein氏またはそれよりもさらに下の方の答えを見てください。このコードを実行してみると、機能しないことがわかります。
Sk446 2014年

1
@RickM行った変更がコンパイルされなかったため、元に戻されました(エラー:基本レベルのルールに親セレクター参照文字 '&'を含めることはできません)。これはOPが探している正確な出力を作成しますが、「正しい」と主張する答えはそうではありません。
cimmanon 14年

興味深い... cli経由でコンパイルしていますか?私にはまったく逆のことが起こり、他の返信や他のいくつかの返信によっても判断されるため、バージョン管理の競合があるように見えます。
Sk446 14年

4
はい、CLI:Compass経由のSass 3.3.0.rc.3。CodePenSassmeister確認しました。これ&input::-webkit-input-placeholder、ミックスインのようにセレクターを取得できるようにする場合に必要ですが、ルートレベルでは使用できなくなります。 sassmeister.com/gist/9469073。LibSassを使用している場合は、話は異なります。
cimmanon 14年

168

cimmanonKurt Muellerによるアプローチがほとんど機能していることを発見しましたが、親参照が必要でした(つまり、各ベンダープレフィックスに「&」プレフィックスを追加する必要があります)。このような:

@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

セレクターが少し過剰に修飾されていることは注目に値します(入力要素または選択要素で動作させたくない場合を除きます)。親セレクターを追加すると、ネストせずにミックスインを使用できなくなります(OPが探していたものです)。
cimmanon 14年

1
&全く必要です。これを反映するために人気のある回答を編集しました。
AlexKempton 2014年

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
正直なところ、これは読みにくく、通常の構文ほどきれいではないと思います
Shannon Hochkins

コメントにしようとしたのですが大きすぎます。私はこの構文を使用していますが、選択した回答を簡単に機能させることができませんでした。他の人にも役立つと思いました。
igrossiter 2015

2
これは最高で、理解しやすく、実装も簡単です。
arslion 2015年

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
少し複雑ですが、コンテンツディレクティブを探していましたが、ありがとうございました。
Shannon Hochkins 2013年

3

sassコンパイラーからスローされる「Unclosed block:CssSyntaxError」エラーを回避するには、「;」を追加します。@contentの最後まで。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.