I\'ve successfully used the beautiful Susy grid system to create a responsive layout similiar to the one of WebDesignerWall.com:
What i failed to implement is a
position:fixed
works like position:absolute
so it isn't positioned in relation of its container. It simply floats into your document.
A quick fix would be something like this:
<div id="fixed-element" style="width:30%"> /* 30% of the document width*/
lorem ipsum dolor sit amet
</div>
<div id="faux-sidebar" style="width:30%; display:block"> /* 30% of the document, leave it empty, so it acts like a placeholder for the fixed element*/
</div>
<div id="the-rest" style="width:70%"> /* the rest of the website goes here */
more lorem ipsum than ever before
</div>
Why don't you just use math? =)
Example html:
<div class="container">
<div class="col">
<div class="fixed">This is fixed</div>
</div>
</div>
CSS
.container {
width: 80%;
margin: 0 auto;
}
.col {
float: left;
width: 33.3333333333%;
}
.fixed {
position: fixed;
width: 26.666666666%; /* .container width x .col width*/
}
The way to do it is with a second container. I don't know your exact code, but here's an example. Let's assume your structure is something like this:
<div class="page">
<header class="banner">
<h1>header</h1>
</header>
<nav class="navigation">
<ul class="nav-inner">
<li>navigation link</li>
</ul>
</nav>
<article class="main">
<h2>main content</h2>
</article>
<footer class="contentinfo">
<p>footer</p>
</footer>
</div>
The only important assumption I made there was ensuring an extra wrapper around my navigation sidebar. I have both the <nav>
tag and the <ul>
tag to work with. You can use any tags you want, as long as the sidebar has two that can be used for structure - the outer for a fixed container, and the inner for the sidebar itself. The CSS looks like this:
// one container for everything in the standard document flow.
.page {
@include container;
@include susy-grid-background;
}
// a position-fixed container for the sidebar.
.navigation {
@include container;
@include susy-grid-background;
position: fixed;
left: 0;
right: 0;
// the sidebar itself only spans 3 columns.
.nav-inner { @include span-columns(3); }
}
// the main content just needs to leave that space open.
.main { @include pre(3); }
// styles to help you see what is happening.
header, article, .nav-inner, footer {
padding: 6em 0;
outline: 1px solid red;
}
Cheers.
Maybe it's possible to fix the position of an element with JS?
Yes, but it will be tedious and isn't the ideal solution .
Instead, calculate the appropriate width using JavaScript and assign it, instead of using the percentage directly in CSS. Here's a basic outline:
function updateSize() {
var outer = document.getElementById("outercontainer"); //get the container that contains your sidebar
var navcol = document.getElementById("navcol"); //get the sidebar (which is supposed to have position: fixed;)
navcol.style.width = Math.floor(outer.offsetWidth * 45/100) + "px"; //or whatever your percentage is
}
updateSize();
window.onresize = updateSize; /*make sure to update width when the window is resized*/
Note: the IDs used above are just placeholders -- you will need to modify them to fit your actual page.
You can't, fixed-position elements are detached from their containers, position: relative
or no position: relative
. Just set its width to an absolute value - it looks like your content is always 760 pixels wide, right?