JSFiddle - React, Tailwind, and code Playground

by rbyers

HTML

<div id="sample-scroller" class="scroller hidden-scrollbar">
</div>

CSS

.scroller {
    border: 1px solid #eee;
    display: inline-block;
    height: 280px;
    line-height: 28px;
    overflow-x: hidden;
    overflow-y: auto;
    width: 100px;
  }

  .scroller.hidden-scrollbar {
    overflow-y: hidden;
  }

.item {
     display: block;
     white-space: no-wrap;
  }

JavaScript

var hideAfterScrollDelay = 500; /* ms */
  var lastScroll = null;

  function $(name) {
    return document.getElementById(name);
  }

  function initialize() {
    var scroller = $('sample-scroller');
    for (var i = 0; i < 30; i++) {
      var element = document.createElement('div');
      element.className = 'item';
      element.textContent = 'item ' + (i+1);
      scroller.appendChild(element);
    }
    scroller.addEventListener('mouseover', function() {
      showScrollbar(true);
    });
    scroller.addEventListener('mouseout', function() {
      showScrollbar(false);
    });
    scroller.addEventListener('scroll', function() {
      lastScroll = new Date();
      showScrollbar(true);
      setTimeout(function() {
        delayedScrollbarReset();
      }, hideAfterScrollDelay);
    });
  }

  function showScrollbar(state) {
    var scroller = $('sample-scroller');
    if (state)
      scroller.classList.remove('hidden-scrollbar');
    else
      scroller.classList.add('hidden-scrollbar');
  }

  function delayedScrollbarReset() {
    var now = new Date();
    var elapsed = now - lastScroll;
    if (elapsed < hideAfterScrollDelay) {
      var delay = hideAfterScrollDelay - elapsed;
      setTimeout(delayedScrollbarReset, delay);
    } else {
      showScrollbar(false);
    }
  }

  initialize();