Segnaposto Mixin SCSS / CSS


122

Sto cercando di creare un mixin per segnaposto in sass.

Questo è il mixin che ho creato.

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

Ecco come vorrei includere il mixin:

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

Ovviamente questo non funzionerà a causa di tutti i due punti e i punti e virgola che vengono passati al mixin, ma ... Mi piacerebbe davvero inserire css statico e passarlo esattamente come la funzione sopra.

È possibile?

Risposte:


253

Stai cercando la @contentdirettiva:

@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 contiene ulteriori informazioni, che possono essere trovate qui: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


A partire da Sass 3.4, questo mixin può essere scritto in questo modo per funzionare sia annidato che non:

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

Uso:

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

@include placeholder {
  color: red;
}

Produzione:

.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
Perfetto, esattamente quello di cui avevo bisogno.
Shannon Hochkins

4
Non sono sicuro del motivo per cui è stato ripristinato, ma la risposta non è corretta. È necessario "@" all'inizio di ogni singolo prefisso del fornitore. Dai un'occhiata a una risposta più in basso di Dave Hein, o meglio ancora: prova a eseguire questo codice e vedrai che non funzionerà.
Sk446

1
@RickM È stato ripristinato perché le modifiche apportate non vengono compilate (errore: le regole di livello base non possono contenere il carattere di riferimento del selettore principale "&".). Questo crea l'output esatto che l'OP sta cercando, la risposta che affermi sia "corretta" no.
cimmanon

Interessante ... stai compilando tramite cli? Sembra che ci debba essere un conflitto di versione poiché accade l'esatto contrario per me e, a giudicare da altre risposte, anche da poche altre.
Sk446

4
Sì, CLI: Sass 3.3.0.rc.3 tramite Compass. Doppio controllo con CodePen e Sassmeister . Il &è necessario se si vuole essere in grado di ottenere un selettore come input::-webkit-input-placeholdercon il mixin, ma caso non sarebbe possibile usarlo al livello principale. sassmeister.com/gist/9469073 . Ora se stai usando LibSass, questa è una storia diversa.
cimmanon

168

Ho trovato l'approccio fornito da cimmanon e Kurt Mueller quasi funzionante, ma che avevo bisogno di un riferimento genitore (cioè, ho bisogno di aggiungere il prefisso "&" a ciascun prefisso del fornitore); come questo:

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

Uso il mixin in questo modo:

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

Con il riferimento genitore in posizione, viene generato il CSS corretto, ad esempio:

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

Senza il riferimento genitore (&), viene inserito uno spazio prima del prefisso del fornitore e il processore CSS ignora la dichiarazione; che assomiglia a questo:

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

9
Grazie mille. Mi hai risparmiato ore di tentativi ed errori per far funzionare la risposta / soluzione accettata ...
tmuecksch

Vale la pena notare che i tuoi selettori sono ora leggermente sovraqualificati (a meno che tu non voglia sinceramente che funzioni su input o selezioni elementi). L'aggiunta del selettore genitore ti impedisce di utilizzare il mixin senza annidamento (che era ciò che l'OP stava cercando).
cimmanon

1
Il &è totalmente necessario. Modificata la risposta popolare per riflettere questo.
AlexKempton

1
+1. Alcuni browser ora supportano la ::placeholderproprietà ufficiale , quindi consiglio di aggiungerla all'inizio:&::placeholder {@content}
Matt Browne

11

Questo è per la sintassi abbreviata

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

usalo come

input
  +placeholder
    color: red

4
Onestamente penso che questo sia più difficile da leggere e anche non così preciso come la sintassi normale
Shannon Hochkins,

Ho provato a metterlo come commento, ma è troppo grande. Preferisco usare questa sintassi e non potrei far funzionare la risposta scelta troppo facilmente. Ho pensato che potesse essere utile per qualcun altro.
igrossiter

2
questo è il migliore, facile da capire e da implementare.
arslion

3

Perché non qualcosa del genere?

Utilizza una combinazione di elenchi, iterazione e interpolazione.

@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
È solo un po 'complicato, stavo cercando la direttiva sui contenuti ma grazie!
Shannon Hochkins

3

Per evitare che gli errori "Unclosed block: CssSyntaxError" vengano lanciati dai compilatori sass, aggiungere un ";" alla fine di @content.

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

0

Uso esattamente lo stesso segnaposto sass mixin di NoDirection. Lo trovo nella collezione sass mixins qui e ne sono molto soddisfatto. C'è un testo che spiega di più un'opzione mixins.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.