Ich versuche, andere mobile Chat-Apps nachzuahmen. Wenn Sie das send-messageTextfeld auswählen und die virtuelle Tastatur öffnen, wird die unterste Meldung weiterhin angezeigt. Es scheint erstaunlicherweise keine Möglichkeit zu geben, dies mit CSS zu tun, also JavaScript- resizeEreignisse (nur um herauszufinden, wann die Tastatur offenbar geöffnet und geschlossen wird) und manuelles Scrollen zur Rettung.
Jemand hat diese Lösung bereitgestellt , und ich habe diese Lösung herausgefunden , die beide zu funktionieren scheinen.
Außer in einem Fall. Aus irgendeinem Grund MOBILE_KEYBOARD_HEIGHTpassiert etwas Seltsames , wenn Sie sich innerhalb (250 Pixel in meinem Fall) Pixel am unteren Rand des Nachrichtendivs befinden, wenn Sie die mobile Tastatur schließen. Bei der ersteren Lösung wird nach unten gescrollt. Bei der letzteren Lösung werden stattdessen MOBILE_KEYBOARD_HEIGHTPixel von unten nach oben gescrollt.
Wenn Sie über diese Höhe gescrollt werden, funktionieren beide oben angegebenen Lösungen einwandfrei. Nur wenn Sie sich ganz unten befinden, haben sie dieses kleine Problem.
Ich dachte, vielleicht war es nur mein Programm, das dies mit einem seltsamen Streucode verursachte, aber nein, ich habe sogar eine Geige reproduziert und es hat genau dieses Problem. Ich entschuldige mich dafür, dass das Debuggen so schwierig ist. Wenn Sie jedoch auf Ihrem Telefon zu https://jsfiddle.net/t596hy8d/6/show (das Show-Suffix bietet einen Vollbildmodus) gehen, sollten Sie das sehen können gleiches Verhalten.
Wenn Sie genug nach oben scrollen, bleibt beim Öffnen und Schließen der Tastatur die Position erhalten. Wenn Sie jedoch in der Nähe der Tastatur innerhalb MOBILE_KEYBOARD_HEIGHTPixel des Bodens, werden Sie feststellen , dass es nach unten scrollt statt.
Was verursacht das?
Code-Reproduktion hier:
window.onload = function(e){
document.querySelector(".messages").scrollTop = 10000;
bottomScroller(document.querySelector(".messages"));
}
function bottomScroller(scroller) {
let scrollBottom = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight;
scroller.addEventListener('scroll', () => {
scrollBottom = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight;
});
window.addEventListener('resize', () => {
scroller.scrollTop = scroller.scrollHeight - scrollBottom - scroller.clientHeight;
scrollBottom = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight;
});
}
.container {
width: 400px;
height: 87vh;
border: 1px solid #333;
display: flex;
flex-direction: column;
}
.messages {
overflow-y: auto;
height: 100%;
}
.send-message {
width: 100%;
display: flex;
flex-direction: column;
}
<div class="container">
<div class="messages">
<div class="message">hello 1</div>
<div class="message">hello 2</div>
<div class="message">hello 3</div>
<div class="message">hello 4</div>
<div class="message">hello 5</div>
<div class="message">hello 6 </div>
<div class="message">hello 7</div>
<div class="message">hello 8</div>
<div class="message">hello 9</div>
<div class="message">hello 10</div>
<div class="message">hello 11</div>
<div class="message">hello 12</div>
<div class="message">hello 13</div>
<div class="message">hello 14</div>
<div class="message">hello 15</div>
<div class="message">hello 16</div>
<div class="message">hello 17</div>
<div class="message">hello 18</div>
<div class="message">hello 19</div>
<div class="message">hello 20</div>
<div class="message">hello 21</div>
<div class="message">hello 22</div>
<div class="message">hello 23</div>
<div class="message">hello 24</div>
<div class="message">hello 25</div>
<div class="message">hello 26</div>
<div class="message">hello 27</div>
<div class="message">hello 28</div>
<div class="message">hello 29</div>
<div class="message">hello 30</div>
<div class="message">hello 31</div>
<div class="message">hello 32</div>
<div class="message">hello 33</div>
<div class="message">hello 34</div>
<div class="message">hello 35</div>
<div class="message">hello 36</div>
<div class="message">hello 37</div>
<div class="message">hello 38</div>
<div class="message">hello 39</div>
</div>
<div class="send-message">
<input />
</div>
</div>