Próbuję naśladować inne mobilne aplikacje do czatowania, w których po wybraniu opcji send-message
tekstowego i otwarciu wirtualnej klawiatury nadal wyświetla się najniższa wiadomość. Wydaje się, że nie ma sposobu, aby zrobić to z CSS w zadziwiający sposób, więc JavaScript resize
(jedyny sposób, aby dowiedzieć się, kiedy klawiatura jest najwyraźniej otwarta i zamknięta) zdarzenia i ręczne przewijanie na ratunek.
Ktoś dostarczył to rozwiązanie i się dowiedziałem to rozwiązanie , które wydaje się działać.
Z wyjątkiem jednego przypadku. Z jakiegoś powodu, jeśli jesteś w środkuMOBILE_KEYBOARD_HEIGHT
(w moim przypadku 250 pikseli) pikseli od dolnej części wiadomości div, po zamknięciu klawiatury mobilnej dzieje się coś dziwnego. W pierwszym rozwiązaniu przewija się do dołu. W tym drugim rozwiązaniu zamiast tego przewija MOBILE_KEYBOARD_HEIGHT
piksele w górę od dołu.
Jeśli przewiniesz powyżej tej wysokości, oba powyższe rozwiązania działają bezbłędnie. Tylko wtedy, gdy jesteś blisko dna, mają ten drobny problem.
Pomyślałem, że może to tylko mój program powodował ten dziwny zbłąkany kod, ale nie, nawet odtworzyłem skrzypce i ma dokładnie ten problem. Przepraszamy za utrudnienie debugowania, ale jeśli przejdziesz do https://jsfiddle.net/t596hy8d/6/show (sufiks pokazu zapewnia tryb pełnoekranowy) na telefonie, powinieneś zobaczyć takie samo zachowanie.
Takie zachowanie polega na tym, że jeśli przewiniesz wystarczająco, otwarcie i zamknięcie klawiatury utrzymuje pozycję. Jeśli jednak zamkniesz klawiaturę w odległości kilku MOBILE_KEYBOARD_HEIGHT
pikseli od dołu, przekonasz się, że zamiast tego przewija się ona w dół.
Co to powoduje?
Reprodukcja kodu tutaj:
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>