Flexible CSS layout models for Rails using Polyfills

Polyfills for various HTML 5 "more flexible" layout models.

  • Flexie.js (Flex box layout)
  • Regions.js (CSS Regions)
  • CSS Multi-column
  • CSS Template layout

Flexie.js is a polyfill for the CSS3 Flexbox module from W3C.

CSS Template Layout is an implementation of CSS Template Layout Module from W3C. Currently 2 different implementions are packaged in this gem.

Regions.js is the first implementation for the CSS3-Regions in the real world.

These polyfills are all packaged for use with the Rails asset pipeline. This lets you use and experiment with the new HTML5 CSS layout model in order to simplify and improve your HTML grids and layout :)

In addition a stylesheet called flexlayout.css is included, which wraps the Flex layout model in order to provide some nice utility CSS classes. See the examples in spec/flexlayout for a usage demo.

Extras

Bonus view helpers

html5_script folder = nil

<!--[if lte IE 8]><script src=\"html5-forms/html5.min.js\" type=\"text/javascript\"><![endif]-->

No args:

"<!--[if lte IE 8]><script src=\"http://html5shim.googlecode.com/svn/trunk/html5.js\" type=\"text/javascript\"><![endif]-->"

script_src_tag src

Renders fx:

<script src=\"html5-forms/html5.min.js\" type=\"text/javascript\">

Install

gem 'flexlayout-rails'

Flexie.js 2010, Richard Herrera

//= require flexie

Flexie usage

var box = new Flexie.box({
    target : document.getElementById("foo"),
    orient : "horizontal",
    align : "stretch",
    direction : "normal",
    pack : "start",
    flexMatrix : [1, 1, 1, 1],
    ordinalMatrix : [0, 0, 0, 0]
});

The function flexiebox wraps this to support are more intuitive DSL, using jQuery to select the element to use as the target:

var box = flexiebox('#foo', options);

Defaults options:

DEFAULTS = {
  orient    : "horizontal",
  align     : "stretch",
  direction : "inherit",
  pack      : "start"
}

Note: Flexbox comes in different syntaxes as described here. The latest flex- syntax is only supported by Chrome 21+ as shown here. Hence you need fallback in your CSS:

selector 
{ display: flex }

.no-flexbox selector 
{ display: box }

View helpers

= flexie_script

Renders:

<!--[if lte IE 8]><script src="js/flexie.js"></script><![endif]-->

Flex box helpers

The following stylesheets with CSS helper classes are included.

  • flexlayout.css
  • flex-box-helpers.css

Also SCSS mixins at flex-layout.scss

Better yet to use Compass box mixins

@import "compass/css3"

.example {
  @include display-box;
  @include box-orient(horizontal);
  @include box-align(stretch);

  ...
  .content {
    @include box-flex(1);
  }  
} 

Or fx Preboot if using LESS.

.content {
  .box-flex(1);
}

Flexbox Articles

Critiques:

Conclusion: As is almost always the case, they are good only if used in the right context to solve the right problem ;)

Regions.js

If you find this interesting, just try this script!

Regions.js requires jQuery and Lettering.js in order to work.

//= require jquery
//= require lettering.jquery
//= require regions.jquery.min

The feature-detects/cssregions Modernizr detection included is part of Modernizr 2.6+ and supplied by Adobe.

if (!Modernizr.cssregions) {
  // use regions polyfill
}

Regions.js API usage

$(function(){ // When DOM is Loaded
    $("#article-flow").regions(".article-region");
});

You can also pass a jQuery Object or a list of jQuery Objects / jQuery Selectorstring to the function :

$("#content-source-element").regions($(".content-target-elements"));

// or

$("#content-source-element").regions(["#article-region-1", "#article-region-2", "#article-region-3"]);

// or

$("#content-source-element").regions([$("#article-region-1"), $("#article-region-2"), $("#article-region-3")]);

// even mixed

$("#content-source-element").regions([$("#article-region-1"), "#article-region-2", $("#article-region-3")]);

Template layout 2011-2012 Pablo Escalada

//= require template_layout/templateLayout

Not sure how/if to use the template generator and compiler!?

Template layout 2010, Alexis Deveria

//= require template_layout/jquery/jquery.tpl_layout1.1.16.min

Template layout usage

Alexis Deveria version, see repo css-template-layout and these demos :)

Pablo Escalada version, see repo at cssTemplateLayout and test folder for examples.

Multi column

See Multi-column

Example:

<div class="multi-column">
  <div class="column">hello</div>
  ...
</div>

Note: Use the multi-column.css included as well ;)

Wookmark

//= require jquery.wookmark.min

See Wookmark-jQuery for examples and demos.

FT Column flow

//= require FT-colum-flow.min
  • Configurable column widths, gutters and margins
  • Fixed-position elements
  • Elements spanning columns
  • Keep-with-next to avoid headings at the bottom of a column
  • No-wrap class to avoid splitting elements across columns
  • Grouping of columns into pages
  • Horizontal or vertical alignment of pages
  • Standardised line height to align text baseline to a grid
  • Rapid reflow as required by events such as device orientation or font-size change

See FT-column-flow for examples, demos and usage guide etc.

See fx Basic usage example

Contributing to flexlayout-rails

  • Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
  • Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
  • Fork the project.
  • Start a feature/bugfix branch.
  • Commit and push until you are happy with your contribution.
  • Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
  • Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.

Copyright (c) 2012 Kristian Mandrup. See LICENSE.txt for further details.