2013-04-01 18 views
13

Chcę dynamicznie tworzyć mixiny w SASS, nazwane po każdej pozycji na liście, ale to nie działa.Jak zdefiniować dynamiczną nazwę mixin lub funkcję w SASS?

próbowałem tego, ale pojawia się błąd:

$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 

Błąd:

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

Czy ten zwyczaj nie jest obsługiwana przez SASS? Nie znalazłem w tej instrukcji niczego.

+0

Czy jesteś pewien, że w tej sytuacji musisz użyć '@ mixin'? Zobacz moją odpowiedź poniżej: –

Odpowiedz

20

Zmienna interpolacja w @mixins obecnie nie jest obsługiwana.

Dokumentacja SASS nazywa to #{} interpolation i describes it like this: interpolacja nazw zmiennych pojawia

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 na documentation tylko być obsługiwany przez selektorów i nazwy własności, a nie dla @mixin s. Jeśli chcesz skorzystać z tej funkcji, być może będziesz potrzebować jej file an Issue, chociaż może ona już śledzić to, co opisujesz.

Edit: Czy na pewno trzeba użyć @mixin osiągnąć ten rodzaj stylizacji mówisz? Czy mógłbyś użyć selektora z interpolacją? Na przykład, to będzie działać:

$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

Tak naprawdę skończyłem używając selektora, ale to nie działa we wszystkich sytuacjach. Chcę być niezależny od selektorów i mieć mixy, które można łatwo wykorzystać w innych miejscach, także z pseudo-selektorami, jak: najedź na linki (które zawijają ikonę). – Cristian

12

W tej chwili (30 marca 2014), Chris Eppstein nadal odmawia wdrożenia dynamicznych wstawek. Zobacz issue 857 i issue 626 na Github.

Próbowałem przekonać Chrisa, że ​​ta funkcja jest bardzo ważna, aby Sass mógł uwolnić swoją prawdziwą moc ... i nie jestem tam jedyny.

Jeśli zgadzasz się, że jest to ważna cecha, przejdź do issue 857 i issue 626 i rozwiązać ten problem samodzielnie. Im więcej z nas zapewni przypadek użycia tej funkcji, tym większe prawdopodobieństwo, że uda nam się przekonać Chrisa i/lub jednego z głównych programistów wiodących.

+3

+1 Tak jak powiedziałem w wątku, jest to dobra cecha - naprawdę potrzebuję tego w pracy. Gdy zamrożenie funkcji Sass dobiegnie końca, będziemy mogli nad tym popracować. Nie wiem, dlaczego próbujesz lobbować za funkcją, którą już uzgodniliśmy, to świetny pomysł. Zamiast tego, może pracujesz na żądanie ściągnięcia, aby zrobić to szybciej? – chriseppstein

+0

@chriseppstein Nie jestem zbyt biegły w Ruby, obawiam się. Jestem bardziej typem PHP/MySQL, HTML/CSS/JS & XML/Json. W każdym razie zauważysz, że ta odpowiedź została opublikowana 30 marca 2014 r. Wówczas wciąż nie chciałeś dodać tej funkcji. Cieszę się, że zmieniłeś zdanie. Może mój lobbing opłaci się w końcu?!? ;-) –

+0

Właściwie masz rację. Nie byłem jeszcze przekonany, że dynamiczna definicja mixinów jest dobrym pomysłem. Jednak problem, z którym się łączyłeś, polegał na dodaniu mixina z użyciem nazwy dynamicznej. Którą jestem za. Problem PO rozwiązuje się lepiej, przyjmując argument do pojedynczego mixina zamiast definiując unikalny mixin dla każdej ikony. – chriseppstein

4

Najlepszym rozwiązaniem jest zaimplementowanie pojedynczego mixinu, który przyjmuje argument.

$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 
Powiązane problemy