Lassen Sie die Menüleiste beim Scrollen oben

72

Ich habe einige Websites gesehen, auf denen beim Scrollen des Benutzers ein Feld nach rechts oder links eingeblendet wird ...

Beachten Sie auch diese Vorlage: http://www.mvpthemes.com/maxmag/ Der Designer macht einen guten Job und lässt die Navigationsleiste oben fixiert.

Wie geht das nun? Ich denke, es verwendet jquery, um die Position der Seite zu ermitteln und die Box anzuzeigen.

Können Sie mich bitte dahin führen, wo ich einen Ausschnitt finden kann, damit ich lernen kann, so etwas zu tun?

Wilson
quelle
2
Probier diese. backslash.gr/demos/jquery-sticky-navigation
Marko Francekovic

Antworten:

158

Dieser Effekt wird normalerweise durch eine folgende Abfragelogik erreicht:

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

Sobald das Fenster über eine bestimmte Anzahl vertikaler Pixel gescrollt hat, wird dem Menü eine Klasse hinzugefügt, die den Positionswert auf "fest" ändert.

Ausführliche Informationen zur Implementierung finden Sie unter: http://jsfiddle.net/adamb/F4BmP/

adamb
quelle
10
Könnten Sie das nicht verkürzen, indem Sie etwas tun wie : $('.menu').toggleClass('fixed', $(window).scrollTop() > 50);?
Michael J. Calkins
3
@MichaelCalkins Ja (eine andere ist :), $('.menu')[($(window).scrollTop() > num ? 'add' : 'remove') + 'Class']('fixed');aber ich denke, die Art und Weise, wie es geschrieben ist, ermöglicht maximale Lesbarkeit.
Adam
1
Für IE müssen Sie möglicherweise z-index:1;unter hinzufügen, .fixedum sicherzustellen, dass das Menü übertrieben ist.
Ivan Chau
1
Leider wird diese Implementierung jede Funktion / Interaktion, die Sie in die if-Anweisung einfügen, 6 Mal jedes Mal auslösen, wenn der Benutzer einen Klick scrollt, und 9 Mal, wenn er auf den Bildlaufleistenpfeil nach unten oder oben klickt. Mögliche Lösung für die verschiedenen Ereignisse hier: stackoverflow.com/questions/9613594/…
JPeG
1
toggleClass () verkürzt den Code, gibt jedoch ein seltsames Flackern beim Wechseln zwischen Klassen.
Akhil
20

In diesem Beispiel können Sie Ihr Menü zentriert anzeigen.

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");
        }
    });
});
Tomas Gonzalez
quelle
15

das gleiche wie adamb, aber ich würde eine dynamische Variable num hinzufügen

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

um den genauen Versatz oder die Position innerhalb des Fensters zu erhalten, um nicht die richtige Position zu finden.

 $(window).bind('scroll', function() {
         if ($(window).scrollTop() > num) {
             $('.menu').addClass('fixed');
         }
         else {
             num = $('.menuFlotante').offset().top;
             $('.menu').removeClass('fixed');
         }
    });
Mariosm
quelle
2
Dies ist großartig, da es einen häufigen Fehler vermeidet, der bei anderen Beispielen auftritt. Chrome fügt manchmal eine dumme und unsinnige Lücke zwischen <body> und first <div> hinzu, normalerweise mit der Höhe dieses <div>. Vielen Dank.
BornKillaz
+1 das ist eine bessere Lösung! Aufgrund der Verwendung eines variablen Werts zum Vergleich von .scrollTop () ist dies hilfreich, wenn Websites auf verschiedenen Geräten wie iPad usw. durchsucht werden, die sich im Verhalten der Desktop-Browser unterscheiden.
Irfaan
@BornKillaz, es kann durch Anwendung der CSS-Regel sortiert werden*:empty {display:none;}
Stormec56
14

Sie können auch CSS-Regeln verwenden:

position: fixed ; und top: 0px ;

auf Ihrem Menü-Tag.

LGreen
quelle
6
Dies ist der richtige Weg. Lassen Sie CSS das tun, wofür es entwickelt wurde. Durch Hinzufügen von Funktionen in JQuery wird Ihrem Projekt unnötiger Umfang hinzugefügt.
PseudoNinja
10
@PseudoNinja Ja, aber wenn Sie sich die als Beispiel bereitgestellte Seite Wilson ansehen, wird die Menüleiste nur dann "repariert", wenn der Benutzer über die relative Position gescrollt hat. Dies kann nicht allein in CSS erreicht werden.
Adam
6

Oder machen Sie dies dynamischer

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

In CSS Klasse hinzufügen

.fixed {
    position: fixed;
    top: 0;
}
Bilal Iqbal
quelle
3
Muss >=anstelle von sein, >sonst springt das Menü zwischen dem Festlegen beim Scrollen hin und her.
Jake Wilson
3

Vielleicht möchten Sie hinzufügen:

 $(window).trigger('scroll') 

um das Bildlaufereignis auszulösen, wenn Sie eine bereits gescrollte Seite neu laden. Andernfalls könnten Sie Ihr Menü aus der Position bringen.

$(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');
            }
        }); 
}); 
Athmane
quelle
Beim erneuten Laden scrollt der Browser automatisch zu seiner letzten Position und löst das Bildlaufereignis aus. Andernfalls müssen Sie die Position des Menüs nicht ändern, wenn er nicht automatisch scrollt.
weiterer
3

Überprüfen Sie den Link unten, es hat die HTML, CSS, JS und eine Live-Demo :) viel Spaß

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>

bummi
quelle
2
Das sieht viel komplizierter aus, als es sein muss.
Jake Wilson
3

versuchen Sie es mit dem 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>

Thoman
quelle
2

Dies ist JQuery-Code, der verwendet wird, um das Div zu reparieren, wenn es einen oberen Bereich des Browsers berührt. Ich hoffe, es wird viel helfen.

<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>
Manzoor
quelle
1

Sie können dies mit Ihrem Navi versuchen div:

postion: fixed;
top: 0;
width: 100%;
Kishan
quelle
1
$(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);
            }
        });
    });
Sumit Patel
quelle