Ich habe gestern eine ähnliche Frage gestellt , sie aber schlecht erklärt und meinen Wunsch nach einer reinen CSS-Lösung, die meiner Meinung nach möglich sein sollte, nicht spezifiziert, also versuche ich es erneut.
Grundsätzlich habe ich ein Problem, bei dem ein Teil der scrollbaren Nachrichten und ein Eingabefeld darunter angezeigt werden. Wenn ich auf eine Schaltfläche klicke, möchte ich, dass das Eingabefeld um 100 Pixel vergrößert wird, ohne dass auch das Div der Nachrichten gescrollt wird.
Hier ist eine Geige, die das Problem in seiner Gesamtheit demonstriert
Wie Sie sehen können, wird beim Klicken auf die Schaltfläche "Rand hinzufügen" auch die Meldung div nach oben gescrollt. Ich möchte, dass es dort bleibt, wo es war. Wenn Sie leicht nach oben gescrollt sind, sodass Sie nur die vorletzte Nachricht sehen können, sollte das Klicken auf die Schaltfläche diese Position beim Klicken ebenfalls beibehalten.
Das Interessante ist, dass dieses Verhalten "manchmal" erhalten bleibt. Zum Beispiel wird unter bestimmten Umständen (die ich nicht ganz ableiten kann) die Bildlaufposition beibehalten. Ich möchte nur, dass es sich konsequent als solches verhält.
window.onload = function(e) {
document.querySelector(".messages").scrollTop = 10000;
};
function test() {
document.querySelector(".send-message").classList.toggle("some-margin");
}
.container {
width: 400px;
height: 300px;
border: 1px solid #333;
display: flex;
flex-direction: column;
}
.messages {
overflow-y: auto;
height: 100%;
}
.send-message {
width: 100%;
display: flex;
flex-direction: column;
}
.some-margin {
margin-bottom: 100px;
}
<div class="container">
<div class="messages">
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
<div class="message">hello</div>
</div>
<div class="send-message">
<input />
</div>
</div>
<button onclick="test()">add margin</button>
div
, was nach oben rollt, sondern die Höhe des Div, die abnimmt. Warum ist das so wichtig? Nun, was es bedeutet ist, dass derscrollbar
seine Position nicht anpasst. Die Bildlaufleiste merkt sich nur die Position relativ zum oberen Rand des Containers. Wenn die Höhe des Divs abnimmt, scheint die Bildlaufleiste nach oben zu scrollen, ist es aber nicht.