performant shrink sidebar
by joplomacedo
HTML
<div class="container is-closed">
<div class="col col--side">
<div class="col__content">
col col--side
</div>
</div>
<div class="col col--main">
<div class="col--main__content col__content">
<div class="field">
Search here...
</div>
</div>
</div>
</div>
<div class="button">Toggle</div>
SCSS
* {
padding: 0;
margin: 0;
border: 0;
box-sizing: border-box;
}
html,
body {
height: 100%;
}
.container {
--background-main: #fff;
--transition-duration: .25s;
--transition-easing: cubic-bezier(0.79,0.14,0.15,0.86);
--transition: var(--transition-duration) var(--transition-easing);
--width-side: 20em;
display: flex;
height: 100%;
background-color: var(--background-main);
}
.col {
height: 100%;
}
.col--side {
flex: 0 0 var(--width-side);
background-color: #eee;
transition: var(--transition);
}
.col--main {
flex-grow: 1;
position: relative;
}
.col__content {
height: 100%;
}
.col--main__content {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: var(--background-main);
transition: var(--transition);
}
.is-closed {
.col--side {
opacity: 0;
}
.col--main__content {
transform: translateX(calc(-.5 * var(--width-side)));
}
}
.is-open {
.col--side {
opacity: 1;
}
.col--main__content {
transform: translateX(calc(0 * var(--side-width)));
}
}
.col--main__content {
padding: 2em;
}
.field {
background-color: #eee;
border-radius: 2px;;
padding: .5em;
}
.button {
position: fixed;
bottom: 1em;
left: 50%;
transform: translateX(-50%);
z-index: 1;
}
JavaScript
const $c = $('.container');
$('.button').on('click',function () {
$c.toggleClass('is-open is-closed');
})