fixing css columns

2007-10-25 @ 18:52#

lots of ways to do this. since i'm a coding geek, i use javascript to even out columns in a CSS display. typically, i use a container element to hold the layout. not purist, but functional. below is a simple three-column CSS fixed-width layout with varying height columns. there's a single javascript method attached to the window.onload event that scans for special CSS classes and uses them to adjust the column heights on the fly. i set the background-color of the element to make it easy to see how things work.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Three-Column Adjusted</title>
    <style type="text/css">

      /*
      * NOTE:
      * subtract any added padding/border from the total width of the element.
      * To add a background to the container, add a clearing element after the columns.
      */

      body {
        margin:0px;
        padding:0px;
      }

      #container {
        width: 1000px;
        margin: auto;
      }

      #leftbar {
        text-align:left;
        float: left;
        width: 200px;
        background-color:green;
      }

      #content {
        text-align:left;
        float: left;
        width: 600px;
        background-color:yellow;
      }

      #rightbar {
        text-align:left;
        float: right;
        width: 200px;
        background-color:silver;
      }

      #header {
        text-align:left;
        background-color:red;
      }

      #footer {
        text-align:left;
        clear: both;
        background-color:red;
      }

    </style>
    <script type="text/javascript">

      var fixColumns =
      {
        containerCSS : 'fx-container',
        columnCSS : 'fx-column',
        headerCSS : 'fx-header',
        footerCSS : 'fx-footer',

        init:function ()
        {
          var divs = document.getElementsByTagName('div');

          for(var i=0;i<divs.length;i++)
          {
            if(divs[i].className.indexOf(fixColumns.containerCSS)!=-1)
            {
              var height = divs[i].offsetHeight;
              var coll = divs[i].getElementsByTagName('div');

              for(var j=0;j<coll.length;j++)
              {
                if(coll[j].className.indexOf(fixColumns.headerCSS)!=-1)
                {
                  height=height-coll[j].offsetHeight;
                }
                if(coll[j].className.indexOf(fixColumns.footerCSS)!=-1)
                {
                  height=height-coll[j].offsetHeight;
                }
              }

              for(var j=0;j<coll.length;j++)
              {
                if(coll[j].className.indexOf(fixColumns.columnCSS)!=-1)
                {
                  coll[j].style.height = height+'px';
                }
              }
            }
          }
        }
      }

      window.onload = fixColumns.init;

    </script>
  </head>
  <body>
    <div id="container" class="fx-container">

      <div id="header" class="fx-header">
        HEADER
      </div>

      <div id="leftbar" class="fx-column">
        LEFT<br />
        LEFT<br />
        LEFT<br />
        LEFT<br />
        LEFT<br />
      </div>

      <div id="content" class="fx-column">
        CONTENT<br />
        CONTENT<br />
      </div>

      <div id="rightbar" class="fx-column">
        RIGHT<br />
        RIGHT<br />
        RIGHT<br />
        RIGHT<br />
        RIGHT<br />
        RIGHT<br />
        RIGHT<br />
      </div>

      <div id="footer" class="fx-footer">
        FOOTER
      </div>

    </div>

  </body>
</html>

code