如何动态生成用逗号分隔的类列表?

Posted

技术标签:

【中文标题】如何动态生成用逗号分隔的类列表?【英文标题】:How to dynamically generate a list of classes with commas separating them? 【发布时间】:2013-10-05 22:30:44 【问题描述】:

我正在使用 SASS 的 SCSS 语法来创建动态网格系统,但我遇到了障碍。

我正在尝试像这样使网格系统完全动态:

$columns: 12;

然后我创建这样的列:

@mixin col-x 
  @for $i from 1 through $columns 
  .col-#$i  width: $column-size * $i; 
  

哪些输出:

.col-1 
    width: 4.16667%;
  

.col-2 
    width: 8.33333%;

etc...

这很好用,但是我接下来要做的是根据选择的 $columns 的数量动态生成一长串用逗号分隔的列类 - 例如,我希望它看起来像这样:

.col-1,
.col-2,
.col-3,
.col-4,
 etc... 
float: left;

我已经厌倦了:

@mixin col-x-list 
  @for $i from 1 through $columns - 1 
  .col-#$i-m  float: left; 
  

但输出是这样的:

.col-1 
  float: left;

.col-2 
  float: left;

etc...

我对这里的逻辑以及创建这样的东西所需的 SCSS 语法有点卡住了。

有人有什么想法吗?

【问题讨论】:

出于好奇:“@mixin col-x @for $i 从 1 到 $columns .col-#$i width: $column-size * $i; " 你能解释一下这段代码究竟做了什么吗? @Mag 它遍历我设置的列数,例如$列:6;并创建一个名为 col-1、col-2 等的类。所以如果我想要 6 列,它只会循环到 col-6。然后它给每个列的宽度(100% 除以 $columns 的数量,然后乘以它的列号),例如col-3 = (100% / 6) * 3 = 50%。 【参考方案1】:

我想你可能想看看@extend。如果你这样设置:

$columns: 12;

%float-styles 
  float: left;


@mixin col-x-list 
  @for $i from 1 through $columns 
      .col-#$i-m  @extend %float-styles; 
  


@include col-x-list;

它应该在您的 css 文件中呈现为:

.col-1-m, .col-2-m, .col-3-m, .col-4-m, .col-5-m, .col-6-m, .col-7-m, .col-8-m, .col-9-m, .col-10-m, .col-11-m, .col-12-m 
  float: left;

@extend in the docs.

【讨论】:

太棒了。您的回答还描述了如何创建自定义代码,例如 .col-#$i-m【参考方案2】:

还有一种方法可以满足您的问题的具体要求:生成(并使用)一个用逗号分隔的类列表。 D.Alexander 的回答完全适用于您的情况,但我'正在发布此替代方案,以防有人查看此问题的另一个用例。

这是一支钢笔演示:http://codepen.io/davidtheclark/pen/cvrxq

基本上,您可以使用Sass functions 来实现您想要的。具体来说,我使用append 将类添加到我的列表中,用逗号分隔,unquote 以避免与类名中的句点发生编译冲突。

所以我的 mixin 最终看起来像这样:

@mixin col-x 
  $col-list: null;
  @for $i from 1 through $columns 
    .col-#$i 
      width: $column-size * $i;
    
   $col-list: append($col-list, unquote(".col-#$i"), comma);
  
  #$col-list 
    float: left;
  

【讨论】:

【参考方案3】:

@davidtheclark 这里是一个更通用的版本:

@mixin attr-x($attr, $attr-count: 10, $attr-steps: 10, $unit: '%') 
    $attr-list: null;
    @for $i from 1 through $attr-count 
        $attr-value: $attr-steps * $i;

        .#$attr#$attr-value 
            #$attr: #$attr-value#$unit;
        

        $attr-list: append($attr-list, unquote(".#$attr-#$attr-value"), comma);
    

    #$attr-list 
        //append style to all classes
    

像这样使用它:

@include attr-x('margin-left', 6, 5, 'px');
//or
@include attr-x('width');

结果如下:

.margin-left5 
  margin-left: 5px; 

.margin-left10 
  margin-left: 10px; 

...

.margin-left30 
  margin-left: 30px; 

.width10 
  width: 10%; 

.width20 
  width: 20%; 

...

.width100 
  width: 100%; 

【讨论】:

以上是关于如何动态生成用逗号分隔的类列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT/XPath 生成逗号分隔的列表?

如何使用带有逗号分隔值的单元格通过apps脚本创建动态下拉列表

Helm-动态字符串的逗号分隔列表

django 动态生成CSV文件

跨服务器,标准 SQL 生成逗号分隔列表

第二章:视图层 - 9:动态生成CSV文件