Fixierte Seitenleiste um 290 Pixel vom Ende der Seite scrollen lassen?

Lesezeit: 10 Minuten

Benutzeravatar von J82
J82

Ich versuche, eine Seitenleiste zu erstellen, die wie die auf Vice.com funktioniert. Wenn Sie nach unten scrollen, wird die Seitenleiste an einem bestimmten Punkt fixiert, und wenn die Seitenleiste dann einen bestimmten Punkt am unteren Rand der Website erreicht, wird sie mit dem Rest der Website weiter nach oben scrollen.

Auf meiner Website stecke ich im zweiten Teil fest, der die Seitenleiste dazu bringt, weiter nach oben zu scrollen, sobald sie sich dem unteren Rand nähert. 290px von unten um genau zu sein.

Hier ist, was ich bisher habe:

JavaScript

<script>
jQuery(window).scroll(function () {
    var threshold = 20;
 if (jQuery(window).scrollTop() >= 20)
     jQuery('#sidebar').addClass('fixed');
 else
     jQuery('#sidebar').removeClass('fixed');
});
</script>

CSS

#sidebar {
  margin: 0;
  position: absolute;
  right: 0;
  width: 220px;
}
#sidebar.fixed {
  margin-left: 720px;
  position:fixed;
  right: auto;
  top: 173px;
}

Wie kann ich die feste Seitenleiste nach oben scrollen lassen, sobald sie einen bestimmten Punkt nahe dem unteren Rand erreicht?


Bearbeiten #1

Hier ist der aktualisierte Code von Adam. Ich verwende eine bedingte Anweisung für die Seiten, die einen anderen Schwellenwert haben. Wenn ich diesen Code verwende, passiert nichts, was bedeutet, dass die Seitenleiste den nicht erhält fixed Klasse hinzugefügt und scrollt daher normal nach oben, als ob der Code gar nicht da wäre. Außerdem erhalte ich einen Konsolenfehler in dieser Zeile if (scrollTop() >= 236) { sagen, dass die “Nummer keine Funktion ist”.

if (jQuery(document.body).hasClass("home")) {

    jQuery(window).scroll(function () {
        var sidebarHeight = jQuery('#sidebar').height(),
            containerHeight = jQuery('#container').height() + 173,
            scrollTop = jQuery(window).scrollTop(),
            clientHeight = scrollTop + jQuery(window).height(),
            threshold = 654;
        if (scrollTop() >= 654) {
            jQuery('#sidebar').addClass('fixed');
        } else if (containerHeight - scrollTop <= sidebarHeight) {
            jQuery('#sidebar').removeClass('fixed').addClass('bottom');
        }
    });

} else if (jQuery(document.body).hasClass("single") || jQuery(document.body).hasClass("page")) {

    jQuery(window).scroll(function () {
        var sidebarHeight = jQuery('#sidebar').height(),
            containerHeight = jQuery('#container').height() + 173,
            scrollTop = jQuery(window).scrollTop(),
            clientHeight = scrollTop + jQuery(window).height(),
            threshold = 20;
        if (scrollTop() >= 20) {
            jQuery('#sidebar').addClass('fixed');
        } else if (containerHeight - scrollTop <= sidebarHeight) {
            jQuery('#sidebar').removeClass('fixed').addClass('bottom');
        }
    });

} else {

    jQuery(window).scroll(function () {
        var sidebarHeight = jQuery('#sidebar').height(),
            containerHeight = jQuery('#container').height() + 173,
            scrollTop = jQuery(window).scrollTop(),
            clientHeight = scrollTop + jQuery(window).height(),
            threshold = 236;
        if (scrollTop() >= 236) {
            jQuery('#sidebar').addClass('fixed');
        } else if (containerHeight - scrollTop <= sidebarHeight) {
            jQuery('#sidebar').removeClass('fixed').addClass('bottom');
        }
    });

}

Unten ist die HTML-Struktur wie gewünscht:

<!-- BEGIN #masthead-->
<div id="masthead">
    <!-- #secondary-menu -->
    <div id="secondary-menu">

        <!-- .centered-menu -->
        <div class="centered-menu">
            <div class="latest-tweets"></div>
            <div id="search-bar"></div>
            <ul class="social-icons sf-js-enabled"></ul>
        </div>
        <!-- /.centered-menu -->

    </div>
    <!-- /#secondary-menu -->

    <!-- BEGIN #header-->
    <div id="header">

        <!-- #header-inner -->
        <div id="header-inner" class="clearfix">
            <div id="logo"></div>

            <!-- BEGIN #primary-menu -->
            <div id="primary-menu" class="clearfix">

                <!-- .left-menu -->
                <div class="left-menu split-menu"></div>
                <!-- /.left-menu -->

                <!-- .right-menu -->
                <div class="right-menu split-menu">
                    <div class="menu-menu-right-container"></div>
                <!-- /.right-menu -->   

            <!-- END #primary-menu -->
            </div>

        </div>
        <!-- /#header-inner -->

    <!-- END #header -->

    <!-- BEGIN #mobile-menu -->
    <div id="mobile-menu">
        <div id="mobile-inner"></div>
    </div>
    <!-- END #mobile-menu -->

    </div>

    <div id="categories-bar"></div>

</div>
<div id="masthead-space"></div>
<!-- END #masthead -->

<!-- BEGIN #wrapper-->
<div id="wrapper">

    <!-- BEGIN #page-->
    <div id="page">

        <div id="main" class="clearfix">

            <div id="container" class="clearfix">

                <!--BEGIN #content -->
                <div id="content">
                    <div id="sidebar"></div><!-- #sidebar --> 
                </div>

            </div>

        <!--END #main -->
        </div>

    <!--END #page -->
    </div>

<!--END #wrapper -->
</div>

<!--BEGIN #bottom -->
<div id="bottom">

    <!--BEGIN #footer -->
    <div id="footer"></div>

</div>

  • Ich bin nicht überzeugt von der Struktur Ihrer Seite, daher ist meine Antwort etwas daneben, aber ich werde versuchen, sie zum Laufen zu bringen. Wenn Sie mir eine Geige machen können, könnte ich mich genauer informieren.

    – Adam Merrifield

    21. März 2014 um 3:09 Uhr

Benutzeravatar von Aramil Rey
Aramil Rei

Mein Rat:

Erstellen Sie 2 CSS-Klassen mit den gewünschten Eigenschaften und schalten Sie beide nach Erreichen des Haltepunkts um, 1 muss zu Beginn aktiv sein.

GEIGE

JS

var changePoint = $('#reaching_the_top_of_this_element_activates_change').offset().top;

$(window).scroll(function ()  {
if ($(window).scrollTop() >= changePoint) {
    $('#sidebar').removeClass('blackStatic');
    $('#sidebar').addClass('redFixed');
}
else {
    $('#sidebar').addClass('blackStatic');
    $('#sidebar').removeClass('redFixed');
}

});

CSS

.blackStatic {
    position: static;
    background-color: black;
    color: red;
}
.redFixed {
    position: fixed;
    top: 0;
    background-color: red;
    color: black;
}

Wie ich in meinem Kommentar sagte, ist dies möglicherweise deaktiviert, da ich die Struktur des HTML-Codes derzeit nicht sehen kann. Aber so etwas sollte funktionieren. Wir erhalten die Höhe der scrollbar, container(+ die Höhe der Kopfzeile) und die Höhe des sichtbaren Bereichs für den Benutzer oder die client. Also mit Mathematik können wir das sagen, wenn die containerscrollTop ist kleiner als die Höhe der scrollbar Wir brauchen die Bildlaufleiste, damit sie nicht mehr repariert wird. An diesem Punkt entfernen wir die feste Klasse und fügen die unterste Klasse hinzu, die nur 1 Eigenschaft hat. bottom: 0. Nun solange die Scrollbar innerhalb des Containers ist und der Container hat position: relative Der Boden wird am Boden des Behälters befestigt.

Javascript:

jQuery(window).scroll(function(){
    var sidebarHeight = jQuery('#sidebar').height(),
        containerHeight = jQuery('#container').height() + 173,
        scrollTop = jQuery(window).scrollTop(),
        clientHeight = scrollTop + jQuery(window).height(),
        threshold = 20;
    if(scrollTop >= 20){
        jQuery('#sidebar').addClass('fixed');
    }else if(containerHeight - scrollTop <= sidebarHeight){
        jQuery('#sidebar').removeClass('fixed').addClass('bottom');
    }
});

CSS:

#sidebar.bottom {
    bottom: 0;
}

