Saya mengajukan pertanyaan serupa kemarin tetapi menjelaskannya dengan buruk, dan tidak menentukan keinginan saya untuk solusi murni-CSS, yang saya pikir seharusnya mungkin, jadi saya coba lagi.
Pada dasarnya, saya memiliki masalah di mana saya memiliki div pesan yang dapat digulir dan bidang input di bawahnya. Ketika saya mengklik sebuah tombol, saya ingin bidang input ditabrak hingga 100 piksel, tanpa harus gulir div pesan juga.
Berikut adalah biola yang menunjukkan masalah secara keseluruhan
Seperti yang Anda lihat, ketika Anda mengklik tombol "tambahkan margin", div pesan juga akan bergulir. Saya ingin tinggal di tempat itu. Demikian pula, jika Anda sedikit digulir ke atas sehingga Anda hanya dapat melihat pesan kedua hingga terakhir, mengklik tombolnya juga harus mempertahankan posisi itu saat diklik.
Yang menarik adalah bahwa perilaku ini "kadang-kadang" dipertahankan. Misalnya, dalam beberapa keadaan (yang saya tidak bisa menyimpulkan) posisi gulir dipertahankan. Saya hanya ingin hal itu berlaku secara konsisten.
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
yang bergulir ke atas, tapi ketinggian div yang menurun. Jadi mengapa ini penting? Nah, apa artinya adalah bahwascrollbar
tidak menyesuaikan posisinya. Scrollbar hanya mengingat posisinya relatif dari atas wadahnya. Ketika ketinggian div menurun, sepertinya scrollbar sedang bergulir, tetapi sebenarnya tidak.Jawaban:
Ini adalah solusi lucu yang mungkin Anda sukai.
Apa yang kita ketahui tentang div bahwa itu hanya mempertahankan posisi atas bilah gulir jadi jika ketinggian berubah karena alasan apa pun bilah gulir akan tetap sama dan inilah yang menyebabkan masalah Anda.
Sebagai solusi Anda dapat membalik
.messages
180 derajat menggunakantransform: rotate(180deg) scaleX(-1);
dan membalik kembali.message
untuk membatalkan membalik konten maka div akan mempertahankan scrollbar bawah (yang atas) secara otomatis.sumber
Perilaku normal scrollbar itu berada di atas, jadi ketika Anda mengaturnya ke bawah pada halaman memuat, Anda harus mempertahankannya sendiri karena ketika konten di bawah ini mendorongnya maka div scroll akan pindah ke atas.
Jadi saya punya dua solusi untuk Anda:
Balikkan pesan di dalam div pesan sehingga pesan terakhir akan menjadi yang pertama sehingga gulir akan selalu berada di atas.
Saya membuat fungsi javascript untuk menggulir ke bagian bawah elemen apa pun sehingga Anda cukup menyebutnya kapan saja Anda ingin menggulir ke bagian bawah.
Periksa cuplikannya
sumber
Anda dapat melakukannya sebaliknya, dengan memberikan ketinggian ke
.messages
alih alih memberikannya ke.container
dalam hal ini tidak akan mempengaruhi pesandiv
tetapi jika Anda memberikannya kepada.container
itu akan mendorong div Anda karena margin berada di dalam main div yang memiliki ketinggian.Periksa cuplikan ini
sumber
.send-message
. Jika Anda melihat pertanyaan saya sebelumnya, ini dilakukan karena mirip dengan margin bump dari membuka keyboard virtual pada perangkat seluler (margin bawah hanyalah pengganti 1: 1 untuk men-debug solusi)Solusi sederhana adalah dengan mengatur sebelumnya
scrollTop
pada sakelar. Di sini saya menggunakan dataset untuk menyimpanscrollTop
nilai sebelumnya , Anda juga bisa menggunakan variabel.sumber
Maksud saya, berikut ini adalah solusi CSS saja yang memecahkan persis contoh Anda:
tapi saya pikir itu tidak akan membantu Anda dengan masalah awal Anda dari keyboard virtual. Tapi mungkin ini bisa menginspirasi orang lain untuk solusi.
Masalah utama tampaknya adalah scrollbar sudah melakukan apa yang Anda inginkan:
Mempertahankan posisinya sehingga konten yang paling baru dibaca terlihat.
Kecuali bilah gulir memutuskan bahwa Anda ingin melihat TOP dari konten yang saat ini terlihat, bukan bagian bawah. (Lebih mudah untuk melihat apakah Anda menggunakan angka: https://jsfiddle.net/1co3x48n/ )
Jika Anda bersedia menggunakan javascript, ada segala macam jawaban: https://www.google.com/search?q=scrollbar+always+on+bottom+css+site:stackoverflow.com
Jujur saja, fakta bahwa Anda dapat melewati ~ 3 + halaman ini dan hanya menemukan jawaban Javascript yang memberi tahu saya bahwa Anda tidak akan menemukan jawaban khusus CSS, tentu saja bukan yang kompatibel dengan banyak browser.
sumber
Sayangnya, tidak ada solusi yang benar-benar berfungsi. Masalah dengan menggunakan
onFocus
untuk kotak teks adalah bahwa itu tidak akan berlaku jika kotak teks sudah memiliki fokus. Saya telah bermain-main dengan ini selama berjam-jam dan solusi terdekat saya sampai sejauh ini adalah ini:Namun, ini sepertinya hanya kadang-kadang berhasil. Ini berfungsi 100% dari waktu ketika mengklik kotak teks, tetapi untuk beberapa alasan ketika menutup keyboard virtual itu hanya berfungsi jika digulirkan ke atas. Kalau tidak, itu me-reset ke posisi yang sama setiap kali (dekat bagian bawah, tetapi tidak cukup bagian bawah).
Tidak yakin apa yang menyebabkannya. Saya harus menyelidiki lebih banyak besok. Ini adalah yang terdekat sejauh ini.
sumber
Buat wadah seperti dalam contoh di atas, tetapi kemudian ubah saja CSS saat Anda mulai mengetik.
Saya tidak mengatur posisi scrollbar, hanya memindahkan seluruh wadah pesan ke atas. Jadi, apa pun posisi gulir Anda mungkin, akan tetap sama. Setidaknya ke bawah, tentu saja Anda tidak akan dapat melihat garis di atas.
Anda harus dapat menyesuaikan css dengan kebutuhan Anda. Anda bahkan dapat pergi tanpa JS jika Anda menggunakan: fokus atau pengaturan CSS yang sedikit berbeda, jadilah kreatif :)
sumber
Anda harus menambahkan
document.querySelector(".messages").scrollTop = 10000;
untuktest
fungsi ketika add marjin kemudianscrollTop
pergi untuk mengakhiri beban Anda mengaturscrolltop
dan ketika Anda menambahkan margin atau marjin removescrolltop
tidak mengatur lagi mengubah Anda script untuk seperti inisumber
Tampaknya ada masalah dengan fungsi js toggle. Saya telah mengubahnya menjadi hide & show sederhana. Saya juga telah menambahkan lebar pada tag input. Anda juga perlu menambahkan posisi: absolut pada div kirim-pesan dan bawah: 0 sehingga tetap di bawah. kemudian posisikan posisi: relatif pada wadah sehingga div pesan kirim tetap berada di dalam wadah. Ini berarti bahwa wadah pesan tidak akan memengaruhi pesan itu sendiri dan mendorongnya ke atas.
sumber
Pendekatan CSS murni yang tidak sempurna yang bisa saya buat adalah sebagai berikut:
Bagian paling atas memiliki sedikit masalah ketika margin ada di sana. Kuncinya di sini adalah menggunakan margin negatif dan menggunakan translate untuk "scroll up" (bukan benar-benar sebuah scroll, hanya ilusi)
wrapper
div.sumber
div
)?Ini dapat dengan mudah ditangani dengan nama jangkar. Lihatlah biola JS di https://jsfiddle.net/gvbz93sx/
Perubahan HTML
<a name="bottom"></a>
JS Change
document.location.hash = "#bottom";
sumber