2013-04-01 8 views
13

Voglio creare dinamicamente i mix in SASS, chiamati dopo ogni elemento nell'elenco, ma non sembra funzionare.Come definire un mixin dinamico o un nome di funzione in SASS?

Ho provato questo ma ho un errore:

$event-icons: fair, concert, art-show, conference, dance-show, film, party, festival, theatre, launch 
@each $event-icon in $event-icons 
    @mixin event-icon-#{$event-icon} 
    background-position: -($event-icon-width * $i) 0 

Errore:

Invalid CSS after "": expected expression (e.g. 1px, bold), was "#{$event-icon}" 

È questo utilizzo non supportato dal SASS? Non ho trovato nulla nel manuale a riguardo.

+0

Sei sicuro di aver bisogno di un '@ mixin' in questa situazione? Vedere la mia risposta sotto –

risposta

20

L'interpolazione variabile in @mixins non sembra essere supportata al momento.

La documentazione SASS chiama questo #{} interpolation e describes it like this:

Interpolation: #{}

You can also use SassScript variables in selectors and property names using #{} interpolation syntax:

$name: foo; 
$attr: border; 
p.#{$name} { 
    #{$attr}-color: blue; 
} 

Per il documentation, interpolazione dei nomi delle variabili appare solo per essere supportato per selettori e nomi di proprietà, e non per @mixin s. Se desideri questa funzione, potresti provare a utilizzare file an Issue, sebbene lo this one stia già monitorando ciò che stai descrivendo.

Edit: Sei sicuro è necessario utilizzare un @mixin per realizzare il tipo di styling stai parlando? Potresti semplicemente usare un selettore con interpolazione? Ad esempio, sarebbe questo lavoro:

$event-icons: fair, concert, art-show, conference, dance-show, film, party, festival, theatre, launch 
@for $i from 1 to length($event-icons) 
    $event-icon: nth($event-icons, $i) 
    .event-icon-#{$event-icon} 
    background-position: -($event-icon-width * $i) 0 
+0

In realtà ho finito con l'utilizzo di un selettore, ma questo non funziona per tutte le situazioni. Voglio essere indipendente dai selettori e avere mixin che potrebbero essere facilmente utilizzati in altri posti, anche con pseudo-selettori come: hover on links (che avvolge l'icona). – Cristian

12

partire da questo momento (30 marzo 2014), Chris Eppstein rifiuta ancora di implementare mixins dinamici. Vedi issue 857 e issue 626 su Github.

Ho cercato di convincere Chris che questa funzione è assolutamente essenziale per Sass per scatenare il suo vero potere ... e io non sono l'unico lì.

Se siete d'accordo che questa è una caratteristica importante, vai alla issue 857 e issue 626 e affrontare questo problema da soli. Più di noi forniscono un caso d'uso per questa funzione, più è probabile che saremo in grado di convincere Chris e/o uno degli altri sviluppatori principali.

+3

+1 Come ho detto nella discussione, è una buona caratteristica: ne ho effettivamente bisogno al lavoro. Non appena la funzionalità di congelamento di Sass è finita, saremo in grado di lavorarci sopra. Non so perché stai cercando di fare lobby per una funzione che abbiamo già concordato è una buona idea. Invece, magari lavorare su una richiesta pull in modo che venga eseguita prima? – chriseppstein

+0

@chriseppstein Non sono molto fluente in Ruby, temo. Sono più un tipo di PHP/MySQL, HTML/CSS/JS e XML/Json. Ad ogni modo, noterai che questa risposta è stata pubblicata il 30 marzo 2014. A quel tempo, eri ancora riluttante ad aggiungere questa funzione. Sono felice che tu abbia cambiato idea. Forse il mio lobbismo è stato ripagato alla fine?!? ;-) –

+0

In realtà hai ragione. Non sono ancora convinto che la definizione dinamica di mixin sia una buona idea. Comunque il problema a cui ti sei collegato riguardava l'inclusione di un mixin usando un nome dinamico. Per chi sono. Il problema dell'OP viene risolto meglio accettando un argomento per un singolo mixin invece di definire un mixin univoco per ogni icona. – chriseppstein

4

La soluzione migliore consiste nell'implementare un singolo mixin che accetta un argomento.

$event-icons: fair, concert, art-show, conference, dance-show, film, party, festival, theatre, launch 
@mixin event-icon($name) 
    @if not index($event-icons, $name) 
    @error "#{$name} is not an event icon." 
    background-position: -($event-icon-width * $i) 0 
Problemi correlati