Pętla przez tablicę nazw zmiennych w Less
W naszej aplikacji mamy wstępnie ustawioną listę kolorów, z których użytkownik może wybrać i wszystko, co z nim związane, będzie miało ten kolor.
W całej aplikacji będziemy mieć różne moduły z dołączonym kolorem JAKO nazwą klasy.
Np.
<div class="example_module green">
...
</div>
Używamy mniej dla naszego CSS.
W wielu miejscach robimy takie rzeczy:
.example_module.green { background: @green; }
.example_module.red { background: @red; }
.example_module.blue { background: @blue; }
etc
Chciałbym móc ustawić wszystkie nazwy kolorów jako tablicę i iterację nad nimi. Jeśli dodamy kolory w przyszłości musimy tylko dodać je w jednym miejscu.
Pseudo kod:
@colors: ['green', 'red', 'blue'];
for each @color in @colors {
.example_module.@color { background: @color; }
}
Czy coś takiego jest w ogóle wspierane w LESS?
4 answers
Zobacz Pętle .
Na przykład (zakładając @green
, @red
, @blue
zmienne są zdefiniowane gdzie indziej):
@colors: green, red, blue;
.example_module {
.-(@i: length(@colors)) when (@i > 0) {
@name: extract(@colors, @i);
&.@{name} {background: @@name}
.-((@i - 1));
} .-;
}
- - -
W nowoczesnym Less to samo może być bardziej proste z Pomocą Lists plugin:
@colors: green, red, blue;
.for-each(@name in @colors) {
.example_module.@{name} {
background: @@name;
}
}
- - -
I w Legacy Less cukier składniowy można uzyskać za pomocą:
@import "for";
@colors: green, red, blue;
.example_module {
.for(@colors); .-each(@name) {
&.@{name} {background: @@name}
}
}
Gdzie zaimportowany fragment "for"
(to tylko wrapper mixin dla rekurencyjnych pętli Less) można znaleźć tutaj (z przykładami tutaj i tutaj ).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-25 12:07:39
Ten mixin działa dobrze dla mnie. Drugi param jest blokiem kodu, który ma dostęp do bieżącej iteracji elem (@value) I index (@i).
-
Zdefiniuj mixin:
.for(@list, @code) { & { .loop(@i:1) when (@i =< length(@list)) { @value: extract(@list, @i); @code(); .loop(@i + 1); } .loop(); } }
-
Użycie:
@colors: #1abc9c, #2ecc71, #3498db, #9b59b6; .for(@colors, { .color-@{i} { color: @value; } });
-
Wynik css:
.color-1 { color: #1abc9c; } .color-2 { color: #2ecc71; } .color-3 { color: #3498db; } .color-4 { color: #9b59b6; }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 12:07:01
Z nowoczesnym LESS (>=3.7), możesz użyć wbudowanego each
Funkcja:
/* (assuming @clr-green, @clr-red, @clr-blue variables are defined elsewhere) */
@colors: {
green: @clr-green;
red: @clr-red;
blue: @clr-blue;
}
each(@colors, {
.example_module.@{key} {
background: @value;
}
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-21 10:57:38
- Zdefiniuj mixin:
.foreach(@list, @body, @i: length(@list)) when (@i>0)
{
.foreach(@list, @body, @i - 1);
@n: length(@list);
@value: extract(@list, @i);
@body();
/* you can use @value, @i, @n in the body */
}
- Użycie:
.example-module {
.foreach (red green blue,
{
&.@{value} {
color: @value;
}
});
}
Inny przykład:
.nth-child (@list, @style) {
.foreach(@list,
{
@formula: e(%("%dn+%d", @n, @i));
&:nth-child(@{formula}) {
@style();
}
});
}
tr {
.nth-child (#bbb #ccc #ddd #eee,
{
background: @value;
});
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 12:34:16