How to get a div to follow seamlessly scrolling with jQuery?

There are sections / boxes in my container, but the last of these fields should be scrolled when none of the other boxes are displayed.

Thus, when the user scrolls down, he sees the usual sidebar, but when the user has lowered enough, the sidebar ends, but the last box starts to follow at the top of the screen. I have seen this a lot on different sites.

My code at the moment is:

$(window).scroll(function(){ $.each($('.follow-scroll'),function(){ var eloffset = $(this).offset(); var windowpos = $(window).scrollTop(); if(windowpos<eloffset.top) { var finaldestination = 0; } else { var finaldestination = windowpos; } $(this).stop().animate({'top':finaldestination},200); }); }); 
+63
jquery scroll
Feb 01 '10 at 15:55
source share
10 answers

Since this question gets a lot of views, and the tutorial related to the majority of the votes seems to be disabled, I took the time to clear this script.

See here: JSFiddle

JavaScript:

 (function($) { var element = $('.follow-scroll'), originalY = element.offset().top; // Space between element and top of screen (when scrolling) var topMargin = 20; // Should probably be set in CSS; but here just for emphasis element.css('position', 'relative'); $(window).on('scroll', function(event) { var scrollTop = $(window).scrollTop(); element.stop(false, false).animate({ top: scrollTop < originalY ? 0 : scrollTop - originalY + topMargin }, 300); }); })(jQuery); 
+76
Feb 01 '10 at 17:10
source share

There's a fantastic jQuery tutorial there for https://web.archive.org/web/20121012171851/http://jqueryfordesigners.com/fixed-floating-elements/ .

It replicates the Apple.com basket type to load the sidebar. A Google request that might serve you well is a "fixed floating sidebar."

+52
02 Feb 2018-10-02T00
source share

The solution can be reduced to the following:

 var el=$('#follow-scroll'); var elpos=el.offset().top; $(window).scroll(function () { var y=$(this).scrollTop(); if(y<elpos){el.stop().animate({'top':0},500);} else{el.stop().animate({'top':y-elpos},500);} }); 

I changed the purpose of el because finding a single item by class is not a big habit; if you need only one element, find it by identifier; if you want to iterate over a collection of elements, find them by class.

please note - my answer here refers to the accepted answer at that time (it is still the accepted answer at the moment, but has since been edited, and therefore my answer is no longer "reduced" to what you see in the answer @Martti Lane to this page; my answer "comes down" to its original, accepted answer; you can take a look at the editing history of @ Martti's answer if you are interested in what I threw away.)

+21
Sep 20 '11 at 4:00 p.m.
source share

It worked for me like a charm.

JavaScript:

 $(function() { //doc ready if (!($.browser == "msie" && $.browser.version < 7)) { var target = "#floating", top = $(target).offset().top - parseFloat($(target).css("margin-top").replace(/auto/, 0)); $(window).scroll(function(event) { if (top <= $(this).scrollTop()) { $(target).addClass("fixed"); } else { $(target).removeClass("fixed"); } }); } }); 

CSS

 #floating.fixed{ position:fixed; top:0; } 

Source: http://jqueryfordesigners.com/fixed-floating-elements/

+5
Jul 27 2018-12-12T00:
source share

This is my last code .... (based on previous corrections, thank you very much for the hat, saved a lot of time on experiments). That listened to me, scrolled, and also scrolled ... :)

it always makes me wonder how jquery can be elegant !!!

 $(document).ready(function(){ //run once var el=$('#scrolldiv'); var originalelpos=el.offset().top; // take it where it originally is on the page //run on scroll $(window).scroll(function(){ var el = $('#scrolldiv'); // important! (local) var elpos = el.offset().top; // take current situation var windowpos = $(window).scrollTop(); var finaldestination = windowpos+originalelpos; el.stop().animate({'top':finaldestination},500); }); }); 
+3
Jul 24 '12 at 8:18
source share

Here is my solution (hope this plug-n-play is enough ):

  • Copy a piece of JS code
  • Add a slide-forward-scroll class to the item you want.
  • Make pixel corrections in JS code
  • I hope you will enjoy!

 // SlideAlongScroll var SlideAlongScroll = function(el) { var _this = this; this.el = el; // elements original position this.elpos_original = el.parent().offset().top; // scroller timeout this.scroller_timeout; // scroller calculate function this.scroll = function() { // 20px gap for beauty var windowpos = $(window).scrollTop() + 20; // targeted destination var finaldestination = windowpos - this.elpos_original; // define stopper object and correction amount var stopper = ($('.footer').offset().top); // $(window).height() if you dont need it var stophere = stopper - el.outerHeight() - this.elpos_original - 20; // decide what to do var realdestination = 0; if(windowpos > this.elpos_original) { if(finaldestination >= stophere) { realdestination = stophere; } else { realdestination = finaldestination; } } el.css({'top': realdestination }); }; // scroll listener $(window).on('scroll', function() { // debounce it clearTimeout(_this.scroller_timeout); // set scroll calculation timeout _this.scroller_timeout = setTimeout(function() { _this.scroll(); }, 300); }); // initial position (in case page is pre-scrolled by browser after load) this.scroll(); }; // init action, little timeout for smoothness $(document).ready(function() { $('.slide-along-scroll').each(function(i, el) { setTimeout(function(el) { new SlideAlongScroll(el); }, 300, $(el)); }); }); 
 /* part you need */ .slide-along-scroll { padding: 20px; background-color: #CCCCCC; transition: top 300ms ease-out; position: relative; } /* just demo */ div { box-sizing: border-box; } .side-column { float: left; width: 20%; } .main-column { padding: 20px; float: right; width: 75%; min-height: 1200px; background-color: #EEEEEE; } .body { padding: 20px 0; } .body:after { content: ' '; clear: both; display: table; } .header { padding: 20px; text-align: center; border-bottom: 2px solid #CCCCCC; } .footer { padding: 20px; border-top: 2px solid #CCCCCC; min-height: 300px; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div> <div class="header"> <h1>Your super-duper website</h1> </div> <div class="body"> <div class="side-column"> <!-- part you need --> <div class="slide-along-scroll"> Side menu content <ul> <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li> <li>Aliquam tincidunt mauris eu risus.</li> <li>Vestibulum auctor dapibus neque.</li> </ul> </div> </div> <div class="main-column"> Main content area (1200px) </div> </div> <div class="footer"> Footer (slide along is limited by it) </div> </div> 
+3
Jun 21 '17 at 9:54 on
source share

This code does not work very well, I fixed it a little

 var el = $('.caja-pago'); var elpos_original = el.offset().top; $(window).scroll(function(){ var elpos = el.offset().top; var windowpos = $(window).scrollTop(); var finaldestination = windowpos; if(windowpos<elpos_original) { finaldestination = elpos_original; el.stop().animate({'top':400},500); } else { el.stop().animate({'top':windowpos+10},500); } }); 
+2
Dec 27 '10 at 18:49
source share

I need the div to stop when it reaches a specific object, so I did it like this:

 var el = $('#followdeal'); var elpos_original = el.offset().top; $(window).scroll(function(){ var elpos = el.offset().top; var windowpos = $(window).scrollTop(); var finaldestination = windowpos; var stophere = ( $('#filtering').offset().top ) - 170; if(windowpos<elpos_original || windowpos>=stophere) { finaldestination = elpos_original; el.stop().animate({'top':10}); } else { el.stop().animate({'top':finaldestination-elpos_original+10},500); } }); 
+2
Jan 27 2018-12-12T00:
source share

This is the same thing on facebook:

 <script> var valX = $(window).scrollTop(); function syncScroll(target){ var valY = $(window).scrollTop(); var difYX = valY - valX; var targetX = $(target).scrollTop(); if(valY > valX){ $(target).scrollTop(difYX); } if(difYX <= 0){ $(target).scrollTop(-20); } } $(window).scroll(function(){ syncScroll('#demo'); }) </script> 
 body{ margin:0; padding:0; height:100%; } #demo{ position:fixed; height:100vh; overflow:hidden; width:40%; } #content{ position:relative; float:right; width:60%; color:red; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <body> <div id="demo"> <ul> <li> <p>"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."</p> </li> <li> <p> "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?" </p> </li> <li> <p> "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" </p> </li> <ul> </div> <div id="content"> <ul> <li> <p>"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."</p> </li> <li> <p> "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?" </p> </li> <li> <p> "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" </p> </li> <li> <p>"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."</p> </li> <li> <p> "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?" </p> </li> <li> <p> "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" </p> </li> <li> <p>"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."</p> </li> <li> <p> "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?" </p> </li> <li> <p> "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" </p> </li> <li> <p>"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."</p> </li> <li> <p> "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?" </p> </li> <li> <p> "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure?" </p> </li> <ul> </div> </body 
+1
Sep 13 '15 at 16:11
source share

I wrote a relatively simple answer for this.

I have a table in which one of the sticky table heading plugins is attached right below the specific div on my page, but the menu to the left of the table is not inserted (since it is not part of the table.)

For my purposes, I knew that a div for which stickiness always started with 385 pixels below the top of the window, so I created an empty div right above this:

 <div id="stopMenu" class="stopMenu"></div> 

Then the following was done:

 $(window).scroll(function(){ if ( $(window).scrollTop() > 385 ) { extraPadding = $(window).scrollTop() - 385; $('#stopMenu').css( "padding-top", extraPadding ); } else { $('#stopMenu').css( "padding-top", "0" ); } }); 

As the user scrolls, he adds the value of $(window).scrollTop() to the integer 385 , and then adds that value to the stopMenu div, which is higher than what I want to focus on.

In case the user scrolls all the way back, I just set the add-on to 0.

This does not require the user to do anything in CSS, but it is a nice effect to make a slight delay, so I also added class="stopMenu" :

 .stopMenu { .transition: all 0.1s; } 
0
Apr 12 '16 at 21:41
source share



All Articles