SCSS/ SASS: comment générer dynamiquement une liste de classes avec des virgules qui les séparent

je travaille avec la syntaxe SCSS de SASS pour créer un système de grille dynamique mais j'ai un problème.

j'essaie de rendre le système de grille complètement dynamique comme ceci:

$columns: 12;

puis-je créer les colonnes comme ceci:

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

les résultats:

.col-1 {
    width: 4.16667%;
  }

.col-2 {
    width: 8.33333%;
}
etc...

Cela fonctionne bien, mais ce que je veux faire ensuite est de générer dynamiquement une longue liste de classes de colonnes séparées par des virgules basées sur le nombre de $columns choisi - e.g Je veux qu'elle ressemble à ceci:

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

j'ai fatigué ceci:

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

mais la sortie est ceci:

.col-1 {
  float: left;
}
.col-2 {
  float: left;
}
etc...

je suis un peu coincé sur la logique ici aussi bien que sur la syntaxe SCSS nécessaire pour créer quelque chose comme ça.

quelqu'un a une idée?

Merci

45
demandé sur Damjan Pavlica 2013-09-30 10:35:44

3 réponses

je pense que vous voudrez peut-être prendre un coup d'oeil à @extend. Si vous le configurer quelque chose comme:

$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;

il devrait s'afficher dans votre fichier css comme:

.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;
}

@étendre dans les docs.

Espérons que cette aide!

72
répondu D.Alexander 2016-12-24 01:41:38

il y a aussi une façon de faire ce que votre question demande spécifiquement: générer (et utiliser) une liste de classes avec des virgules qui les séparent. la réponse de D. Alexander fonctionne parfaitement dans votre situation, mais je poste cette alternative au cas où il y aurait un autre cas d'utilisation pour quelqu'un qui regarde cette question.

voici un stylo démontrant: http://codepen.io/davidtheclark/pen/cvrxq

en gros, vous pouvez utiliser fonctions Sass pour atteindre ce que vous voulez. Plus précisément, j'utilise append pour ajouter des classes à ma liste, séparées par des virgules, et unquote pour éviter les conflits de compilation avec la période dans les noms de classe.

Donc mon mixin finit par ressembler à ceci:

@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;
  }
}

j'Espère que l'aide à quelqu'un.

12
répondu davidtheclark 2013-10-03 14:15:43

thnx to @davidtheclark voici une version plus générique:

@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
    }
}

l'Utiliser comme ceci:

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

Le résultat ressemble à ceci:

.margin-left5 {
  margin-left: 5px; }

.margin-left10 {
  margin-left: 10px; }

...

.margin-left30 {
  margin-left: 30px; }

.width10 {
  width: 10%; }

.width20 {
  width: 20%; }

...

.width100 {
  width: 100%; }
2
répondu b3wii 2017-06-06 10:31:04