Leave menu bar fixed on top when scrolled

JqueryCss

Jquery Problem Overview


I've seen some websites that when the user scrolls down the page a box would pop-up to the right or left...

Also, noticed this template: http://www.mvpthemes.com/maxmag/ the designer does a nice job leaving the nav bar fixed on top.

Now, how are these done? I guess it uses jquery to get the position of the page and to show the box.

Can you please guide me to where I can find a snippet so I can learn to do something like that.

Jquery Solutions


Solution 1 - Jquery

This effect is typically achieved by having some jquery logic as follows:

$(window).bind('scroll', function () {
    if ($(window).scrollTop() > 50) {
        $('.menu').addClass('fixed');
    } else {
        $('.menu').removeClass('fixed');
    }
});

This says once the window has scrolled past a certain number of vertical pixels, it adds a class to the menu that changes it's position value to "fixed".

For complete implementation details see: http://jsfiddle.net/adamb/F4BmP/

Solution 2 - Jquery

In this example, you may show your menu centered.

HTML

<div id="main-menu-container">
    <div id="main-menu">
        //your menu
    </div>
</div>

CSS

.f-nav{  /* To fix main menu container */
	z-index: 9999;
	position: fixed;
	left: 0;
	top: 0;
	width: 100%;
}
#main-menu-container {
	text-align: center; /* Assuming your main layout is centered */
}
#main-menu {
	display: inline-block;
	width: 1024px; /* Your menu's width */
}

JS

$("document").ready(function($){
	var nav = $('#main-menu-container');

	$(window).scroll(function () {
		if ($(this).scrollTop() > 125) {
			nav.addClass("f-nav");
		} else {
			nav.removeClass("f-nav");
		}
	});
});

Solution 3 - Jquery

You can also use css rules:

position: fixed ; and top: 0px ;

on your menu tag.

Solution 4 - Jquery

same as adamb but I would add a dynamic variable num

num = $('.menuFlotante').offset().top;

to get the exact offset or position inside the window to avoid finding the right position.

 $(window).bind('scroll', function() {
         if ($(window).scrollTop() > num) {
             $('.menu').addClass('fixed');
         }
         else {
             num = $('.menuFlotante').offset().top;
             $('.menu').removeClass('fixed');
         }
    });

Solution 5 - Jquery

Or do this in more dynamic way

$(window).bind('scroll', function () {
    var menu = $('.menu');
    if ($(window).scrollTop() > menu.offset().top) {
        menu.addClass('fixed');
    } else {
        menu.removeClass('fixed');
    }
});

In CSS add class

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

Solution 6 - Jquery

try with sticky jquery plugin

https://github.com/garand/sticky

<script src="jquery.js"></script>
<script src="jquery.sticky.js"></script>
<script>
  $(document).ready(function(){
    $("#sticker").sticky({topSpacing:0});
  });
</script>

Solution 7 - Jquery

check the link below, it has the html, css, JS and a live demo :) enjoy

http://codepen.io/senff/pen/ayGvD

// Create a clone of the menu, right next to original.
$('.menu').addClass('original').clone().insertAfter('.menu').addClass('cloned').css('position','fixed').css('top','0').css('margin-top','0').css('z-index','500').removeClass('original').hide();

scrollIntervalID = setInterval(stickIt, 10);


function stickIt() {

  var orgElementPos = $('.original').offset();
  orgElementTop = orgElementPos.top;               

  if ($(window).scrollTop() >= (orgElementTop)) {
    // scrolled past the original position; now only show the cloned, sticky element.

    // Cloned element should always have same left position and width as original element.     
    orgElement = $('.original');
    coordsOrgElement = orgElement.offset();
    leftOrgElement = coordsOrgElement.left;  
    widthOrgElement = orgElement.css('width');

    $('.cloned').css('left',leftOrgElement+'px').css('top',0).css('width',widthOrgElement+'px').show();
    $('.original').css('visibility','hidden');
  } else {
    // not scrolled past the menu; only show the original menu.
    $('.cloned').hide();
    $('.original').css('visibility','visible');
  }
}

