mk-webwork codenote
.js_scroll{  
  overflow-x: scroll;
  cursor: pointer;
}

.js_scroll::-webkit-scrollbar{
  display: none;
}
//jQuery不使用
// スクロールドラッグ
function mousedragscrollable(element){
  let target;
  const elms = document.querySelectorAll(element);
  for(let i=0; i<elms.length; i++){
    elms[i].addEventListener('mousedown', function(evt){
      evt.preventDefault();
      target = elms[i];
      target.dataset.down = 'true';
      target.dataset.move = 'false';
      target.dataset.x = evt.clientX;
      target.dataset.y = evt.clientY;
      target.dataset.scrollleft = target.scrollLeft;
      target.dataset.scrolltop = target.scrollTop;
      evt.stopPropagation();
    });
    elms[i].addEventListener('click', function(evt){
      if(elms[i].detaset != null && elms[i].detaset.move == 'true') evt.stopPropagation();
    });
  }
  document.addEventListener('mousemove', function(evt){
    if(target != null && target.dataset.down == 'true'){
      evt.preventDefault();
      let move_x = parseInt(target.dataset.x) - evt.clientX;
      let move_y = parseInt(target.dataset.y) - evt.clientY;
      if (move_x !== 0 || move_y !== 0) {
        target.dataset.move = 'true';
      } else {
        return;
      }
      target.scrollLeft = parseInt(target.dataset.scrollleft) + move_x;
      target.scrollTop = parseInt(target.dataset.scrolltop) + move_y;
      evt.stopPropagation();
    }
  });
  document.addEventListener('mouseup', function(evt){
    if(target != null && target.dataset.down == 'true'){
      target.dataset.down = 'false';
      evt.stopPropagation();
    }
  });
}
    
window.addEventListener('DOMContentLoaded', function(){
  mousedragscrollable('.js_scroll');
});
//jQuery
$(function() {
  // スクロールドラッグ
  function mousedragscrollable(element) {
    let $target;

    $(document).on('mousedown', element, function(evt) {
      evt.preventDefault();
      $target = $(this);
      $target.data({
        down: 'true',
        move: 'false',
        x: evt.clientX,
        scrollleft: $target.scrollLeft()
      });
      evt.stopPropagation();
    });

    $(document).on('mousemove', function(evt) {
      if ($target && $target.data('down') === 'true') {
        evt.preventDefault();
        let move_x = $target.data('x') - evt.clientX;

        if (move_x !== 0) {
          $target.data('move', 'true');
        } else {
          return;
        }

        $target.scrollLeft($target.data('scrollleft') + move_x);
        evt.stopPropagation();
      }
    });

    $(document).on('mouseup', function(evt) {
      if ($target && $target.data('down') === 'true') {
        $target.data('down', 'false');
        evt.stopPropagation();
        $target = null; // Reset target after mouse up
      }
    });
  }

  // 初期化
  mousedragscrollable('.js_scroll');
});

↓おまけ(x軸、y軸両方)

//jQuery不使用
function mousedragscrollable(element){
  let target;
  const elms = document.querySelectorAll(element);
  for(let i=0; i<elms.length; i++){
    elms[i].addEventListener('mousedown', function(evt){
      evt.preventDefault();
      target = elms[i];
      target.dataset.down = 'true';
      target.dataset.move = 'false';
      target.dataset.x = evt.clientX;
      target.dataset.y = evt.clientY;
      target.dataset.scrollleft = target.scrollLeft;
      target.dataset.scrolltop = target.scrollTop;
      evt.stopPropagation();
    });
    elms[i].addEventListener('click', function(evt){
      if(elms[i].dataset != null && elms[i].dataset.move == 'true') evt.stopPropagation();
    });
  }
  document.addEventListener('mousemove', function(evt){
    if(target != null && target.dataset.down == 'true'){
      evt.preventDefault();
      let move_x = parseInt(target.dataset.x) - evt.clientX;
      let move_y = parseInt(target.dataset.y) - evt.clientY;
      if (move_x !== 0 || move_y !== 0) {
        target.dataset.move = 'true';
      } else {
        return;
      }
      target.scrollLeft = parseInt(target.dataset.scrollleft) + move_x;
      target.scrollTop = parseInt(target.dataset.scrolltop) + move_y;
      evt.stopPropagation();
    }
  });
  document.addEventListener('mouseup', function(evt){
    if(target != null && target.dataset.down == 'true'){
      target.dataset.down = 'false';
      evt.stopPropagation();
    }
  });
}
    
window.addEventListener('DOMContentLoaded', function(){
  mousedragscrollable('.js_scroll');
});
//jQuery
$(function() {
  function mousedragscrollable(element) {
    let $target;

    // mousedown イベントリスナー
    $(document).on('mousedown', element, function(evt) {
      evt.preventDefault();
      $target = $(this);
      $target.data({
        down: 'true',
        move: 'false',
        x: evt.clientX,
        y: evt.clientY,
        scrollleft: $target.scrollLeft(),
        scrolltop: $target.scrollTop()
      });
      evt.stopPropagation();
    });

    // click イベントリスナー
    $(document).on('click', element, function(evt) {
      if ($target && $target.data('move') === 'true') {
        evt.stopPropagation();
      }
    });

    // mousemove イベントリスナー
    $(document).on('mousemove', function(evt) {
      if ($target && $target.data('down') === 'true') {
        evt.preventDefault();
        let move_x = $target.data('x') - evt.clientX;
        let move_y = $target.data('y') - evt.clientY;

        if (move_x !== 0 || move_y !== 0) {
          $target.data('move', 'true');
        } else {
          return;
        }

        $target.scrollLeft($target.data('scrollleft') + move_x);
        $target.scrollTop($target.data('scrolltop') + move_y);
        evt.stopPropagation();
      }
    });

    // mouseup イベントリスナー
    $(document).on('mouseup', function(evt) {
      if ($target && $target.data('down') === 'true') {
        $target.data('down', 'false');
        evt.stopPropagation();
        $target = null; // Reset target after mouse up
      }
    });
  }

  // 初期化
  mousedragscrollable('.js_scroll');
});
← もどる