Horizontal scrolling with mouse wheel in a div
How to scroll horizontal in na div with mouse wheel, or drag with jquery?
I've tried draggable, but in my code it isn't useful.
Now I've got a horizontal scrollbar. Is there a posibility to scroll the content in my div using the mouse wheel?
Try this for horizontal scrolling with mouse wheel. This is pure JavaScript:
(function() {
function scrollHorizontally(e) {
e = window.event || e;
var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
document.getElementById('yourDiv').scrollLeft -= (delta * 40); // Multiplied by 40
e.preventDefault();
}
if (document.getElementById('yourDiv').addEventListener) {
// IE9, Chrome, Safari, Opera
document.getElementById('yourDiv').addEventListener('mousewheel', scrollHorizontally, false);
// Firefox
document.getElementById('yourDiv').addEventListener('DOMMouseScroll', scrollHorizontally, false);
} else {
// IE 6/7/8
document.getElementById('yourDiv').attachEvent('onmousewheel', scrollHorizontally);
}
})();
Here’s a demo, but with document.body
and window
as a targetted element: https://taufik-nurrohman.github.io/dte-project/full-page-horizontal-scrolling.html
I have rewritten the code from the answer by @Anonymous-Lettuce. The width recalculation of the element is skipped as it was unnecessary and sometimes undesirable.
This also provides additional feature to pass scroll-amount
in px
to the plugin.
Use it like this:
$(document).ready(function(){
$('#your_div').hScroll(100); // You can pass (optionally) scrolling amount
});
Here goes the upgraded plugin jquery.hscroll.js
:
jQuery(function ($) {
$.fn.hScroll = function (amount) {
amount = amount || 120;
$(this).bind("DOMMouseScroll mousewheel", function (event) {
var oEvent = event.originalEvent,
direction = oEvent.detail ? oEvent.detail * -amount : oEvent.wheelDelta,
position = $(this).scrollLeft();
position += direction > 0 ? -amount : amount;
$(this).scrollLeft(position);
event.preventDefault();
})
};
});
Here is the minified version of the same jquery.hscroll.min.js
:
jQuery(function(e){e.fn.hScroll=function(l){l=l||120,e(this).bind("DOMMouseScroll mousewheel",function(t){var i=t.originalEvent,n=i.detail?i.detail*-l:i.wheelDelta,o=e(this).scrollLeft();o+=n>0?-l:l,e(this).scrollLeft(o),t.preventDefault()})}});
Here is the JSFiddle
Wrote this plugin days ago.
$.fn.hScroll = function( options )
{
function scroll( obj, e )
{
var evt = e.originalEvent;
var direction = evt.detail ? evt.detail * (-120) : evt.wheelDelta;
if( direction > 0)
{
direction = $(obj).scrollLeft() - 120;
}
else
{
direction = $(obj).scrollLeft() + 120;
}
$(obj).scrollLeft( direction );
e.preventDefault();
}
$(this).width( $(this).find('div').width() );
$(this).bind('DOMMouseScroll mousewheel', function( e )
{
scroll( this, e );
});
}
Try it out with
$(document).ready(function(){
$('#yourDiv').hScroll();
});
The width of the child element of the div should be wider than the parent.
Like 4000 px or something.
<div id="yourDiv">
<div style="width: 4000px;"></div>
</div>
I'd like to add a slight improvement to the answer given by @Taufik.
In the context of an es2015
module:
const el = document.querySelector('#scroller');
function scrollHorizontally(e) {
e = window.event || e;
e.preventDefault();
el.scrollLeft -= (e.wheelDelta || -e.detail);
}
function init() {
if (!el) {
return;
}
if (el.addEventListener) {
el.addEventListener('mousewheel', scrollHorizontally, false);
el.addEventListener('DOMMouseScroll', scrollHorizontally, false);
} else {
el.attachEvent('onmousewheel', scrollHorizontally);
}
}
export default init;
The main difference being: el.scrollLeft -= (e.wheelDelta || -e.detail);
Using the e.wheelData
directly in the scroll offset means we can have the inertia, so that the scrolling can slow down gradually. I found this worked well for me.
Just use in your code like so (assuming the above code is in a file called scroller.js):
import scroller from './scroller.js';
scroller();
You can do that with just javascrpt (no Jquery) in a clear way and also allow vertical scrolling:
const target = document.querySelector('div')
target.addEventListener('wheel', event => {
const toLeft = event.deltaY < 0 && target.scrollLeft > 0
const toRight = event.deltaY > 0 && target.scrollLeft < target.scrollWidth - target.clientWidth
if (toLeft || toRight) {
event.preventDefault()
target.scrollLeft += event.deltaY
}
})