Di Safari iOS8 ada bug baru dengan posisi tetap.
Jika Anda memfokuskan textarea yang ada di panel tetap, safari akan menggulir Anda ke bagian bawah halaman.
Ini membuat semua jenis UI tidak mungkin digunakan, karena Anda tidak memiliki cara untuk memasukkan teks ke dalam textarea tanpa menggulir halaman Anda sepenuhnya ke bawah dan kehilangan tempat Anda.
Apakah ada cara untuk mengatasi bug ini dengan rapi?
#a {
height: 10000px;
background: linear-gradient(red, blue);
}
#b {
position: fixed;
bottom: 20px;
left: 10%;
width: 100%;
height: 300px;
}
textarea {
width: 80%;
height: 300px;
}
<html>
<body>
<div id="a"></div>
<div id="b"><textarea></textarea></div>
</body>
</html>
Jawaban:
Berdasarkan analisis bagus dari masalah ini, saya telah menggunakan in
html
danbody
elemen di css:Saya pikir ini bekerja dengan baik untuk saya.
sumber
transform: translateZ(0);
dari stackoverflow.com/questions/7808110/…Solusi terbaik yang dapat saya temukan adalah beralih menggunakan
position: absolute;
fokus dan menghitung posisi saat itu digunakanposition: fixed;
. Triknya adalahfocus
acara tersebut terlambat menyala, jaditouchstart
harus digunakan.Solusi dalam jawaban ini sangat mirip dengan perilaku yang benar yang kami miliki di iOS 7.
Persyaratan:
The
body
elemen harus memiliki positioning untuk memastikan posisi yang tepat ketika elemen beralih ke posisi mutlak.Kode ( Contoh Langsung ):
Kode berikut adalah contoh dasar untuk kasus uji yang disediakan, dan dapat disesuaikan untuk kasus penggunaan spesifik Anda.
Berikut adalah kode yang sama tanpa peretasan untuk perbandingan .
Peringatan:
Jika
position: fixed;
elemen memiliki elemen induk lain dengan pemosisian di sampingbody
, peralihan keposition: absolute;
mungkin memiliki perilaku yang tidak terduga. Karena sifatposition: fixed;
ini mungkin bukan masalah besar, karena elemen bersarang tidak umum.Rekomendasi:
Meskipun penggunaan
touchstart
acara akan memfilter sebagian besar lingkungan desktop, Anda mungkin ingin menggunakan sniffing agen pengguna sehingga kode ini hanya akan berjalan untuk iOS 8 yang rusak, dan bukan perangkat lain seperti Android dan versi iOS yang lebih lama. Sayangnya, kami belum tahu kapan Apple akan memperbaiki masalah ini di iOS, tetapi saya akan terkejut jika masalah ini tidak diperbaiki di versi utama berikutnya.sumber
Saya menemukan metode yang berfungsi tanpa perlu mengubah ke posisi absolut!
Kode lengkap tanpa komentar
Memecahnya
Pertama, Anda harus memiliki kolom input tetap di bagian atas halaman di HTML (ini adalah elemen tetap sehingga secara semantik masuk akal untuk diletakkan di dekat bagian atas):
Maka Anda perlu menyimpan posisi gulir saat ini ke dalam variabel global:
Maka Anda memerlukan cara untuk mendeteksi perangkat iOS agar tidak memengaruhi hal-hal yang tidak perlu diperbaiki (fungsi diambil dari https://stackoverflow.com/a/9039885/1611058 )
Sekarang kita memiliki semua yang kita butuhkan, inilah perbaikannya :)
sumber
Saya dapat memperbaiki ini untuk input terpilih dengan menambahkan event listener ke elemen pilih yang diperlukan, lalu menggulir dengan offset satu piksel saat pilihan tersebut mendapatkan fokus.
Ini belum tentu merupakan solusi yang baik, tetapi jauh lebih sederhana dan lebih dapat diandalkan daripada jawaban lain yang pernah saya lihat di sini. Browser tampaknya merender ulang / menghitung ulang posisi: tetap; atribut berdasarkan offset yang disediakan di fungsi window.scrollBy ().
sumber
Seperti yang disarankan Mark Ryan Sallee, saya menemukan bahwa mengubah ketinggian dan luapan elemen latar belakang saya secara dinamis adalah kuncinya - ini tidak memberi Safari apa pun untuk digulir.
Jadi setelah animasi pembukaan modal selesai, ubah gaya latar belakang:
Saat Anda menutup modal, ubah kembali:
Sementara jawaban lain berguna dalam konteks yang lebih sederhana, DOM saya terlalu rumit (terima kasih SharePoint) untuk menggunakan pertukaran posisi absolut / tetap.
sumber
Rapi? tidak.
Saya baru-baru ini mengalami masalah ini sendiri dengan bidang pencarian tetap di tajuk yang lengket, hal terbaik yang dapat Anda lakukan saat ini adalah menjaga posisi gulir dalam variabel setiap saat dan setelah pemilihan, buatlah posisi elemen tetap absolut alih-alih tetap dengan bagian atas posisi berdasarkan posisi gulir dokumen.
Namun ini sangat jelek dan masih menghasilkan beberapa pengguliran bolak-balik yang aneh sebelum mendarat di tempat yang tepat, tetapi itu yang paling dekat yang bisa saya dapatkan.
Solusi lain apa pun akan melibatkan penggantian mekanisme gulir default browser.
sumber
Belum menangani bug khusus ini, tapi mungkin menaruh overflow: hidden; di badan saat area teks terlihat (atau hanya aktif, bergantung pada desain Anda). Ini mungkin memiliki efek tidak memberikan browser "ke bawah" di mana pun untuk menggulir.
sumber
Solusi yang mungkin adalah mengganti bidang masukan.
codepen
sumber
Tak satu pun dari solusi ini berhasil untuk saya karena DOM saya rumit dan saya memiliki halaman gulir dinamis tak terbatas, jadi saya harus membuatnya sendiri.
Latar Belakang: Saya menggunakan tajuk tetap dan elemen lebih jauh ke bawah yang menempel di bawahnya setelah pengguna menggulir sejauh itu ke bawah. Elemen ini memiliki kolom input pencarian. Selain itu, saya memiliki halaman dinamis yang ditambahkan selama gulir maju dan mundur.
Masalah: Di iOS, setiap kali pengguna mengklik input di elemen tetap, browser akan menggulir hingga ke bagian atas halaman. Ini tidak hanya menyebabkan perilaku yang tidak diinginkan, tetapi juga memicu penambahan halaman dinamis saya di bagian atas halaman.
Solusi yang Diharapkan: Tidak ada scroll di iOS (tidak sama sekali) saat pengguna mengklik input di elemen sticky.
Larutan:
Persyaratan: JQuery seluler diperlukan agar fungsi startroll dan stopscroll berfungsi.
Debounce disertakan untuk memuluskan jeda yang dibuat oleh elemen lengket.
Diuji di iOS10.
sumber
Saya baru saja melompati sesuatu seperti ini kemarin dengan mengatur ketinggian #a ke tinggi maksimum yang terlihat (tinggi badan dalam kasus saya) ketika #b terlihat
ex:
ps: maaf untuk telat contoh, baru sadar itu dibutuhkan.
sumber
Ini sekarang diperbaiki di iOS 10.3!
Peretasan seharusnya tidak lagi dibutuhkan.
sumber
Saya memiliki masalah, di bawah baris kode menyelesaikannya untuk saya -
sumber