I was trying to implement a horizontal scroll inside a div. My question is how can I detect the end of the horizontal scroll?
I tried something like this
$(function() {
var scrollLeftPrev=0;
$('#scrollquestion').scroll( function() {
var newScrollLeft=$('#scrollquestion').scrollLeft();
if(scrollLeftPrev===newScrollLeft){
alert('right end');
}
if(newScrollLeft===0){
alert('left end');
}
console.log($('#scrollquestion').width());
console.log(newScrollLeft);
scrollLeftPrev=newScrollLeft;
});
});
left end alert works, since it will become 0 for all the device sizes. For right end, it depends on the device size.
Screen :
JS Fiddle : http://jsfiddle.net/arunslb123/trxe4n3u/
To detect scroll end with JavaScript, we can listen to the scroll event. Then in the event listener, we check if offsetHeight + scrollTop is bigger than or equal to scrollHeight . We get the div with document. querySelector .
Horizontal scrolling can be achieved by clicking and dragging a horizontal scroll bar, swiping sideways on a desktop trackpad or trackpad mouse, pressing left and right arrow keys, or swiping sideways with one's finger on a touchscreen.
scrollIntoView(true);", element); This works for vertical scrolling but not for horizontal.
Use scrollWidth
and width
along with your leftscrollwidth
to get the difference. In your case there is offset of 8
so it will give the difference of 8
it may be because of your padding or margin.
var $elem=$('#scrollquestion');
var newScrollLeft = $elem.scrollLeft(),
width=$elem.width(),
scrollWidth=$elem.get(0).scrollWidth;
var offset=8;
if (scrollWidth- newScrollLeft-width==offset) {
alert('right end');
}
Live Demo
Use the outerWidth() to get the offset including the width like,
var $elem=$('#scrollquestion');
var newScrollLeft = $elem.scrollLeft(),
width=$elem.outerWidth(),
scrollWidth=$elem.get(0).scrollWidth;
if (scrollWidth-newScrollLeft==width) {
alert('right end');
}
Another Demo without using offset
Try http://jsfiddle.net/trxe4n3u/3/
$(function() {
$('#scrollquestion').scroll( function() {
var $width = $('#scrollquestion').outerWidth()
var $scrollWidth = $('#scrollquestion')[0].scrollWidth;
var $scrollLeft = $('#scrollquestion').scrollLeft();
if ($scrollWidth - $width === $scrollLeft){
alert('right end');
}
if ($scrollLeft===0){
alert('left end');
}
});
});
Rohan kumar's answer is correct and works fine, but you can do this without calculating the offset manually
var newScrollLeft=$('#scrollquestion').scrollLeft();
var divWidth = $('#scrollquestion').outerWidth();
var scrollwidth =$('#scrollquestion').get(0).scrollWidth;
if(newScrollLeft === scrollwidth - divWidth){
alert('right end');
}
For my specific case, dangor's solution with the
if ($scrollWidth - $width === $scrollLeft) {
alert('right end');
}
did not work for me because calculating ($scrollWidth - $width) created a very small decimal that made the left-side of the comparison a float, and the right-side ($scrollLeft), an integer. Changing it to the code below works perfect for me.
if (parseInt($scrollWidth - $width) === parseInt($scrollLeft)) {
alert('right end');
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With