SCSS variables and operators
Hello.
I'm trying to organize a website using a responsive grid. I'm using a 12 column grid, and I need to create css classes for different column spans. For simplicity reasons, say both the column and gutter widths are 4%. This way I have 12 columns (12 x 4% = 48%) and 13 gutters (13 x 4% = 52%). The largest content will span 10 columns (and thus 9 inside gutters).
The classes I need are something like
$column-width: 4%;
$gutter-width: 4%;
.col-w1 {
width: $column-width;
}
.col-w2 {
width: $column-width * 2 + gutter-width;
}
(...)
.col-w10 {
width: $column-width * 10 + gutter-width * 9;
}
So every class obeys the following rule: width = $column-width * n + $gutter-width * (n-1), where n is the number of columns.
Having read this great article on Advanced SCSS, I could create these classes automatically by creating a function with arguments like the class prefix, the number of columns and the column and gutter width. Here's what I tried.
$column-width: 4%;
$gutter-width: 4%;
$colsnumbers1: 1 0, 2 1, 3 2, 4 3, 5 4, 6 5, 7 6, 8 7, 9 8, 10 9; // each pair is the number of columns and number of gutters
@mixin method1($prefix, $colwidth, $gutwidth, $colsnumbers1) {
@each $i in $colsnumbers1 {
.#{$prefix}#{nth($i, 1)} {
width: $colwidth * nth($i, 1) + $gutwidth * nth($i, 2);
}
}
}
@include method1('col_w',
$column-width,
$gutter-width,
$colsnumbers1
);
This works. However, having to create such a large $colsnumbers1 is not very practical. I tried to simplify it using something like this:
$colsnumbers2: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; // number of columns. I imagine there's a better way to do this
@mixin method2($prefix, $colwidth, $gutwidth, $colsnumbers2) {
@each $i in $colsnumbers2 {
.#{$prefix}#{$i} { // this throws an error on the {$i} part
width: $colw * $i + $gutw * ($i-1); // this throws an error on the ($i-1) part
}
}
}
@include method2('col_w',
$column-width,
$gutter-width,
$colsnumbers2
);
So my questions are:
1. How to get .#($prefix)#($i) to output .col-w1, .col-w2... col-w10.
2. How to get $i-1 to work correctly.
I'm assuming what I want to achieve is possible. I appreciate all the help you can provide. Thanks.
