Affix Bootstrap flickers after affix-bottom reache

2019-07-26 03:27发布

问题:

i have a small one-page-layout site which uses the Affix-Plugin from Bootstrap to get the sidenav-fixed - the affix-top/affix-switch works fine as intended but if i reach affix-bottom i got 2 problems:

first: the sidenav is cut off right before the 10th list-item

second: if i scroll back to top the affix-bottom and affix-classes are stuttering against. affix-bottom gets removed, affix added and within miliseconds the other way round.

markup:

<div class="page">
<main>
  <section class="scenecontainer intern bright">
                    <div class="container overlay">
                        <div class="row">
                            <div class="col-md-12">
                                <h2>Wissensdatenbank</h2>
                            </div>
                        </div>
                        <div class="row unmatch">
                            <div class="col-sm-9">
                                <h3>Überpunkt Wissendatenbank</h3>
                                <p>Überall dieselbe alte Leier. Das Layout ist fertig, der Text lässt auf sich warten. Damit das Layout nun nicht nackt im Raume steht und sich klein und leer vorkommt, springe ich ein: der Blindtext.</p>

                                <p>Genau zu diesem Zwecke erschaffen, immer im Schatten meines großen Bruders »Lorem Ipsum«, freue ich mich jedes Mal, wenn Sie ein paar Zeilen lesen. Denn esse est percipi - Sein ist wahrgenommen werden.</p>

                                <p>Und weil Sie nun schon die Güte haben, mich ein paar weitere Sätze lang zu begleiten, möchte ich diese Gelegenheit nutzen, Ihnen nicht nur als Lückenfüller zu dienen, sondern auf etwas hinzuweisen, das es ebenso verdient wahrgenommen zu werden: Webstandards nämlich.</p>

                                <p>Sehen Sie, Webstandards sind das Regelwerk, auf dem Webseiten aufbauen. So gibt es Regeln für HTML, CSS, JavaScript oder auch XML; Worte, die Sie vielleicht schon einmal von Ihrem Entwickler gehört haben.</p>

                                <p>Diese Standards sorgen dafür, dass alle Beteiligten aus einer Webseite den größten Nutzen ziehen. Im Gegensatz zu früheren Webseiten müssen wir zum Beispiel nicht mehr zwei verschiedene Webseiten für den Internet Explorer und einen anderen Browser programmieren.</p>

                                <p>Es reicht eine Seite, die - richtig angelegt - sowohl auf verschiedenen Browsern im Netz funktioniert, aber ebenso gut für den Ausdruck oder die Darstellung auf einem Handy geeignet ist. Wohlgemerkt: Eine Seite für alle Formate. Was für eine Erleichterung.</p>

                                <p>Standards sparen Zeit bei den Entwicklungskosten und sorgen dafür, dass sich Webseiten später leichter pflegen lassen. Natürlich nur dann, wenn sich alle an diese Standards halten. Das gilt für Browser wie Firefox, Opera, Safari und den Internet Explorer ebenso wie für die Darstellung in Handys.</p>

                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                                <p>Und was können Sie für Standards tun? Fordern Sie von Ihren Designern und Programmieren einfach standardkonforme Webseiten. Ihr Budget wird es Ihnen auf Dauer danken. Ebenso möchte ich Ihnen dafür danken, dass Sie mich bin zum Ende gelesen haben. Meine Mission ist erfüllt. Ich werde hier noch die Stellung halten, bis der geplante Text eintrifft. Ich wünsche Ihnen noch einen schönen Tag. Und arbeiten Sie nicht zuviel!</p>
                            </div>
                            <div class="col-sm-3">
                                <nav class="sidebar hidden-print hidden-xs">
                                    <ul class="nav sidenav">
                                        <li class="active parent">
                                            <a href="#">Überpunkt 1</a>
                                            <ul class="subnav">
                                                <li><a href="#">Unterpunkt 1</a></li>
                                                <li><a href="#">Unterpunkt 2</a></li>
                                                <li><a href="#">Unterpunkt 3</a></li>
                                                <li><a href="#">Unterpunkt 4</a></li>
                                            </ul>
                                        </li>
                                        <li><a href="#">Menüpunkt 2</a></li>
                                        <li><a href="#">Menüpunkt 3</a></li>
                                        <li><a href="#">Menüpunkt 4</a></li>
                                        <li><a href="#">Menüpunkt 5</a></li>
                                        <li><a href="#">Menüpunkt 6</a></li>
                                        <li><a href="#">Menüpunkt 7</a></li>
                                        <li><a href="#">Menüpunkt 8</a></li>
                                        <li><a href="#">Menüpunkt 9</a></li>
                                        <li><a href="#">Menüpunkt 10</a></li>
                                    </ul>
                                </nav>
                            </div>
                        </div>
                    </div>
                </section>
                <section class="scenecontainer intern bright">
                    <div class="container overlay">
                        <div class="row">
                            <div class="col-sm-12">
                                <form id="fileupload" class="form-horizontal" action="#" method="POST" enctype="multipart/form-data">
                                    <fieldset>
                                        <!-- Text input-->
                                        <div class="form-group">
                                            <label class="col-sm-4" for="nachname">Nachname:</label>  
                                            <div class="col-sm-8">
                                                <input id="nachname" name="nachname" type="text" placeholder="placeholder" class="form-control input-sm">
                                                <span class="help-block">Bitte geben Sie Ihren Nachnamen ein.</span>  
                                            </div>
                                        </div>

                                        <div class="form-group">
                                            <label class="col-sm-4" for="vorname">Vorname:</label>  
                                            <div class="col-sm-8">
                                                <input id="vorname" name="vorname" type="text" placeholder="placeholder" class="form-control input-sm">
                                                <span class="help-block">Bitte geben Sie Ihren Vornamen ein.</span>  
                                            </div>
                                        </div>

                                        <div class="form-group">
                                            <label class="col-sm-4" for="email">E-Mail:</label>  
                                            <div class="col-sm-8">
                                                <input id="email" name="email" type="email" placeholder="placeholder" class="form-control input-sm">
                                                <span class="help-block">Bitte geben Sie Ihre E-Mail Adresse ein.</span>  
                                            </div>
                                        </div>

                                        <div class="form-group">
                                          <label class="col-sm-4" for="selectbasic">Für welche Seminargruppe?</label>
                                          <div class="col-sm-8">
                                            <select id="selectbasic" name="selectbasic" class="form-control">
                                              <option value="1">Option one</option>
                                              <option value="2">Option two</option>
                                            </select>
                                          </div>
                                        </div>

                                        <!-- Multiple Checkboxes -->
                                        <div class="form-group">
                                            <label class="col-sm-4">Freigabe für folgende User:</label>
                                            <div class="col-sm-8">
                                                <div class="checkbox">
                                                    <label for="checkboxes0">
                                                        <input type="checkbox" name="checkboxes" id="checkboxes0" value="1">
                                                        Erika Mustermann
                                                    </label>
                                                </div>
                                                <div class="checkbox">
                                                    <label for="checkboxes1">
                                                        <input type="checkbox" name="checkboxes" id="checkboxes1" value="2">
                                                        Max Mustermann
                                                    </label>
                                                </div>
                                            </div>
                                        </div>

                                        </fieldset>
                                    <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
                                    <div class="row fileupload-buttonbar">
                                        <div class="col-lg-7">
                                            <!-- The fileinput-button span is used to style the file input field as button -->
                                            <span class="btn btn-success fileinput-button">
                                                <i class="glyphicon glyphicon-plus"></i>
                                                <span>Datei auswählen</span>
                                                <input type="file" name="files[]" multiple>
                                            </span>
                                            <button type="submit" class="btn btn-primary start">
                                                <i class="glyphicon glyphicon-upload"></i>
                                                <span>Start upload</span>
                                            </button>
                                        </div>
                                    </div>
                                </form>
                            </div>
                        </div>
                    </div>
                </section>
</main>
</div>

js (affix):

var target = $(".sidebar").closest("div");
    target.attr("id", "affixcontainer");
    var bottom = $("#affixcontainer").closest(".scenecontainer").next(".scenecontainer").outerHeight(true);
    $(".sidebar").affix({
        offset: {
            top: $(".sidebar").offset().top,
            //target: $("#affixcontainer"),
            bottom: bottom
        } 
    });

jsfiddle: https://jsfiddle.net/3xL6cfe0/

回答1:

I think the flicker is due the absolute positioning that gets applied as you scroll. This can be resolved by adjusting the width when the affix is applied.

.on('affix.bs.affix', function () { // before affix
    $(this).css({'width': $(this).outerWidth()});  // variable widths
});

To prevent the nav from getting cut-off, add some additional CSS:

.sidebar.affix > .nav {
    position: relative;
    top: 0;
}
.sidebar.affix-bottom > .nav {
    position: relative;
    top: -100px;
}

Demo: http://codeply.com/go/AldWE19XrQ