Kleben Sie div oben auf das übergeordnete Element

Lesezeit: 7 Minuten

Benutzer-Avatar
Alon Schmiel

Ich möchte das div an die Spitze seines übergeordneten Elements kleben.

Es funktioniert im Allgemeinen, außer in diesem Beispiel: http://jsfiddle.net/HV9HM/2859/

function sticky_relocate() {
    var window_top = $('#container').scrollTop();
    var div_top = $('#sticky-anchor').offset().top;
    if (window_top > div_top) {
        $('#sticky').addClass('stick');
        $('.stick').css('width', $('#sticky').next().css('width'));
    } else {
        $('#sticky').removeClass('stick');
    }
}

$(function () {
    $('#container').scroll(sticky_relocate);
    sticky_relocate();
});
.child {
    height: 200px;
    background: gray;
}

#sticky {
    padding: 0.5ex;
    width: 600px;
    background-color: #333;
    color: #fff;
    font-size: 2em;
    border-radius: 0.5ex;
}
#sticky.stick {
    position: fixed;
    z-index: 10000;
    border-radius: 0 0 0.5em 0.5em;
}
body {
    margin: 1em;
}
p {
    margin: 1em auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<br>
<br>
<br>

<div id="container" style="overflow-y: auto; height: 800px;">
  <div id="sticky-anchor"></div>
  <div id="sticky">This will stay at top of page</div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
</div>

Das Problem ist, dass wenn Sie das div scrollen, das aufgerufen wird container nach unten, das div wird nach oben gescrollt (es ist ein Fehler).

Wenn Sie ein weiteres untergeordnetes Element zu div hinzufügen:

<div class="child"></div>

Es klappt..

Sie können die funktionierende Geige hier sehen: http://jsfiddle.net/HV9HM/2860/

function sticky_relocate() {
    var window_top = $('#container').scrollTop();
    var div_top = $('#sticky-anchor').offset().top;
    if (window_top > div_top) {
        $('#sticky').addClass('stick');
        $('.stick').css('width', $('#sticky').next().css('width'));
    } else {
        $('#sticky').removeClass('stick');
    }
}

$(function () {
    $('#container').scroll(sticky_relocate);
    sticky_relocate();
});
.child {
    height: 200px;
    background: gray;
}

#sticky {
    padding: 0.5ex;
    width: 600px;
    background-color: #333;
    color: #fff;
    font-size: 2em;
    border-radius: 0.5ex;
}
#sticky.stick {
    position: fixed;
    z-index: 10000;
    border-radius: 0 0 0.5em 0.5em;
}
body {
    margin: 1em;
}
p {
    margin: 1em auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<br><br><br>
    
    <div id="container" style="overflow-y: auto; height: 800px;">
        <div id="sticky-anchor"></div>
        <div id="sticky">This will stay at top of page</div>
        <div class="child"></div>
        <div class="child"></div>
        <div class="child"></div>
        <div class="child"></div>
        <div class="child"></div>
    </div>

(Der Unterschied besteht darin, dass die erste Geige ein Kind weniger mit Klasse hat child).

Jede Hilfe geschätzt!

Benutzer-Avatar
Maximilian Laumeister

Der Grund dafür ist, dass sobald Sie geben position: fixed zu deinem #sticky Element, nimmt es es aus dem Belegfluss heraus. Das bedeutet, dass alle Ihre div.child Elemente verschieben sich nach oben, wodurch die Höhe Ihres Containerelements kleiner wird. Da die Höhe des Containerelements kleiner wird, muss das Containerelement nicht mehr scrollen, was bedeutet, dass sein Scrollbalken verschwindet und seine Scrollposition auf 0 zurückgesetzt wird. Wenn seine Scrollposition auf 0 zurückgesetzt wird, entfernt das Skript wieder die stick Klasse von dir #sticky -Element und wir sind wieder da, wo wir angefangen haben, aber mit dem Container-Element, das ganz nach oben gescrollt ist.

Zusammenfassend:

  1. #sticky Element bekommt .stick Klasse.

  2. #sticky Element wird aus dem Dokumentenfluss entfernt, untergeordnete Elemente werden nach oben verschoben, die Höhe des Containerelements verringert sich und die Bildlaufleiste verschwindet. Behälter scrollTop wird auf 0 zurückgesetzt.

  3. Das Skript wird erneut ausgelöst und entfernt die .stick Klasse ab #stickyund die des Containers scrollTop bleibt auf 0 (dadurch wird das Container-Div wieder nach oben gescrollt).

Unten ist eine Lösung, die verwendet position: absolute für die #sticky Element, und wenn die #sticky Element erhält die stick Klasse, es gibt die #sticky-anchor Element eine Höhe gleich der Höhe des #sticky -Element, um zu verhindern, dass die untergeordneten Divs nach oben verschoben werden.


Arbeitende Live-Demo:

function sticky_relocate() {
    var window_top = $('#container').scrollTop();
    var div_top = $('#sticky-anchor').offset().top;
    $('.stick').css('width', $('#sticky').next().css('width'));
    if (window_top > div_top) {
        $('#sticky-anchor').height($("#sticky").outerHeight());
        $('#sticky').addClass('stick');
        $("#sticky").css("top", (window_top) + "px");
    } else {
        $('#sticky').removeClass('stick');
        $('#sticky-anchor').height(0);
    }
}

$(function () {
    $('#container').scroll(sticky_relocate);
    sticky_relocate();
});
.child {
    height: 200px;
    background: gray;
}

#sticky {
    padding: 0.5ex;
    background-color: #333;
    color: #fff;
    font-size: 2em;
    border-radius: 0.5ex;
}
#sticky.stick {
    position: absolute;
    top: 0;
    z-index: 10000;
    border-radius: 0 0 0.5em 0.5em;
}
body {
    margin: 1em;
}
p {
    margin: 1em auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<br>
<br>
<br>

<div id="container" style="overflow-y: auto; height: 800px; position: relative;">
  <div id="sticky-anchor"></div>
  <div id="sticky">This will stay at top of page</div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
</div>

JSFiddle-Version: http://jsfiddle.net/HV9HM/2883/


Als Nebenbemerkung, der Grund, warum es in Ihrem zweiten Beispiel gut funktioniert hat, ist, dass das zusätzliche untergeordnete Element es so gemacht hat, dass selbst wenn Ihr #sticky -Element aus dem Dokumentenfluss entfernt und die Höhe des Containerelements reduziert wurde, war die Höhe des Containerelements immer noch groß genug, um zu verhindern, dass die Bildlaufleiste springt/verschwindet und Ihre scrollTop.

  • @AlonShmiel Falls Sie immer noch an einer Version interessiert waren, die den Header immer oben im Inhalt hält, hier ist ein JSFiddle! jsfiddle.net/HV9HM/2882

    – Maximilian Laumeister

    17. August 2015 um 22:50 Uhr

Obwohl die beste Antwort auf diese spezielle Frage eindeutig die von @MaximillianLaumeister ist, finden Sie hier eine allgemeine Lösung zum Befestigen eines Elements an einem anderen Element.

Halteseil

Tether ist eine JavaScript-Bibliothek, mit der ein absolut positioniertes Element effizient neben einem anderen Element auf der Seite bleiben kann.

Tether bietet die Möglichkeit, das Element innerhalb des Ansichtsfensters, seines Scroll-Elternteils, eines beliebigen anderen Elements auf der Seite oder eines festen Begrenzungsrahmens einzuschränken.

http://github.hubspot.com/tether/

  • Dies ist eine Art unvollständige Antwort, da Sie gerade mit einer Bibliothek verknüpft sind, die dies tut, ohne den Code dafür zu zeigen, wie es geht.

    – John Zabroski

    9. Dezember 2016 um 22:33 Uhr

  • @JohnZabroski, da bin ich anderer Meinung. Die Antwort ist vollständig. Viele Menschen sind möglicherweise nicht an dieser Ressource interessiert. Warum die Seite mit Code überladen, der für die meisten nutzlos ist und eine Wartung auf dieser Seite erfordern würde? Es ist besser, eine kurze Beschreibung bereitzustellen, und für diejenigen, die daran interessiert sind, können sie die Website besuchen, um mehr zu erfahren.

    – Michael Benjamin

    10. Dezember 2016 um 5:28 Uhr


  • Ich habe dir einen Hinweis gegeben. Bootstrap4 verwendet für diesen Effekt nicht einmal Tether, denn wenn Sie es versuchen würden, würden Sie verstehen, warum. Sie haben für diesen Zweck ein spezielles Plug-in namens Affix, das sie für ihr klebriges Inhaltsverzeichnis verwenden.

    – John Zabroski

    11. Dezember 2016 um 11:04 Uhr

  • @JohnZabroski, ich habe Bootstrap in keinem meiner Projekte verwendet. Aber danke für diese Info. Letztendlich war meine Antwort als Ergänzung oder Alternative zur akzeptierten Antwort gedacht. Nichts Besonderes.

    – Michael Benjamin

    11. Dezember 2016 um 13:08 Uhr

Benutzer-Avatar
Apurva Prajapati

<table>
<tr class="relative" id="header">
    <td>header
    </td>
</tr>

<tr id="content">
    <td>table content
    </td>
</tr>    

$(window).scroll(function() {

      if ($(window).scrollTop() > 140) {
        $("#header").addClass("fixed");
      } else {
        $("#header").removeClass("fixed");
      }
});

Nehmen Sie Bezug auf das folgende Beispiel
https://jsfiddle.net/nckv9mso/

zusammen mit position:fixed;Sie müssen der Sticky-Navigationsleiste auch einen höheren Z-Index-Wert als den anderen Elementen derselben Seite geben z-index:blah;

Das Problem tritt auf, wenn die Containerhöhe x ist und der Inhalt des Containers kleiner als x+36px ist. In diesem Beispiel ist der Container 800 Pixel groß und der Inhalt kleiner als 836 Pixel. Meine Idee für die Lösung war, die Höhe des Inhalts zu überprüfen und mit der Höhe des Containers zu vergleichen und wenn der Unterschied weniger als 36 Pixel beträgt, die Stick-Klasse einfach nicht hinzuzufügen.

Benutzer-Avatar
Gemeinschaft

Es ist sehr einfach. Fügen Sie einfach das folgende Styling für das spezifische Sticky-Div hinzu.

klebrig{Position: fixiert;}

1083360cookie-checkKleben Sie div oben auf das übergeordnete Element

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

Privacy policy