我亲自阐述了3种可能的解决方案,从最简单的一种开始,然后将其优化到第3种。最容易有更好的可读性,最难使用双嵌套LOOP。
在这里,我报告3个解决方案之间的“共同”的代码(我决定到十个分量分开可能尺寸的定义,更加直观):
@sm-screen:~"(min-width: 320px)";
@md-screen:~"(min-width: 720px)";
@lg-screen:~"(min-width: 1200px)";
@xs-gutter:20px;
@sm-gutter:30px;
@md-gutter:40px;
@lg-gutter:50px;
@property:padding;
//@property:margin;
注意@property
可能是“margin
”或“padding
“漠不关心,简单地转换评论。
为了这个变量定义可以追加以下3点建议:
SOLUTION 1
这是最简单的解决方案。其缺点是,它产生一个不同mediaquery为每个规则,导致冗余代码:
.side(top, right, bottom, left);
.side(@possible-values...)
{
.generate-property-loop(1, @possible-values);
}
.generate-property-loop(@var; @possible-values) when (@var <= length(@possible-values))
{
//Let's extract values in @var position from list @possible-values
@direction: extract(@possible-values, @var);
[email protected]{property}[email protected]{direction}
{
@{property}[email protected]{direction}: @xs-gutter;
@media @sm-screen
{
@{property}[email protected]{direction}: @sm-gutter;
}
@media @md-screen
{
@{property}[email protected]{direction}: @md-gutter;
}
@media @lg-screen
{
@{property}[email protected]{direction}: @lg-gutter;
}
}
.generate-property-loop((@var + 1), @possible-values);
}
SOLUTION 2
一种可能的解决方案是移动mediaquery外LOOP但它仍然需要明确mediaquery定义:
.side(top, right, bottom, left);
.side(@possible-values...)
{
.generate-property-loop(1, @possible-values, @xs-gutter);
@media @sm-screen
{
.generate-property-loop(1, @possible-values, @sm-gutter);
}
@media @md-screen
{
.generate-property-loop(1, @possible-values, @md-gutter);
}
@media @lg-screen
{
.generate-property-loop(1, @possible-values, @lg-gutter);
}
}
.generate-property-loop(@var, @possible-values, @gutter) when (@var <= length(@possible-values))
{
//Let's extract values in @var position from list @possible-values
@direction: extract(@possible-values, @var);
[email protected]{property}
{
&[email protected]{direction}
{
@{property}[email protected]{direction}: @gutter;
}
}
.generate-property-loop((@var + 1), @possible-values, @gutter);
}
SOLUTION 3
随着双嵌套循环,可以实现完全的灵活性,简单地通过“方向”和“scren尺寸”作为参数,但在较小的可读性的成本:
.side(top, right, bottom, left);
.side(@possible-values...)
{
.generate-property-loop(1, @possible-values, @xs-gutter);
.mediaquery-loop(sm,md,lg);
}
.mediaquery-loop(@possible-screens...)
{
.generate-mediaquery-loop(1, @possible-screens);
}
.generate-property-loop(@var, @possible-values, @gutter) when (@var <= length(@possible-values))
{
@direction: extract(@possible-values, @var);
[email protected]{property}
{
&[email protected]{direction}
{
@{property}[email protected]{direction}: @gutter;
}
}
.generate-property-loop((@var + 1), @possible-values, @gutter);
}
.generate-mediaquery-loop(@var, @possible-sizes) when (@var <= length(@possible-screens))
{
@sizes: extract(@possible-sizes, @var);
@screen-size: ~"@{sizes}-screen";
@gutter-size: ~"@{sizes}-gutter";
@media @@screen-size
{
.generate-property-loop(1, @possible-values, @@gutter-size);
}
.generate-mediaquery-loop((@var + 1), @possible-screens);
}
哇哈利 - 当然知道你的少 – dotnetnoob 2015-02-11 12:15:10