HTML5 + CSS3 Backwards compatibility on calc() css function

2.1k views Asked by At

Here's the fiddle: http://jsfiddle.net/F793U/1/

I am creating a web application with 4 sections that take up 100% of the window real estate. Two of the sections, side-bar and content, have their own scrollbars. The browser scrollbars should never be seen. To achieve this I have used the css calc() function.

My question is: Is there a simpler way to achieve this? And, if not, how can I apply this to older browsers (such as IE 8 and before)?

HTML:

<!DOCTYPE html>
<html>
<head>
<title></title>
<link rel="stylesheet" href="css/style.css" type="text/css">
</head>
<body>
    <div class="header-wrap">
        <div class="header">
            <div class="logo"><h4>Header</h4></div>
        </div>
    </div>
    <div class="content-wrap">
        <div class="side-bar">
            Sidebar
        </div>
        <div class="content-top">
            <div class="top">Content-Top</div>
        </div>
        <div class="content">
           <br />
           <div style="width: 95%; margin: 0 auto;">
                Content
            </div>
        </div>
    </div>
</body>
</html>

CSS:

* {
    margin: 0;
    padding: 0;
}
html, body {
    height: 100%;
    background: #d4d4d4; 
    font-family: "helvetica neue", Tahoma, Sans;
}
::-webkit-scrollbar {  
    width: 12px;  
}  
::-webkit-scrollbar-track {  
    background-color: #cecece;  
    border-left: 1px solid #ccc;  
}  
::-webkit-scrollbar-thumb {  
    background-color: #c0c0c0;  
    border-radius: 6px;
}  
    ::-webkit-scrollbar-thumb:hover {  
    background-color: #aaa;  
} 
.header-wrap {
    width: 100%;
    height: 30px;
}
.header {
    width: 100%;
    height: 29px;
    background: #c0c0c0;
    background: -webkit-linear-gradient(bottom, #cacaca,#eaeaea); /* For Safari */
    background: -o-linear-gradient(bottom, #cacaca, #eaeaea); /* For Opera 11.1 to 12.0 */
    background: -moz-linear-gradient(bottom, #cacaca, #eaeaea); /* For Firefox 3.6 to 15 */
    background: linear-gradient(bottom, #cacaca, #eaeaea); /* Standard syntax */
    border-bottom: 1px solid #a0a0a0;
    top: 0;
}
.content-wrap {
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
    height: 100%;
    width: 100%;
    min-width: 800px;
    height: -moz-calc(100% - 31px);
    height: -webkit-calc(100% - 31px);
    height: calc(100% - 31px); 
}
.side-bar {
    overflow-y: scroll;
    width: 280px;
    min-width: 280px;
    border-right: 1px solid #a0a0a0;
    height: 100%;
    padding: 0 10px;
    float: left;
}
.content-top {
    margin-left: 300px;
    margin-right: 0;
}
.top {
    width: 100%;
    height: 98px;
    border-bottom: 2px groove #fff;
}
.content {
    overflow-y: scroll;
    height: 100%;
    height: -moz-calc(100% - 100px);
    height: -webkit-calc(100% - 100px);
    height: calc(100% - 100px); 
    margin-top: 0;
    margin-left: 300px;
    margin-right: 0;
    margin-bottom: 0;
}
1

There are 1 answers

0
Daniel Perván On BEST ANSWER

If you want to solve this particular case, I would suggest that you (perhaps a bit ironically) try relying on the good old table layouts of yesteryear. However, it does get a tad trickier if you want to do it properly without using <table> since display:table doesn't have an equivalent to the the colspan or rowspan attributes.

What this means is that you may need to use a few more containers than before, but still nothing really majorly complex.

I made a rather basic JSFiddle to show you what I mean.

HTML

<div class="outer">
    <div class="header">Header</div>
    <div class="contentRow">
        <div class="contentTable">
            <div class="leftCol">Sidebar</div>
            <div class="rightCol">
                <div class="rightTable">
                    <div class="topContent">Top content</div>
                    <div class="content">Content</div>
                </div>
            </div>
        </div>
    </div>
</div>

CSS

html, body {
    margin: 0;
    padding: 0;
    height: 100%;
}
.outer {
    display: table;
    height: 100%;
    width: 100%;
}
.header {
    background: blue;
    display: table-row;
    height: 30px;
}
.contentRow {
    display: table-row;
}
.contentTable {
    display: table;
    width: 100%;
    height: 100%;
}
.leftCol {
    background: red;
    display: table-cell;
    width: 280px;
    min-width: 280px;
    height: 100%;
}
.rightCol {
    display: table-cell;
    height: 100%;
}
.rightTable {
    display: table;
    width: 100%;
    height: 100%;
}
.topContent {
    background: green;
    display: table-row;
    height: 100px;
}
.content {
    background: orange;
    display: table-row;
}