Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flex Layout with fixed position (no scrolling) sidebar

Tags:

html

css

flexbox

I have a layout with left and right canvas sidebars, enclosing the Main content area in the middle.

The sidebars and main content are flex items, positioned in a flex layout left to right.

The sidebars contain menus and meta links.

My question is: when scrolling the content area, is it possible to leave the sidebars in fixed position, such that they stay in top position and do not scroll down?

JS Fiddle: http://jsfiddle.net/Windwalker/gfozfpa6/2/

HTML:

<div class="flexcontainer">
    <div class="flexitem" id="canvas-left">
        <p>This content should not scroll</p>
    </div>
    <div class="flexitem" id="content">
        <div>
            <p>Scrolling Content</p>
        </div>
    </div>
    <div class="flexitem" id="canvas-right">
        <p>This content should not scroll</p>
    </div>
</div>

CSS:

.flexcontainer {
    display: flex;
    flex-direction: row;
    min-height: 100%;
    align-items: stretch;
}
.flexitem {
    display: flex;
}
#canvas-left {
    background: yellow;
    order: -1;
    flex: 0 0 57px;
}
#content {
    background: green;
    order: 1;
    padding: 1rem;
}
#content div {
    display: block;
}
#canvas-right{
    background: blue;
    order: 2;
    flex: 0 0 57px;
}
like image 723
Windwalker Avatar asked Jul 30 '15 11:07

Windwalker


People also ask

How do I fix the sidebar on my Fitbit Flex?

To create fixed sidebar in flexbox, We have to remove the scroll option from body and HTML tags and create a flex container with the height: 100vh [vh = viewport height] which will have the sidebar and main content of our page as a flex item.

Does Flex work with position fixed?

position:fixed makes flexbox not workable, since it overrides the position of <p>Hello</p> Try to remove it and see the difference. If you want align-items:center works; try to set height: 100vh; since the body height of webview is not set to screen height by default.

How do I keep my sidebar fixed?

The easiest way to handle this is just to use CSS fixed positioning. Our sidebar is within a #page-wrap div with relative positioning, so the sidebar will set inside there, then we just push it over into place with margin. With this technique, the sidebar stays solidly in place as you scroll down the page.


2 Answers

Please look at the similar question with provided solution: How to simulate 'position:fixed' behavior on Flexbox-aligned sidebar.

According to your code you can also wrap your inner content in "position: fixed" wrapper:

<div class="flexitem" id="canvas-left">
    <div class="fixed">
        <p>This content should not scroll</p>
    </div>
</div>

And add proper styling in CSS:

.fixed {
    position: fixed;
    width: 57px; /* according to #canvas-left */
}

Here is an example of your code with fixed left sidebar: http://jsfiddle.net/8hm3849m/. Note that this trick won't provide you proper flexible grid for sidebars, width of the wrapper should be fixed (or set dynamically via JavaScript).

like image 159
user3576508 Avatar answered Sep 18 '22 05:09

user3576508


The question is old, but I solved a similar issue using

position: sticky;
top: 0;

for the left and right items. Also I removed the

display: flex 

css for the flex items, I don't think that's necessary.

https://jsfiddle.net/8mpxev0u/

like image 40
Istopopoki Avatar answered Sep 22 '22 05:09

Istopopoki