BarFooBar
BarFooBar

Reputation: 1136

Make header in a scrollable sidebar sticky

I have a side bar with a header. Sometimes the content overflows so I used an overflow-y: scroll on the entire element. But now the header (with the close action) moves out of the view when I scroll. I'd like the header to stay fixed when the content scrolls.

Is there a way to do this using only CSS?

Pen

*, *:after, *:before {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}
html, body {
  height: 100%;
  font-family: 'Open Sans', sans-serif;
}
html {
  font-size: 10px;
  -webkit-tap-highlight-color: transparent;
}
body {
  color: #999;
  font-size: 14px;
  line-height: 20px;
}
#side-panel.presented {
  right: 0;
}
#side-panel {
  border-left: none;
  bottom: 0;
  position: fixed;
  right: -400px;
  top: 60px;
  width: 400px;
  overflow-y: scroll;
  -moz-box-shadow: -2px 0 5px #dfdfdf;
  -webkit-box-shadow: -2px 0 5px #dfdfdf;
  box-shadow: -2px 0 5px #dfdfdf;
}
<div id="side-panel" class="ember-view presented">
  <div class="side-panel-header">
    <h2>My header</h2>
  </div>
  <div class="side-panel-body">
    <div class="timeline">
      <ol>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">last</div></li>
      </ol>
    </div>
  </div>
</div>

Upvotes: 2

Views: 232

Answers (2)

Stickers
Stickers

Reputation: 78686

If you move the scrollable content on .side-panel-body and set a height that is smaller than the container, also leave enough room for the heading. That should do it.

jsFiddle

*, *:before, *:after {
  box-sizing: border-box;
}
#side-panel {
  position: fixed;
  bottom: 0;
  right: 0;
  width: 400px;
  height: 200px;
  border: 1px solid;
}
.side-panel-body {
  width: 100%;
  height: 100px;
  overflow: auto;
}
<div id="side-panel" class="ember-view presented">
  <div class="side-panel-header">
    <h2>My header</h2>
  </div>
  <div class="side-panel-body">
    <div class="timeline">
      <ol>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">thing</div></li>
        <li><div class="type" data-type="milestone">last</div></li>
      </ol>
    </div>
  </div>
</div>

Upvotes: 2

rubentd
rubentd

Reputation: 1275

Try adding this:

.side-panel-header{
  position: fixed;
  background-color: white;
  height: 50px;
}

.side-panel-body{
  padding-top: 35px;
}

Is that what you were going for?

Another option is you give the overflow property, just to the body

.side-panel-body{
  overflow-y: scroll;
  height: 100%;
}

Upvotes: 0

Related Questions