* {font-family:arial; margin:0; padding:0;}
.logo {font-size:40px; font-weight:bold;color:#00a; font-style:italic;}
.intro {color:#777; font-style:italic; margin:10px 0;}
.menu {background:#00a; color:#fff; height:40px; line-height:40px;letter-spacing:1px; width:100%;}
.content {margin-top:10px;}
.menu-padding {padding-top:40px;}
.content {padding:10px;}
.content p {margin-bottom:20px;}

<div class="intro">Some tagline goes here</div>

Solution 8 - Jquery

you may want to add:

 $(window).trigger('scroll') 

to trigger the scroll event when you reload an already scrolled page. Otherwise you might get your menu out of position.

$(document).ready(function(){
        $(window).trigger('scroll');
		$(window).bind('scroll', function () {
			var pixels = 600; //number of pixels before modifying styles
			if ($(window).scrollTop() > pixels) {
				$('header').addClass('fixed');
			} else {
				$('header').removeClass('fixed');
			}
		}); 
}); 

Solution 9 - Jquery

This is jquery code which is used to fixed the div when it touch a top of browser hope it will help a lot.

<script type='text/javascript' src='http://code.jquery.com/jquery-1.7.1.js'></script>
<script type='text/javascript'>//<![CDATA[ 
$(window).load(function(){
$(function() {
    $.fn.scrollBottom = function() {
        return $(document).height() - this.scrollTop() - this.height();
    };

    var $el = $('#sidebar>div');
    var $window = $(window);
    var top = $el.parent().position().top;

    $window.bind("scroll resize", function() {
        var gap = $window.height() - $el.height() - 10;
        var visibleFoot = 172 - $window.scrollBottom();
        var scrollTop = $window.scrollTop()

        if (scrollTop < top + 10) {
            $el.css({
                top: (top - scrollTop) + "px",
                bottom: "auto"
            });
        } else if (visibleFoot > gap) {
            $el.css({
                top: "auto",
                bottom: visibleFoot + "px"
            });
        } else {
            $el.css({
                top: 0,
                bottom: "auto"
            });
        }
    }).scroll();
});
});//]]>  

</script>

Solution 10 - Jquery

$(window).scroll(function () {
       
        var ControlDivTop = $('#cs_controlDivFix');
        
        $(window).scroll(function () {
            if ($(this).scrollTop() > 50) {
               ControlDivTop.stop().animate({ 'top': ($(this).scrollTop() - 62) + "px" }, 600);
            } else {
              ControlDivTop.stop().animate({ 'top': ($(this).scrollTop()) + "px" },600);
            }
        });
    });

Solution 11 - Jquery

You can try this with your nav div:

div.fixed{
    postion: fixed;
    top: 0;
    width: 100%;
}

Solution 12 - Jquery

Using JavaScript, you could trigger this effect using Intersection Observer API when certain elements enter or leave the viewport.

https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionWilsonView Question on Stackoverflow
Solution 1 - JqueryadambView Answer on Stackoverflow
Solution 2 - JqueryTomas GonzalezView Answer on Stackoverflow
Solution 3 - JqueryLGreenView Answer on Stackoverflow
Solution 4 - JquerymariosmView Answer on Stackoverflow
Solution 5 - JqueryBilal IqbalView Answer on Stackoverflow
Solution 6 - JqueryThomanView Answer on Stackoverflow
Solution 7 - Jqueryuser4294122View Answer on Stackoverflow
Solution 8 - JqueryAthmaneView Answer on Stackoverflow
Solution 9 - JquerymanzoorView Answer on Stackoverflow
Solution 10 - JquerySumit patelView Answer on Stackoverflow
Solution 11 - JqueryKishanView Answer on Stackoverflow
Solution 12 - JqueryrmbdeivisView Answer on Stackoverflow