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.