使用Less/Sass生成Bootstrap格栅样式系统
熟悉Bootstrap的同学应该了解其中的格栅系统,用来排版非常方便。他将页面分为12等分,并且适用不同的尺寸屏幕。超小xs(小于768px),小屏sm(大于等于768px),中屏md(大于等于992px),大屏lg(大于等于1200px)。为此需要生成一堆的.clo-*-*类,总计4*12=48个,再加上pull,push,offset。这种只能用less来写了,参考Bootstrap的less源码,自己重新写了一个,仅供练手
Less版本
@sm-width: 768px; @md-width: 992px; @lg-width: 1200px; @grid-columns: 12; @grid-gutter: 30px; @container-sm: (720px + @grid-gutter); @container-md: (940px + @grid-gutter); @container-lg: (1140px + @grid-gutter); .grid-padding(@gutter){ padding-left: floor((@gutter)/2); padding-right: floor((@gutter)/2); } .make-container() { .grid-padding(@grid-gutter); margin-left: auto; margin-right: auto; @media (min-width: @sm-width) { width: @container-sm; } @media (min-width: @md-width) { width: @container-md; } @media (min-width: @lg-width) { width: @container-lg; } } .container{ .make-container; } .container-fluid{ .grid-padding(@grid-gutter); margin-left: auto; margin-right: auto; } .row { margin-left: -15px; margin-right: -15px; } .make-grid() { .col(@index; @list) when(@index @grid-columns) { @{item} { .grid-padding(@grid-gutter); position: left; min-height: 1px; } } .col(1; '.col-xs-0'); } .make-grid(); .make-column(@class) { .col(@index; @list) when (@index @grid-columns) { @{list} { float: left; } } .col(1; '.col-@{class}-0'); } .make-column(xs); @media (min-width: @sm-width) { .make-column(sm); } @media (min-width: @md-width) { .make-column(md); } @media (min-width: @lg-width) { .make-column(lg); }
sass版本
$screen-map: (xs:768px, sm: 768px, md: 992px, lg: 1200px); $gutter-width: 30px; $container-map: (sm: 720px + $gutter-width, md: 940px + $gutter-width, lg: 1140px + $gutter-width); $grid-columns: 12; $colclass-map: (pull: right, push: left, offset: margin-left); @mixin grid-padding($gutter) { padding-left: $gutter/2; padding-right: $gutter/2; } @mixin margin-auto($horizone:null) { @if $horizone { margin: $horizone/2 auto; } @else { margin-left: auto; margin-right: auto; } } @mixin make-container() { @include grid-padding($gutter-width); @include margin-auto(); @each $screen, $width in $container-map { $min-width: map-get($screen-map, $screen); @media (min-width: $min-width) { width: $width; } } } .container{ @include make-container(); } .container-fluid{ @include grid-padding($gutter-width); @include margin-auto(); } .row { margin-left: -15px; margin-right: -15px; } @mixin make-grid() { $list: null; @for $i from 1 through $grid-columns { @each $screen, $width in $screen-map { $item: '.col-#{$screen}-#{$i}'; @if $list { $list: #{$list}, #{$item}; } @else { $list: $item; } } } #{$list} { @include grid-padding($gutter-width); position: left; min-height: 1px; } } @mixin make-column($screen) { $list: null; @for $i from 1 through $grid-columns { $item: '.col-#{$screen}-#{$i}'; @if $list { $list: #{$list}, #{$item}; } @else { $list: $item; } #{$item} { width: percentage(($i)/$grid-columns); } @each $class, $suffix in $colclass-map { .col-#{$screen}-#{$class}-#{$i} { #{$suffix}: percentage(($i)/$grid-columns); } } } #{$list} { float: left; } } @include make-grid(); @each $screen, $width in $screen-map { @if $screen == xs { @include make-column($screen); } @else { @media (min-width: $width) { @include make-column($screen); } } }
编译生成对应CSS文件:
.container { padding-left: 15px; padding-right: 15px; margin-left: auto; margin-right: auto; } @media (min-width: 768px) { .container { width: 750px; } } @media (min-width: 992px) { .container { width: 970px; } } @media (min-width: 1200px) { .container { width: 1170px; } } .container-fluid { padding-left: 15px; padding-right: 15px; margin-left: auto; margin-right: auto; } .row { margin-left: -15px; margin-right: -15px; } .col-xs-0, .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { padding-left: 15px; padding-right: 15px; position: left; min-height: 1px; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-2 { width: 16.66666667%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-3 { width: 25%; } .col-xs-pull-3 { right: 25%; } .col-xs-push-3 { left: 25%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-4 { width: 33.33333333%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-5 { width: 41.66666667%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-6 { width: 50%; } .col-xs-pull-6 { right: 50%; } .col-xs-push-6 { left: 50%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-7 { width: 58.33333333%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-8 { width: 66.66666667%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-9 { width: 75%; } .col-xs-pull-9 { right: 75%; } .col-xs-push-9 { left: 75%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-10 { width: 83.33333333%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-11 { width: 91.66666667%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-12 { width: 100%; } .col-xs-pull-12 { right: 100%; } .col-xs-push-12 { left: 100%; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-0, .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } @media (min-width: 768px) { .col-sm-1 { width: 8.33333333%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-2 { width: 16.66666667%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-3 { width: 25%; } .col-sm-pull-3 { right: 25%; } .col-sm-push-3 { left: 25%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-4 { width: 33.33333333%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-5 { width: 41.66666667%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-6 { width: 50%; } .col-sm-pull-6 { right: 50%; } .col-sm-push-6 { left: 50%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-7 { width: 58.33333333%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-8 { width: 66.66666667%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-9 { width: 75%; } .col-sm-pull-9 { right: 75%; } .col-sm-push-9 { left: 75%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-10 { width: 83.33333333%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-11 { width: 91.66666667%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-12 { width: 100%; } .col-sm-pull-12 { right: 100%; } .col-sm-push-12 { left: 100%; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-0, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } } @media (min-width: 992px) { .col-md-1 { width: 8.33333333%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-push-1 { left: 8.33333333%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-2 { width: 16.66666667%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-push-2 { left: 16.66666667%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-3 { width: 25%; } .col-md-pull-3 { right: 25%; } .col-md-push-3 { left: 25%; } .col-md-offset-3 { margin-left: 25%; } .col-md-4 { width: 33.33333333%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-push-4 { left: 33.33333333%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-5 { width: 41.66666667%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-push-5 { left: 41.66666667%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-6 { width: 50%; } .col-md-pull-6 { right: 50%; } .col-md-push-6 { left: 50%; } .col-md-offset-6 { margin-left: 50%; } .col-md-7 { width: 58.33333333%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-push-7 { left: 58.33333333%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-8 { width: 66.66666667%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-push-8 { left: 66.66666667%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-9 { width: 75%; } .col-md-pull-9 { right: 75%; } .col-md-push-9 { left: 75%; } .col-md-offset-9 { margin-left: 75%; } .col-md-10 { width: 83.33333333%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-push-10 { left: 83.33333333%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-11 { width: 91.66666667%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-push-11 { left: 91.66666667%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-12 { width: 100%; } .col-md-pull-12 { right: 100%; } .col-md-push-12 { left: 100%; } .col-md-offset-12 { margin-left: 100%; } .col-md-0, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } } @media (min-width: 1200px) { .col-lg-1 { width: 8.33333333%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-2 { width: 16.66666667%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-3 { width: 25%; } .col-lg-pull-3 { right: 25%; } .col-lg-push-3 { left: 25%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-4 { width: 33.33333333%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-5 { width: 41.66666667%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-6 { width: 50%; } .col-lg-pull-6 { right: 50%; } .col-lg-push-6 { left: 50%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-7 { width: 58.33333333%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-8 { width: 66.66666667%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-9 { width: 75%; } .col-lg-pull-9 { right: 75%; } .col-lg-push-9 { left: 75%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-10 { width: 83.33333333%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-11 { width: 91.66666667%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-12 { width: 100%; } .col-lg-pull-12 { right: 100%; } .col-lg-push-12 { left: 100%; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-0, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } }