JSFiddle - React, Tailwind, and code Playground

by William Green

HTML

<div id="content">
    <div class="scrollBar">
        <div class="scrollBarTrack"></div>
    </div>
    <div id="scrollable">
        <div id="txt">Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</div>
    </div>
</div>

CSS

html, body {
    margin:0;
}
#content {
    position: relative;
    width: 200px;
    height: 150px;
    border: 1px solid #000;
    overflow: hidden;
    margin:auto;
    margin-top:20px;
}
#scrollable {
    height: 150px;
    width: 240px;
    overflow-y: scroll;
}
#txt {
    width: 200px;
    padding-left:10px;
    box-sizing:border-box;
}
.scrollBar {
    display:block;
    position:absolute;
    height:100%;
    width:10px;
    background-color:#ddd;
}
.scrollBarTrack {
    width:100%;
    background-color:#bbb;
    height:0%;
    top:0%;
    position:relative;
    -o-transition:all 80ms linear;
    -moz-transition:all 80ms linear;
    -webkit-transition:all 80ms linear;
    -ms-transition:all 80ms linear;
    transition:all 80ms linear;
}

JavaScript

window.onload = function () {
    var scrollBarTracks = document.getElementsByClassName('scrollBarTrack');
    var trackMouseDown = false;
    for (var i = 0; i != scrollBarTracks.length; i++) {
        var visibleHeight = scrollBarTracks[i].parentNode.parentNode.offsetHeight;
        //alert(visibleHeight);
        var totalScrollableHeightElem = scrollBarTracks[i].parentNode.parentNode.children[1].children[0];
        alert(totalScrollableHeightElem.id);
        if (getComputedStyle(totalScrollableHeightElem).getPropertyValue("margin") !== '') {
            var totalScrollableHeight = totalScrollableHeightElem.offsetHeight + parseInt(getComputedStyle(totalScrollableHeightElem).getPropertyValue("margin"));
        } else {
            var totalScrollableHeight = totalScrollableHeightElem.offsetHeight;
        }
        var percentShown = 100 / (totalScrollableHeight / visibleHeight);
        scrollBarTracks[i].style.height = percentShown + '%';
        var currentScrollTrack = scrollBarTracks[i];
        scrollBarTracks[i].parentNode.parentNode.children[1].onscroll = function (e) {
            currentScrollTrack.style.top = (this.scrollTop / totalScrollableHeight) * 100 + '%';
        };
        /*scrollBarTracks[i].parentNode.onclick = function (e) {
            //alert('clicked; proceed to position');
        };*/
        scrollBarTracks[i].onmousedown = function () {
            trackMouseDown = true;
            //console.log('mouse down');
        };
        window.onmousemove = function(e){
        	if(trackMouseDown === true){
             	//console.log('dragging the scroll bar');
                //currentScrollTrack.parentNode.parentNode.children[1].scrollTo(0,e.pageY);
                if(currentScrollTrack.style.top == ''){
                	var currentScrollPercent = 0;  
                }else{
                	var currentScrollPercent = parseInt(currentScrollTrack.style.top);
                }
               ...