Saya mencoba meniru aplikasi obrolan seluler lainnya di mana saat Anda memilih send-message
kotak teks dan membuka papan ketik virtual, pesan paling bawah masih terlihat. Sepertinya tidak ada cara untuk melakukan ini dengan CSS secara luar biasa, jadi JavaScript resize
(satu-satunya cara untuk mengetahui kapan keyboard dibuka dan ditutup ternyata) acara dan gulir manual untuk menyelamatkan.
Seseorang memberikan solusi ini dan saya menemukan solusi ini , yang sepertinya berfungsi baik.
Kecuali dalam satu kasus. Untuk beberapa alasan, jika Anda berada dalam MOBILE_KEYBOARD_HEIGHT
(250 piksel dalam kasus saya) piksel di bagian bawah div pesan, ketika Anda menutup keyboard ponsel, sesuatu yang aneh terjadi. Dengan solusi sebelumnya, itu bergulir ke bawah. Dan dengan solusi terakhir, ia akan menggulir ke atas MOBILE_KEYBOARD_HEIGHT
piksel dari bawah.
Jika Anda digulir di atas ketinggian ini, kedua solusi yang disediakan di atas berfungsi dengan sempurna. Hanya ketika Anda berada di dekat bagian bawah mereka memiliki masalah kecil ini.
Saya pikir mungkin itu hanya program saya yang menyebabkan ini dengan beberapa kode nyasar yang aneh, tapi tidak, saya bahkan mereproduksi biola dan memiliki masalah yang tepat ini. Maafkan saya karena membuat ini sangat sulit untuk di-debug, tetapi jika Anda membuka https://jsfiddle.net/t596hy8d/6/show (suffix show menyediakan mode layar penuh) pada ponsel Anda, Anda seharusnya dapat melihat perilaku yang sama.
Perilaku itu adalah, jika Anda menggulir ke atas cukup, membuka dan menutup keyboard mempertahankan posisi. Namun, jika Anda menutup keyboard dalam MOBILE_KEYBOARD_HEIGHT
piksel bagian bawah, Anda akan menemukan keyboard itu menggulir ke bagian bawah.
Apa yang menyebabkan ini?
Reproduksi kode di sini:
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>