问题
I'm working on a sticky nav-bar for the first time and I got everything working nicely until trying to make it responsive. When the window is resized, the jQuery for the nav bar causes the page to freeze for a bit feeling kind of jerky. Am I overdoing it with the resize checks?
jQuery(document).ready(function() {
//on page load will get nav offset and wrap nav in a placeholder
//for smooth transition to fixed position
var navOffset = jQuery('.nav').offset().top;
jQuery('.nav').wrap('<div class="nav-placeholder"></div>');
jQuery('.nav-placeholder').height(jQuery('.nav').outerHeight());
//when window is resized will get new offset so nav
//goes sticky at right time
jQuery(window).resize(function() {
navOffset = jQuery('.nav').offset().top;
jQuery('.nav').wrap('<div class="nav-placeholder"></div>');
jQuery('.nav-placeholder').height(jQuery('.nav').outerHeight());
});
//added some extra wraps for styling purposes mainly padding
jQuery('.nav').wrapInner('<div class="nav-inner"</div>');
jQuery('.nav-inner').wrapInner('<div class="nav-inner-most"</div>');
//when scrolling past offset will set nav to fixed 'sticky'
//when scrolling back up will unset the fixed sticky nav
jQuery(window).scroll(function() {
var scrollPos = jQuery(window).scrollTop();
if(scrollPos >= navOffset) {
jQuery('.nav').addClass('fixed');
}
else {
jQuery('.nav').removeClass('fixed');
}
});
});
Thanks
回答1:
You should limit the number of times the callbacks for events such as resize
, scroll
fire.
Common ways of achieving this is called throttle and debounce. Many javascript libraries such as underscore, lodash etc implement this.
In the case of jQuery, There is a jQuery plugin jquery-throttle-debounce
You can use it like
jQuery(window).resize($.debounce( 250, function() {
navOffset = jQuery('.nav').offset().top;
jQuery('.nav').wrap('<div class="nav-placeholder"></div>');
jQuery('.nav-placeholder').height(jQuery('.nav').outerHeight());
}));
来源:https://stackoverflow.com/questions/35448051/sticky-nav-bar-with-jquery-jerky-on-window-resize