[SCSS] Loop Over Data with the SCSS @each Control Directive

The SCSS @for directive is great when we know how many iterations are required and we only need 1 variable. What if we need multiple variables to iterate over data sets? Hello SCSS maps and the @each control directive! In this lesson, we’ll check out iterating with lists and looping over data sets with maps and the @each directive.

 

// work with simple array
$superheroes: wonder-woman, spiderman, batman, superman;
@each $hero in $superheroes {
  .#{$hero}-logo {
    content: "#{$hero}";
  }
}

// we get
.wonder-woman-logo {
  content: "wonder-woman"; }

.spiderman-logo {
  content: "spiderman"; }

.batman-logo {
  content: "batman"; }

.superman-logo {
  content: "superman"; }

 

key: value pairs using map-get():

// work with key: value pair
$breakpoints: (sm: 375px, md: 768px, lg: 1200px);
$container-widths: (sm: 250px, md: 500px, lg: 750px);
@each $size, $bp in $breakpoints {
  @media only screen and (min-width: $bp) {
    .container-width {
      // because $breakpoints and $container-widths have the same key
      // we can use map_get(target_ary, key) to get value
      width: map_get($container-widths, $size);
    }
  }
}

// we get
@media only screen and (min-width: 375px) {
  .container-width {
    width: 250px; } }

@media only screen and (min-width: 768px) {
  .container-width {
    width: 500px; } }

@media only screen and (min-width: 1200px) {
  .container-width {
    width: 750px; } }

 

index: values pair using nth()

$hero-media:  (1 375px 768px crimson),
              (2 768px 1000px darkred),
              (3 1200px 1400px grey),
              (4 768px 1200px blue);

// we get

@media only screen and (min-width: 375px) and (max-width: 768px) {
  .wonder-woman {
    background-color: crimson; } }

@media only screen and (min-width: 768px) and (max-width: 1000px) {
  .spiderman {
    background-color: darkred; } }

@media only screen and (min-width: 1200px) and (max-width: 1400px) {
  .batman {
    background-color: grey; } }

@media only screen and (min-width: 768px) and (max-width: 1200px) {
  .superman {
    background-color: blue; } }

 

posted @ 2017-05-18 15:28  Zhentiw  阅读(297)  评论(0编辑  收藏  举报