我親自闡述了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