How can I write this css as an less mixin that generate all those classes automatically:
.class1x{margin-top:1px;}
.class2x{margin-right:1px;}
.class3x{margin-bottom:1px;}
.class4x{margin-left:1px;}
===========================================
.class1y{margin-top:2x;}
.class2y{margin-right:2px;}
.class3y{margin-bottom:2px;}
.class4ymargin-left:2px;}
===========================================
.class1n{margin-top:n..px;}
.class2n{margin-right:n..px;}
.class3n{margin-bottom:n..px;}
.class4nmargin-left:n..px;}
And to increment that classes and value, for example, until value is 100px. I have this less but I don't want to multiply for every css property:
@iterations: 30;
.loopingClass (@index) when (@index > 0) {
.classx@{index} { /*classx the class to add in html*/
margin: ~"@{index}px";
}
.loopingClass(@index - 1);
}
.loopingClass (0) {}
.loopingClass (@iterations);
ty.
How can I write this css as an less mixin that generate all those classes automatically:
.class1x{margin-top:1px;}
.class2x{margin-right:1px;}
.class3x{margin-bottom:1px;}
.class4x{margin-left:1px;}
===========================================
.class1y{margin-top:2x;}
.class2y{margin-right:2px;}
.class3y{margin-bottom:2px;}
.class4ymargin-left:2px;}
===========================================
.class1n{margin-top:n..px;}
.class2n{margin-right:n..px;}
.class3n{margin-bottom:n..px;}
.class4nmargin-left:n..px;}
And to increment that classes and value, for example, until value is 100px. I have this less but I don't want to multiply for every css property:
@iterations: 30;
.loopingClass (@index) when (@index > 0) {
.classx@{index} { /*classx the class to add in html*/
margin: ~"@{index}px";
}
.loopingClass(@index - 1);
}
.loopingClass (0) {}
.loopingClass (@iterations);
ty.
Share Improve this question edited Dec 11, 2013 at 17:30 aIKid 28.3k5 gold badges41 silver badges65 bronze badges asked Dec 11, 2013 at 10:23 BurebistaRulerBurebistaRuler 6,53911 gold badges54 silver badges69 bronze badges3 Answers
Reset to default 6Same solution as given by @Bass Jobsen, just gently optimized (it did not have to be so verbose):
// usage:
.class {
.make-margins(3);
// or:
// .make-margins(10, px);
// .make-margins(50, rem);
// etc.
}
// implementation:
.make-margins(@i, @u: px) when (@i > 0) {
.make-margins((@i - 1), @u);
&@{i} {.margin-x(unit(@i, @u))}
}
.margin-x(@value) {
&-1 {margin-top: @value}
&-2 {margin-right: @value}
&-3 {margin-bottom: @value}
&-4 {margin-left: @value}
}
If you allow (unique) number where you have x,y, ... n, try:
@iterations: 5;
@step:1;
@number: 4;
.margintype(@number,@step) when (@number = 4)
{
margin-left: ~"@{step}px";
}
.margintype(@number,@step) when (@number = 3)
{
margin-bottom: ~"@{step}px";
}
.margintype(@number,@step) when (@number = 2)
{
margin-right: ~"@{step}px";
}
.margintype(@number,@step) when (@number = 1)
{
margin-top: ~"@{step}px";
}
.writeclass(@number,@step,@loopcounter) when (@number>0)
{
.class@{loopcounter}-@{number}{
.margintype(@number,@step);
}
.writeclass(@number - 1,@step,@loopcounter);
}
.loopingClass (@index,@step,@loopcounter) when (@index > 0) {
.writeclass(@number, @index * @step,@loopcounter);
.loopingClass(@index - 1,@step,@loopcounter + 1);
}
.loopingClass (@iterations,@step,0);
Which results in:
.........
.class3-4 {
margin-left: 2px;
}
.class3-3 {
margin-bottom: 2px;
}
.class3-2 {
margin-right: 2px;
}
.class3-1 {
margin-top: 2px;
}
.class4-4 {
margin-left: 1px;
}
.class4-3 {
margin-bottom: 1px;
}
.class4-2 {
margin-right: 1px;
}
.class4-1 {
margin-top: 1px;
}
@seven-phases-max at usage you actually must use ".class" + "sequence" + "position". For example your less pile:
.class1-1 {
margin-top: 1px;
}
.class1-2 {
margin-right: 1px;
}
.class1-3 {
margin-bottom: 1px;
}
.class1-4 {
margin-left: 1px;
}
.class2-1 {
margin-top: 2px;
}
.class2-2 {
margin-right: 2px;
}
.class2-3 {
margin-bottom: 2px;
}
.class2-4 {
margin-left: 2px;
}
.class3-1 {
margin-top: 3px;
}
.class3-2 {
margin-right: 3px;
}
.class3-3 {
margin-bottom: 3px;
}
.class3-4 {
margin-left: 3px;
}
And .make-margins(3);
value is actually iterations
.