Platzhalter Mixin SCSS / CSS

122

Ich versuche ein Mixin für Platzhalter in Sass zu erstellen.

Dies ist das Mixin, das ich erstellt habe.

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

So möchte ich das Mixin einbinden:

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

Natürlich wird dies nicht funktionieren, da alle Doppelpunkte und Semikolons an das Mixin übergeben werden, aber ... Ich möchte wirklich nur statisches CSS eingeben und es genau wie die obige Funktion durchlaufen.

Ist das möglich?

Shannon Hochkins
quelle

Antworten:

253

Sie suchen nach der @contentRichtlinie:

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

Weitere Informationen finden Sie in der SASS-Referenz: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


Ab Sass 3.4 kann dieses Mixin so geschrieben werden, dass es sowohl verschachtelt als auch nicht verschachtelt funktioniert:

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

Verwendung:

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

@include placeholder {
  color: red;
}

Ausgabe:

.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;
}
Cimmanon
quelle
1
Perfekt, genau das, was ich brauchte.
Shannon Hochkins
4
Ich bin mir nicht sicher, warum dies rückgängig gemacht wurde, aber die Antwort ist falsch. Sie benötigen '@' am Anfang jedes einzelnen Herstellerpräfixes. Werfen Sie einen Blick auf eine Antwort weiter unten von Dave Hein oder noch besser - versuchen Sie, diesen Code auszuführen, und Sie werden sehen, dass er nicht funktioniert.
Sk446
1
@RickM Es wurde zurückgesetzt, weil die von Ihnen vorgenommenen Änderungen nicht kompiliert werden (Fehler: Regeln auf Basisebene dürfen das übergeordnete Auswahlverweiszeichen '&' nicht enthalten.). Dadurch wird die genaue Ausgabe erstellt, nach der das OP sucht. Die Antwort, die Sie für "richtig" halten, ist dies nicht.
Cimmanon
Interessant ... kompilierst du via cli? Es sieht so aus, als ob es einen Versionskonflikt geben muss, da genau das Gegenteil für mich passiert und nach anderen Antworten zu urteilen, auch nach einigen anderen.
Sk446
4
Ja, CLI: Sass 3.3.0.rc.3 über Compass. Mit CodePen und Sassmeister doppelt überprüft . Dies &ist erforderlich, wenn Sie in der Lage sein möchten, einen Selektor wie input::-webkit-input-placeholderbeim Mixin zu erhalten, der Sie jedoch daran hindert, ihn auf der Root-Ebene zu verwenden. sassmeister.com/gist/9469073 . Wenn Sie LibSass verwenden, ist das eine andere Geschichte.
Cimmanon
168

Ich fand, dass der Ansatz von cimmanon und Kurt Mueller fast funktioniert hat, aber dass ich eine übergeordnete Referenz benötigte (dh ich muss jedem Herstellerpräfix das Präfix '&' hinzufügen); so was:

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

Ich benutze das Mixin so:

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

Wenn die übergeordnete Referenz vorhanden ist, wird das richtige CSS generiert, z.

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

Ohne die übergeordnete Referenz (&) wird vor dem Herstellerpräfix ein Leerzeichen eingefügt, und der CSS-Prozessor ignoriert die Deklaration. das sieht so aus:

input::-webkit-input-placeholder {
    font-family: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Liberation Serif", Georgia, serif;
    color: red;
}
Dave Hein
quelle
9
Vielen Dank. Sie haben mir Stunden des Versuchs und Irrtums
erspart
Es ist erwähnenswert, dass Ihre Selektoren jetzt leicht überqualifiziert sind (es sei denn, Sie möchten wirklich nicht, dass sie für Eingaben oder ausgewählte Elemente funktionieren). Das Hinzufügen des übergeordneten Selektors verhindert, dass Sie das Mixin ohne Verschachtelung verwenden können (wonach das OP gesucht hat).
Cimmanon
1
Das &ist absolut notwendig. Die beliebte Antwort wurde bearbeitet, um dies widerzuspiegeln.
AlexKempton
1
+1. Einige Browser unterstützen ::placeholderjetzt die offizielle Eigenschaft, daher würde ich empfehlen, diese oben hinzuzufügen:&::placeholder {@content}
Matt Browne
11

Dies ist für die Kurzsyntax

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

benutze es wie

input
  +placeholder
    color: red
Igrossiter
quelle
4
Ich denke ehrlich, das ist schwerer zu lesen und auch nicht so ordentlich wie die reguläre Syntax
Shannon Hochkins
Ich habe versucht, es als Kommentar zu setzen, ist aber zu groß. Ich verwende lieber diese Syntax und konnte die gewählte Antwort nicht so einfach funktionieren lassen. Ich dachte, es könnte für jemand anderen nützlich sein.
Igrossiter
2
Dieser ist der beste, leicht zu verstehende und zu implementierende.
Arslion
3

Warum nicht so etwas?

Es verwendet eine Kombination aus Listen, Iteration und Interpolation.

@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 );
Kurt Müller
quelle
1
Es ist nur ein bisschen zu kompliziert, ich habe nach der Inhaltsrichtlinie gesucht, aber danke!
Shannon Hochkins
3

Um zu vermeiden, dass 'Unclosed Block: CssSyntaxError'-Fehler von Sass-Compilern ausgelöst werden, fügen Sie ein'; ' bis zum Ende von @content.

@mixin placeholder {
   ::-webkit-input-placeholder { @content;}
   :-moz-placeholder           { @content;}
   ::-moz-placeholder          { @content;}
   :-ms-input-placeholder      { @content;}
}
Keine Richtung
quelle
0

Ich verwende genau den gleichen Sass-Mixin-Platzhalter wie NoDirection. Ich finde es in sass Mixins Sammlung hier und ich bin damit sehr zufrieden. Es gibt einen Text , der eine Mixins-Option näher erläutert.

Nesha Zoric
quelle