我个人详细阐述了 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 个提案:
解决方案 1
这是最简单的解决方案。缺点是它为每条规则生成不同的媒体查询,导致代码冗余:
.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);
.@{property}.@{direction}
{
@{property}-@{direction}: @xs-gutter;
@media @sm-screen
{
@{property}-@{direction}: @sm-gutter;
}
@media @md-screen
{
@{property}-@{direction}: @md-gutter;
}
@media @lg-screen
{
@{property}-@{direction}: @lg-gutter;
}
}
.generate-property-loop((@var + 1), @possible-values);
}
解决方案 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);
.@{property}
{
&.@{direction}
{
@{property}-@{direction}: @gutter;
}
}
.generate-property-loop((@var + 1), @possible-values, @gutter);
}
解决方案 3
使用双嵌套循环,您可以实现完全的灵活性,只需将“directions”和“scren-size”作为参数传递,但会牺牲一点可读性:
.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);
.@{property}
{
&.@{direction}
{
@{property}-@{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);
}