Sto cercando di imitare altre app di chat mobile in cui quando si seleziona la send-message
casella di testo e si apre la tastiera virtuale, il messaggio più in basso è ancora in vista. Non sembra esserci un modo per farlo sorprendentemente con i CSS, quindi JavaScript resize
(l'unico modo per scoprire quando la tastiera è aperta e apparentemente chiusa) eventi e lo scorrimento manuale per il salvataggio.
Qualcuno ha fornito questa soluzione e ho scoperto questa soluzione , che sembrano funzionare entrambe.
Tranne in un caso. Per qualche motivo, se ti trovi entro MOBILE_KEYBOARD_HEIGHT
(250 pixel nel mio caso) pixel della parte inferiore dei div dei messaggi, quando chiudi la tastiera del cellulare, succede qualcosa di strano. Con la prima soluzione, scorre verso il basso. E con quest'ultima soluzione, scorre invece i MOBILE_KEYBOARD_HEIGHT
pixel verso l' alto dal basso.
Se si scorre sopra questa altezza, entrambe le soluzioni fornite sopra funzionano in modo impeccabile. È solo quando sei vicino al fondo che hanno questo piccolo problema.
Ho pensato che forse era solo il mio programma a causare questo con uno strano codice randagio, ma no, ho persino riprodotto un violino e ha questo problema esatto. Mi scuso per aver reso il debug così difficile, ma se vai su https://jsfiddle.net/t596hy8d/6/show (il suffisso show fornisce una modalità a schermo intero) sul tuo telefono, dovresti essere in grado di vedere il stesso comportamento.
Tale comportamento essendo, se scorri verso l'alto, l'apertura e la chiusura della tastiera mantiene la posizione. Tuttavia, se chiudi la tastiera entro MOBILE_KEYBOARD_HEIGHT
pixel della parte inferiore, scoprirai che scorre invece verso la parte inferiore.
Cosa sta causando questo?
Riproduzione codice qui:
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>