Lassen Sie mich wissen, wenn dies für Sie nicht funktioniert, und aktualisieren Sie Ihre Frage, um den HTML-Code zu erhalten, damit dies Ihren Anforderungen besser entspricht. Außerdem müssen Sie sich mit einem Benutzer befassen, der die Seite auch zurückscrollt, was dies derzeit nicht berücksichtigt, aber es wäre nicht schwer, es hinzuzufügen.

werfen Sie einen Blick auf bootstrap-affix.js http://getbootstrap.com/2.3.2/javascript.html#affix

Es tut genau das, wonach Sie fragen, und Sie können HTML5-Datenattribute verwenden, um die Verhaltensweisen hinzuzufügen:

<div data-spy="affix" data-offset-top="200">...</div>

  • Ich habe mir das angeschaut und komme damit nicht klar. Ich weiß leider nicht viel über Bootstrap, aber das sieht so aus, als würde es das tun, wonach ich frage.

    – J82

    21. März 2014 um 11:23 Uhr

  • Entschuldigung, dass ich die Antwort vorerst nicht verbessern kann, ich bin auf meinem Handy, der Link ist für eine ältere Version von Bootstrap, für die neueste Version mit Anweisungen, siehe hier getbootstrap.com/javascript

    – Lee Gary

    21. März 2014 um 15:30 Uhr

versuchen Sie diesen Code (ich habe IDs gemäß Ihrem Markup verwendet):

