Revision: 63917
Updated Code
at December 6, 2013 01:54 by BuschFunker
Updated Code
/** * Grid requirements * * 1. Grid must be fluid so it adjusts on every viewport's content width * 2. Grid must be able to float items on multiple lines, e.g. 4 items on one or 2 lines (2 items each) * 3. Grid should be applicable as HTML classes and/or mixins * 4. You should be able to set up responsive grid layouts * e.g. different amount of columns in different viewports (see requirement 2) * * * Grid specs * * 1. We use percentage widths and spacings to cover requirement 1 * 2. We use a negative margin row with all left margin cols to cover requirement 2 * 3. The grid can be set up completely in HTML by using the given classes: .row, .layout-responsive-x, .col, .col-span-x, .offset-x, etc. * Or you can apply the same styles in LESS by using the mixins: .row(), .layout-responsive-x(), .col(), .col-span(x), .offset(x), etc. * 4. To build a responsive grid use .layout-responsive classes on your grid .rows and declare the .cols inside those layouts. * Use .col-x instead of .col-span-x as logical unit inside such a layout if columns have different sizes * * NEW * Use .ordered, .pull-x and .push-x to optically reposition elements while keeping the html order! * credit for this goes to twitter bootstrap * * * Hint: since everything gets calculated within mixins you could even use float numbers for grid widths ;) * .col-span(3.5) **/ /*--- base variables ---*/ @grid-fixed-width: 960px; @grid-fixed-gutter: 20px; @grid-max-cols: 12; /*-- set up fluid grid ---*/ @grid-fluid-width: 100%; @decimal-places: 3; // used for rounding calculated numbers // fluid gutter is calculated relatively to the static gutter in fixed grid width @grid-fluid-gutter: round(percentage((100 / (@grid-fixed-width / @grid-fixed-gutter)) / 100), @decimal-places); // calculate the width of one grid column @grid-one-col: (@grid-fluid-width - (@grid-fluid-gutter * (@grid-max-cols))) / @grid-max-cols; /*--- mixins ---*/ #grid { .span-width(@num: @grid-max-cols) { width: round((@grid-one-col * @num) + (@grid-fluid-gutter * (@num - 1)), @decimal-places); } .indent(@num: 0) when (@num >= 0) { margin-left: round((@grid-one-col * @num) + (@grid-fluid-gutter * (@num + 1)), @decimal-places); } .indent(@num: -1) when (@num < 0) { margin-left: round((@grid-one-col * @num) + (@grid-fluid-gutter * (@num - 1)), @decimal-places); } .push(@num) when (@num >= 0) { position: relative; left: round((@grid-one-col * @num) + (@grid-fluid-gutter * @num), @decimal-places); } .pull(@num) when (@num >= 0) { position: relative; right: round((@grid-one-col * @num) + (@grid-fluid-gutter * @num), @decimal-places); } // less loop .loop (@index, @class: item, @mixin: '') when (@index > 0) { // create the actual css selector .@{class}-@{index} { #loopMixin > .apply(@mixin, @index); } // next iteration .loop(@index - 1, @class, @mixin); } // end the loop when index is 0 .loop (@index) when (@index = 0) { } } /* * Clearfix: contain floats * * For modern browsers * 1. The space content is one way to avoid an Opera bug when the * `contenteditable` attribute is included anywhere else in the document. * Otherwise it causes space to appear at the top and bottom of elements * that receive the `clearfix` class. * 2. The use of `table` rather than `block` is only necessary if using * `:before` to contain the top-margins of child elements. */ .clearfix { /* * For IE 6/7 only * Include this rule to trigger hasLayout and contain floats. */ *zoom: 1; &:before, &:after { content: " "; /* 1 */ display: table; /* 2 */ } &:after { clear: both; } } /*--- base layout styles ---*/ .row, .col { display: block; margin-right: 0; padding-left: 0; padding-right: 0; } .row { .clearfix(); margin-left: -@grid-fluid-gutter; &.ordered { position: relative; } } .col { margin-left: @grid-fluid-gutter; float: left; &.spacer { min-height: 1px; } } // make simpler mixins available (mainly for class/mixin name consistency) .col-span(@num: 0) when (@num >= 0) { #grid > .span-width(@num); } .offset(@num: 0) { #grid > .indent(@num); } .push(@num: 0) when (@num >= 0) { #grid > .push(@num); } .pull(@num: 0) when (@num >= 0) { #grid > .pull(@num); } /*--- generate grid classes ---*/ /** * Parameters: * 1) amount of iterations * 2) class selector prefix to generate * 3) mixin to apply to each selector * * Example: * .loop(12, item, 'setTabIndex'); * * NOTE: you can not use the generated classes themselves as mixins! */ .row { #grid > .loop(@grid-max-cols, col-span, 'grid-span'); #grid > .loop(@grid-max-cols - 1, offset, 'grid-offset'); #grid > .loop(@grid-max-cols - 1, push, 'grid-push'); #grid > .loop(@grid-max-cols - 1, pull, 'grid-pull'); } // mixins to call inside less loop #loopMixin { // base grid loops .apply('grid-span', @index) { #grid > .span-width(@index); } .apply('grid-offset', @index) { #grid > .indent(@index); } .apply('grid-push', @index) { #grid > .push(@index); } .apply('grid-pull', @index) { #grid > .pull(@index); } // grid loops end }
Revision: 63916
Updated Code
at June 18, 2013 00:48 by BuschFunker
Updated Code
/** * Grid requirements * * 1. Grid must be fluid so it adjusts on every viewport's content width * 2. Grid must be able to float items on multiple lines, e.g. 4 items on one or 2 lines (2 items each) * 3. Grid should be applicable as HTML classes and/or mixins * 4. You should be able to set up responsive grid layouts * e.g. different amount of columns in different viewports (see requirement 2) * * * Grid specs * * 1. We use percentage widths and spacings to cover requirement 1 * 2. We use a negative margin row with all left margin cols to cover requirement 2 * 3. The grid can be set up completely in HTML by using the given classes: .row, .layout-responsive-x, .col, .col-span-xx, .offset-x * Or you can apply the same styles in LESS by using the mixins: .row(), .layout-responsive-x(), .col(), #grid > .span-width(xx), #grid > .indent(x) * 4. To build a responsive grid use the .layout-responsive classes on your grid .rows and declare the .cols inside those layouts. * Use .col-xx instead of .col-span-xx as logical unit inside such a layout if columns have different sizes * **/ /*--- base variables ---*/ @gridFixedWidth: 960px; @fixedGutter: 20px; @gridMaxCols: 12; /*-- set up fluid grid ---*/ @gridFluidWidth: 100%; @decimalPlaces: 3; // used for rounding calculated numbers // fluid gutter is calculated relatively to the static gutter in fixed grid width @fluidGutter: round(percentage((100 / (@gridFixedWidth / @fixedGutter)) / 100), @decimalPlaces); @oneCol: (@gridFluidWidth - (@fluidGutter * (@gridMaxCols))) / @gridMaxCols; /*--- mixins ---*/ #grid { .span-width(@num: @gridMaxCols) { width: round((@oneCol * @num) + (@fluidGutter * (@num - 1)), @decimalPlaces); } .indent(@num: 0) when (@num > 0) { margin-left: round((@oneCol * @num) + (@fluidGutter * (@num + 1)), @decimalPlaces); } .indent(@num: 0) when (@num < 0) { margin-left: round((@oneCol * @num) + (@fluidGutter * (@num - 1)), @decimalPlaces); } } /*--- base layout styles ---*/ .row { .cf(); // clearfix margin: 0 0 0 -@fluidGutter; padding: 0; } .col { display: block; margin: 0 0 0 @fluidGutter; padding: 0; float: left; } /*--- generate grid classes ---*/ /** * .loop() and loop mixins in helpers.less * * Parameters: * 1) amount of iterations * 2) class selector prefix to generate * 3) mixin to apply to each selector * * Example: * .loop(12, item, 'setTabIndex'); * * NOTE: you can not use the generated classes themselves as mixins! */ .row { .loop(@gridMaxCols, col-span, 'gridSpan'); .loop(@gridMaxCols - 1, offset, 'gridOffset'); } /** * set up responsive grid layouts * use/extend these or simply keep the normal grid * if no responsiveness is needed * e.g. columns are the same on every viewport * * apply these classes to your grid .rows * * some example responsive setups: **/ .layout-responsive-1 { /** * tablet landscape & desktop: 3 columns per line * tablet portrait: 2 columns per line * phone: 1 column per line **/ @media @desktop { & > .col { #grid > .span-width(@gridMaxCols/3); } } @media @tablet { & > .col { #grid > .span-width(@gridMaxCols/2); } } @media @phone { & > .col { #grid > .span-width(@gridMaxCols); } } } .layout-responsive-2 { /** * tablet and up: 2 columns per line * phone: 1 column per line **/ @media @tabletAndUp { & > .col { #grid > .span-width(@gridMaxCols/2); } } @media @phone { & > .col { #grid > .span-width(@gridMaxCols); } } } .layout-responsive-3 { /** * tablet and up: one column takes 2/3, the other 1/3 * phone: both columns take the whole width * * note the naming col-x instead of col-span-x * which indicates a logical unit inside this layout * rather than a specific column width **/ @media @tabletAndUp { & > .col-1 { #grid > .span-width(@gridMaxCols/3); } & > .col-2 { #grid > .span-width(@gridMaxCols/3*2); } } @media @phone { & > .col { #grid > .span-width(@gridMaxCols); } } }
Revision: 63915
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at June 18, 2013 00:27 by BuschFunker
Initial Code
/** * Grid requirements * * 1. Grid must be fluid so it adjusts on every viewport's content width * 2. Grid must be able to float items on multiple lines, e.g. 4 items on one or 2 lines (2 items each) * 3. Grid should be applicable as HTML classes and/or mixins * 4. You should be able to set up responsive grid layouts * e.g. different amount of columns in different viewports (see requirement 2) * * * Grid specs * * 1. We use percentage widths and spacings to cover requirement 1 * 2. We use a negative margin row with all left margin cols to cover requirement 2 * 3. The grid can be set up completely in HTML by using the given classes: .row, .layout-responsive-x, .col, .col-span-xx, .offset-x * Or you can apply the same styles in LESS by using the mixins: .row(), .layout-responsive-x(), .col(), #grid > .span-width(xx), #grid > .indent(x) * 4. To build a responsive grid use the .layout-responsive classes on your grid .rows and declare the .cols inside those layouts. * Use .col-xx instead of .col-span-xx as logical unit inside such a layout if columns have different sizes * **/ /*--- base variables ---*/ @gridFixedWidth: @contentMaxWidth; @fixedGutter: @hSpacing; @gridMaxCols: 12; /*-- set up fluid grid ---*/ @gridFluidWidth: 100%; @decimalPlaces: 3; // used for rounding calculated numbers // fluid gutter is calculated relatively to the static gutter in fixed grid width @fluidGutter: round(percentage((100 / (@gridFixedWidth / @fixedGutter)) / 100), @decimalPlaces); @oneCol: (@gridFluidWidth - (@fluidGutter * (@gridMaxCols))) / @gridMaxCols; /*--- mixins ---*/ #grid { .span-width(@num: @gridMaxCols) { width: round((@oneCol * @num) + (@fluidGutter * (@num - 1)), @decimalPlaces); } .indent(@num: 0) when (@num > 0) { margin-left: round((@oneCol * @num) + (@fluidGutter * (@num + 1)), @decimalPlaces); } .indent(@num: 0) when (@num < 0) { margin-left: round((@oneCol * @num) + (@fluidGutter * (@num - 1)), @decimalPlaces); } } /*--- base layout styles ---*/ .row { .cf(); // clearfix margin: 0 0 0 -@fluidGutter; padding: 0; } .col { display: block; margin: 0 0 0 @fluidGutter; padding: 0; float: left; } /*--- generate grid classes ---*/ /** * .loop() and loop mixins in helpers.less * * Parameters: * 1) amount of iterations * 2) class selector prefix to generate * 3) mixin to apply to each selector * * Example: * .loop(12, item, 'setTabIndex'); * * NOTE: you can not use the generated classes themselves as mixins! */ .row { .loop(@gridMaxCols, col-span, 'gridSpan'); .loop(@gridMaxCols - 1, offset, 'gridOffset'); } /** * set up responsive grid layouts * use/extend these or simply keep the normal grid * if no responsiveness is needed * e.g. columns are the same on every viewport * * apply these classes to your grid .rows * * some example responsive setups: **/ .layout-responsive-1 { /** * tablet landscape & desktop: 3 columns per line * tablet portrait: 2 columns per line * phone: 1 column per line **/ @media @desktop { & > .col { #grid > .span-width(@gridMaxCols/3); } } @media @tablet { & > .col { #grid > .span-width(@gridMaxCols/2); } } @media @phone { & > .col { #grid > .span-width(@gridMaxCols); } } } .layout-responsive-2 { /** * tablet and up: 2 columns per line * phone: 1 column per line **/ @media @tabletAndUp { & > .col { #grid > .span-width(@gridMaxCols/2); } } @media @phone { & > .col { #grid > .span-width(@gridMaxCols); } } } .layout-responsive-3 { /** * tablet and up: one column takes 2/3, the other 1/3 * phone: both columns take the whole width * * note the naming col-x instead of col-span-x * which indicates a logical unit inside this layout * rather than a specific column width **/ @media @tabletAndUp { & > .col-1 { #grid > .span-width(@gridMaxCols/3); } & > .col-2 { #grid > .span-width(@gridMaxCols/3*2); } } @media @phone { & > .col { #grid > .span-width(@gridMaxCols); } } }
Initial URL
Initial Description
A simple to use yet very flexible fluid grid with less. See an example list of [responsive grid layouts](http://snipplr.com/view/73096/example-responsive-grid-layouts-for-responsibly/)
Initial Title
Responsibly - Responsive fluid grid with LESS
Initial Tags
Initial Language
CSS