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');
})