分割数だけ指定(マージンなし)
最初はマージン0のタイプです。
12分割を4つのカラムで指定してみます。
HTML
<div class="row">
<div class="col-3"><p>Grid 3</p></div>
<div class="col-3"><p>Grid 3</p></div>
<div class="col-3"><p>Grid 3</p></div>
<div class="col-3"><p>Grid 3</p></div>
</div>
Mixinです。引数は「分割数」「マージン」「クラス名」の順で指定します。
SCSS
@mixin rowSplit($col:12, $class:'row-split') {
.#{$class}:after {
content: "";
display: table;
clear: both;
}
@for $i from 1 through $col
{
$width: (100% / ($col/$i));
.#{$class} .col-#{$i}
{
width: $width;
}
}
.#{$class} [class*='col-'] {
float: left;
}
}
@include rowSplit();
これは決まっているものなのでMixinにする意味はあまりないかもしれません。
分割数・マージンを指定するMixin
次はマージンを設定できるようにしてみましょう。
SCSS
@mixin rows($col:12, $gutter: 3%, $class:'row') {
$grid: (100% - (($col - 1) * $gutter)) / $col;
@for $i from 1 through $col
{
$num: $col - $i + 1;
$width: ($grid * $num) + ($gutter * ($num - 1));
.#{$class} .col-#{$num}
{
width: $width;
}
}
.#{$class} [class*='col-'] {
margin-left: $gutter;
float: left;
}
.#{$class} [class*='col-']:first-child {
margin-left: 0;
}
.#{$class}:after {
content: "";
display: table;
clear: both;
}
}
@include rows();
Bootstrapとかは間隔を開けるとwidthも狭くなると思いますが、これはピッタリ配置するタイプです。
リストで並べる
リストで並べる例です。3分割してみます。
liで指定したマージンをulで打ち消すタイプです。
なのですが、パーセント指定だとマージン数が大きくなった時左に隙間ができてしまいますね。
HTML
<ul class="blocks-3"> <li>33%</li> <li>33%</li> <li>33%</li> <li>33%</li> <li>33%</li> <li>33%</li> </ul>
SCSS
@mixin blocks($col, $gutter: 3%, $class:'blocks') {
[class*='#{$class}-'] {
padding-left: 0;
list-style: none;
margin-left: -$gutter;
}
[class*='#{$class}-']:after {
content: "";
display: table;
clear: both;
}
[class*='#{$class}-'] > li {
height: auto;
float: left;
margin-bottom: 1em;
margin-left: $gutter;
}
[class*='#{$class}-'] > li li {
float: none;
margin: 0;
}
@for $i from 2 through $col
{
$width: (100% / $i )- $gutter;
.#{$class}-#{$i} > li
{
width: $width;
}
}
}
@include blocks(6);
CSS3バージョン
ということでCSS3が使用できる条件ならこちら
SCSS
@mixin blocks($col, $gutter: 3%, $class:'blocks') {
[class*='#{$class}-'] {
padding-left: 0;
list-style: none;
}
[class*='#{$class}-']:after {
content: "";
display: table;
clear: both;
}
[class*='#{$class}-'] > li {
height: auto;
float: left;
margin-bottom: 1em;
margin-right: $gutter;
}
[class*='#{$class}-'] > li li {
float: none;
margin: 0;
}
@for $i from 1 through $col
{
$grid: (100% - (($i - 1) * $gutter)) / $i;
$num: $col - $i + 1;
$width: ($grid * $num) + ($gutter * ($num - 1));
.#{$class}-#{$i} > li
{
width: $grid;
}
}
}
@include blocks(6, 3%);
[class*='blocks-'] > li:nth-child(3n) {
margin-right: 0;
}
最後に3番目だけマージンを0にしています。
jQueryとかでやってもいいですね。
割合を決めて分割
12分割じゃなくて割合を決めて分割するタイプです。
SCSS
@mixin rows($gutter: 3%, $class:'row', $col-class:'unit-') {
$nums: 90, 80, 75, 70, 66, 65, 60, 50, 40, 35, 33, 30, 25, 20, 10;
@each $num in $nums {
@if $num == 33 {
$value: 33.333333333333;
}
@else if $num == 66 {
$value: 66.666666666666;
}
@else {
$value: $num;
}
$split: (100/$value)-1;
$grid: $split * $gutter;
$width: (100 - $grid) / ($split + 1);
.#{$class} .#{$col-class}#{$num} {
width: $width;
}
}
.#{$class} [class*=#{$col-class}] {
float: left;
margin-left: $gutter;
}
.#{$class} [class*=#{$col-class}]:first-child {
margin-left: 0;
}
}
3分割にしたかったので33と66だけ小数点で切り分けてます。


