2013-06-19 14 views
92

Sto provando a creare un mixin per segnaposti in sass.Segnaposto Mixin SCSS/CSS

Questo è il mixin che ho creato.

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

questo è come mi piacerebbe includere il mixin:

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

Ovviamente questo non è andare a lavorare a causa di tutti i due punti e punti e virgola che viene passata al mixin , ma ... Mi piacerebbe solo inserire il css statico e farlo passare esattamente come la funzione sopra.

È possibile?

risposta

188

Siete alla ricerca di direttiva @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 di riferimento ha più informazioni, che può essere trovato qui: http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixin-content


Dal Sass 3.4, questo può essere mixin scritto in modo tale da funzionare sia annidato che non verificato:

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

uscita:

.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 ciò di cui avevo bisogno. –

+4

Non sono sicuro del motivo per cui è stato ripristinato, ma la risposta è errata. È necessario "@" all'inizio di ogni singolo prefisso del fornitore. Dai un'occhiata ad una risposta più in basso di Dave Hein, o meglio ancora - prova ad 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 genitore-selettore '&'.). Questo crea l'esatto risultato che l'OP sta cercando, la risposta che tu affermi è "corretta" no. – cimmanon

3

Perché non qualcosa di simile?

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 content ma grazie! –

139

ho trovato l'approccio data dal cimmanon e Kurt Mueller quasi funzionato, ma che avevo bisogno di un genitore di riferimento (vale a dire, ho bisogno di aggiungere la '&' prefisso per ogni prefisso fornitore); in questo modo:

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

uso il mixin simili:

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

Con riferimento principale in posizione, quindi corretta css viene generato, 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 principale (&), quindi uno spazio viene inserito prima del prefisso del produttore 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; } 
+7

Grazie mille. Mi hai risparmiato ore di prove ed errori per fare in modo che la soluzione/risposta accettata funzionasse ... – tmuecksch

+0

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

+1

Il '&' è assolutamente necessario. Modificato la risposta popolare per riflettere questo. – AlexKempton

9

Questo è per la sintassi abbreviata

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

utilizzarlo come

input 
    +placeholder 
    color: red 
+2

Credo onestamente che sia più difficile da leggere e anche non così pulito come sintassi regolare –

+0

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

+2

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

3

Per evitare 'blocco Unclosed: CssSyntaxError' errori gettati 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;} 
}