Sass @each with multiple variables

前端 未结 5 1682
生来不讨喜
生来不讨喜 2020-11-30 01:58

I\'m just getting started with Sass and Compass, and I\'m loving it. Something I\'d like to do is take advantage of the @each function to simplify repetitive ta

相关标签:
5条回答
  • 2020-11-30 02:28

    This functionality is supported for Sass 3.3.0 and above (I just updated from 3.2.14 to 3.4.4 in order to use it).

    @each $animal, $color in (puma, black), (sea-slug, green), (egret, brown), (salamander, red) {
      .#{$animal}-icon {
        background-color: $color;
      }
    }
    

    I'd recommend to check the changelog for backwards incompatibilities, if you're updating Sass.

    Sass reference for multiple assignments with @each

    0 讨论(0)
  • 2020-11-30 02:29

    Just came across this, have the answer for you. In Sass, you can actually have a multidimensional list, so instead of constructing individual variables, you'd create one variable to hold them all, then loop over them:

    $zoo: puma black, sea-slug green, egret brown, salamander red;
    
    @each $animal in $zoo {
      .#{nth($animal, 1)}-icon {
        background-color: nth($animal, 2);
      }
    }
    

    You can have multidimensional lists just like you would have single dimensional lists as long as each nested dimension is separated in a different manner (in our case, commas and spaces).

    UPDATE Oct 24, 2013

    In Sass 3.3, there is a new data type called maps which are a hashed set of items. With this, we can rewrite my previous answer in the following way to much more closely resemble the desired result:

    $zoo: ("puma": black, "sea-slug": green, "egret": brown, "salamander": red);
    
    @each $animal, $color in $zoo {
        .#{$animal}-icon {
            background-color: $color;
        }
    }
    

    You can see this in action over at SassMeister

    0 讨论(0)
  • 2020-11-30 02:36

    I'm in the same boat (beginner to Sass/Compass) and had to do something similar. Here's what I came up with, using nested lists:

    $flash_types: (success #d4ffd4) (error #ffd5d1);
    
    @each $flash_def in $flash_types {
        $type: nth($flash_def, 1);
        $colour: nth($flash_def, 2);
    
        &.#{$type} {
            background-color: $colour;
            background-image: url(../images/#{$type}.png);
        }
    }
    

    It's not the most elegant solution but it should work if you can't find anything else. Hope it helps! I'd appreciate a better method too :)

    0 讨论(0)
  • 2020-11-30 02:47

    Another solution could be to create different lists and "zip" them.

    //Create lists
    $animals: puma, sea-slug, egret, salamander;
    $animals-color: black, green, brown, red;
    
    //Zip lists
    $zoo: zip($animals, $animals-color);
    
    //Do cycle
    @each $animal, $color in $zoo {
        .#{$animal}-icon {
            background-color: $color;
        }
    }
    

    Probably this solution is more complicated to mantain than the others, but if you use a list more than one time, you can save time. (was my case)

    0 讨论(0)
  • 2020-11-30 02:48

    Another way I used if anyone needs it:

    $i:0;
    @each $name in facebook, twitter, google_plus, instagram, youtube, pinterest {
        $i:$i+1;
    }
    
    0 讨论(0)
提交回复
热议问题