function sidebarScroll()
{
  var tmpWindow = $(window),
      wrapper = $('#wrapper').height(),
      header = $('#header').height(),
      sidebar = $('#sidebar'),
      offsetTop = sidebar.offset().top,
      offsetBottom;

  tmpWindow.scroll(function(){

    offsetBottom = (wrapper + header) - sidebar.height();

    if (tmpWindow.scrollTop() < offsetTop) {
      sidebar.removeClass('fixed bottom');
    } else if (tmpWindow.scrollTop() > offsetBottom) {
      sidebar.removeClass('fixed').addClass('bottom');
    } else {
      sidebar.removeClass('bottom').addClass('fixed');
    }
  });
}

sidebarScroll();

und das sind die Klassen, die Sie brauchen:

#wrapper {
  position: relative;
}
#sidebar {
  width: 220px;
  position: absolute;
  right: 0;
}

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

#sidebar.bottom {
  position: absolute;
  bottom: 0;
}

DEMO

Benutzeravatar von Awesomolocity
Awesomolocität

Der Code, den Sie von Adam geliehen haben, wurde falsch kopiert. Sie verwenden scrollTop() anstelle von scrollTop. scrollTop ist auf eine Zahl gesetzt, also versuchen Sie im Grunde 20() (oder eine beliebige Zahl, auf die scrollTop gesetzt ist)

Bearbeiten: Um die Redundanz mit Ihrem Code zu reduzieren, habe ich ihn neu geschrieben, um den Schwellenwert über ternäre if-Anweisungen festzulegen:

jQuery(window).scroll(function () {
    var sidebarHeight = jQuery('#sidebar').height(),
    containerHeight = jQuery('#container').height() + 173,
    scrollTop = jQuery(window).scrollTop(),
    clientHeight = scrollTop + jQuery(window).height(),
    threshold = (jQuery(document.body).hasClass("home"))?654:((jQuery(document.body).hasClass("single") || jQuery(document.body).hasClass("page"))?20:236);
});

Benutzeravatar von Ghostff
Geistff

<div class="main">
</div>
<div class="foot">
</div>
<div id="float">
<div class="float_content_head">
I was sending javascript to display
</div><div class="float_content">
d my issue was that I was sending javascript to display console messages. Even when I looked at the file in my browser (not through the application) it showed exactly as I expected it to (eg the extra tags weren't showing), but there were showing in the html/text output and were trying to be parsed. Hope this helps someone!I had a similar problem, and my issue was that I was sending tags we
</div>
</div>

Css
<style type="text/css">
#float{
    background: #fff;
    position:absolute;
    right:30px;
    top:20px;
    width:250px;
    padding:10px;
    border-radius: 6px;
    -webkit-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.43);
-moz-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.43);
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.43);
}
.float_content_head{
    padding:10px;
    border-bottom: 1px solid #efefef;
    text-align:center;
}
.float_content{
    padding-top:10px;
}
.main{
    width: 800px;
    height: 800px;
    margin: 0 auto;
    border:1px solid #efefef;
    padding: 10px;
    background:#ccc;
}
.foot{
    width: 100%;
    height: 800px;
    margin: 0 auto;
    border:1px solid #efefef;
    padding: 10px;
    background:#096;
}
#box p{
    margin:0;
    padding:0;
}
</style>

JS
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript"> 
$(document).ready(function() {
var starting_position = $('#float').offset();
var top_padding = 50;
var bottom_limit = $('.foot').offset();
var box_height = $('#float').height() + 20;
$(window).scroll(function(){
var top_window = $(window).scrollTop();
if (top_window > starting_position.top && top_window < bottom_limit.top - box_height){
$('#float').stop().animate({top: top_window - starting_position.top + top_padding}, 400);
} else if (top_window > bottom_limit.top - starting_position.top - box_height){
$('#float').stop().animate({top: bottom_limit.top - starting_position.top - box_height }, 400);
} else { $('#float').stop().animate({top: 10 }, 400);           
}
});
});
</script>

Benutzeravatar von Timmah
Timma

Hört sich an wie das ist, was Sie suchen (entschuldigen Sie meine Ausweise):

$(document).ready(function() {
// Get the inital position of the menu
    var initialPos = $('#mainnav').offset().top;

//Bind scrolling or resizing
$(window).bind('scroll resize', function() {

// Get the distance from the top of the page to the top of the footer
    var footerTop = $('#footer').length > 0 ? $('#footer').offset().top : $('#footer').offset().top;

// Get the distance from the top of the page to the bottom of the menu
    var navBottom = $(window).scrollTop() + $('#mainnav').height() + 22;

// If the user scrolls further than the height of the header (this method allows for resizing with a max-width layout)
    if ($(window).scrollTop() > initialPos) {
        $('#mainnav').css({
            'position': 'fixed',

           // move the menu based on how far the user has scrolled, and if it exceed the height of the footer
            'top': (footerTop - navBottom > 0 ? 0 : footerTop - navBottom) + 'px',
            'left': ($('#wrapper02').offset().left - $(window).scrollLeft()) + 'px'
        });
    } else {
        $('#mainnav').css({
            'position': 'static'
        });
    }
});
});

1395520cookie-checkFixierte Seitenleiste um 290 Pixel vom Ende der Seite scrollen lassen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy