Saya memiliki masalah yang sangat aneh ... di setiap browser dan versi seluler yang saya temui perilaku ini:
- semua browser memiliki menu teratas ketika Anda memuat halaman (menunjukkan bilah alamat misalnya) yang meluncur ke atas ketika Anda mulai menggulir halaman.
- 100vh kadang - kadang dihitung hanya pada bagian yang terlihat dari viewport, jadi ketika bilah browser geser ke atas 100vh meningkat (dalam hal piksel)
- semua tata letak ulang cat dan sesuaikan kembali karena dimensi telah berubah
- efek gelisah yang buruk untuk pengalaman pengguna
Bagaimana bisa menghindari masalah ini? Ketika saya pertama kali mendengar tentang viewport-height saya sangat senang dan saya pikir saya bisa menggunakannya untuk blok ketinggian tetap daripada menggunakan javascript, tapi sekarang saya pikir satu-satunya cara untuk melakukan itu sebenarnya javascript dengan beberapa acara ukuran ...
Anda dapat melihat masalahnya di: situs sampel
Adakah yang bisa membantu saya dengan / menyarankan solusi CSS?
kode tes sederhana:
html
css
viewport-units
Nereo Costacurta
sumber
sumber
transition: 0.5s
, agar perubahannya tidak tiba-tiba?Jawaban:
Sayangnya ini disengaja ...
Ini adalah masalah yang diketahui (setidaknya dalam safari mobile), yang disengaja, karena mencegah masalah lain. Benjamin Poulain membalas bug webkit :
Nicolas Hoizey telah meneliti ini sedikit: https://nicolas-hoizey.com/2015/02/viewport-height-is-taller-than-the-visible-part-of-the-document-in-some-mobile -browsers.html
Tidak ada perbaikan yang direncanakan
Pada titik ini, tidak banyak yang dapat Anda lakukan kecuali menahan diri dari menggunakan ketinggian viewport pada perangkat seluler. Chrome juga berubah menjadi ini di 2016:
sumber
$(window).height()
tidak terpengaruh oleh bug ini, jadi saya akan pergi ke sana. Terima kasih!position:fixed
. Ini mirip dengan implementasi di Safari. Baca selengkapnya: developers.google.com/web/updates/2016/12/url-bar-resizingvh
atau<html> 100%
tinggi setelah memuat awal. Ini sebenarnya bagus - karena tata letak meronta / reflow ketika URL Bar menyembunyikannya bisa terlihat mengerikan.Firefox
danEdge
Mobile
masih secara dinamis memperbaruivh
dan<html>
tinggi, menyebabkan banyak sobek dan mengubah ukuran semua komponen saat menggulir, terutama buruk jika menggunakan SVG untuk gambar latar belakangAnda dapat mencoba
min-height: -webkit-fill-available;
di css bukan100vh
. Itu harus dipecahkansumber
min-height: 100vh;
sebagai mundur di mana-webkit-fill-available
tidak didukung.min-height: 100vh;
di sana karena kalau tidak akan merusak browser seperti Firefox (setidaknya di desktop, iOS menggunakan webkit tidak peduli apa pun browser).dalam aplikasi saya, saya melakukannya seperti itu (naskah dan kode pos bersarang, jadi ubah kode sesuai):
di css Anda:
ini berfungsi setidaknya pada ponsel chrome dan ipad. Yang tidak berfungsi adalah ketika Anda menambahkan aplikasi ke homescreen di iOS dan mengubah orientasi beberapa kali - entah bagaimana tingkat zoom mengacaukan nilai innerHeight, saya mungkin memposting pembaruan jika saya menemukan solusi untuk itu.
Demo
sumber
Untuk banyak situs yang saya bangun, klien akan meminta spanduk 100vh dan seperti yang Anda temukan, itu menghasilkan pengalaman "gelisah" yang buruk di ponsel saat Anda mulai menggulir. Inilah cara saya memecahkan masalah untuk pengalaman konsisten yang mulus di semua perangkat:
Saya pertama-tama mengatur CSS elemen banner saya
height:100vh
Lalu saya menggunakan jQuery untuk mendapatkan ketinggian dalam piksel elemen banner saya dan menerapkan gaya inline menggunakan ketinggian ini.
Melakukan hal ini memecahkan masalah pada perangkat seluler seperti ketika halaman dimuat, elemen spanduk diatur ke 100vh menggunakan CSS dan kemudian jQuery mengesampingkan ini dengan meletakkan CSS sebaris pada elemen spanduk saya yang menghentikannya mengubah ukuran ketika pengguna mulai menggulir.
Namun, pada desktop jika pengguna mengubah ukuran jendela browser mereka, elemen banner saya tidak akan mengubah ukuran karena sekarang memiliki ketinggian yang ditetapkan dalam piksel karena jQuery di atas. Untuk mengatasinya, saya menggunakan Deteksi Seluler untuk menambahkan kelas 'seluler' ke badan dokumen saya. Dan kemudian saya bungkus jQuery di atas dalam pernyataan if:
Akibatnya, jika pengguna menggunakan perangkat seluler, kelas 'seluler' ada di badan laman saya dan jQuery di atas dijalankan. Jadi elemen spanduk saya hanya akan menerapkan CSS sebaris di perangkat seluler sementara di desktop aturan CSS 100vh asli tetap berlaku.
sumber
$('.banner').css({ height: window.innerHeight });
, yang merupakan "nyata" ketinggian viewport. Contoh bagaimana innerHeight bekerjadocument.querySelector('.banner').style.height = window.innerHeight;
untuk orang yang menulis JavaScript yang sebenarnya.Lihat jawaban ini: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/
sumber
Saya datang dengan komponen Bereaksi - memeriksanya jika Anda menggunakan Bereaksi atau menelusuri kode sumber jika Anda tidak, sehingga Anda dapat menyesuaikannya dengan lingkungan Anda.
Ini mengatur tinggi div layar penuh untuk
window.innerHeight
dan kemudian memperbaruinya pada ukuran jendela.sumber
Ketika saya mencari solusi beberapa hari, inilah milik saya untuk semua orang yang menggunakan VueJS dengan Vuetify (solusi saya menggunakan v-app-bar, v-navigation-drawer dan v-footer): Saya membuat App.scss (digunakan di App. vue) dengan konten berikut:
sumber
Bagi saya trik seperti itu berhasil:
sumber
@nils menjelaskannya dengan jelas.
Lalu apa selanjutnya?
Saya baru saja kembali menggunakan relatif 'klasik'
%
(persentase) di CSS.Sering kali lebih banyak upaya untuk mengimplementasikan sesuatu daripada yang akan digunakan
vh
, tetapi setidaknya, Anda memiliki solusi yang cukup stabil yang bekerja di berbagai perangkat dan browser tanpa gangguan UI yang aneh.sumber
Saya baru saja menemukan aplikasi web yang saya rancang memiliki masalah ini dengan iPhone dan iPad, dan menemukan artikel yang menyarankan untuk menyelesaikannya menggunakan kueri media yang ditargetkan pada perangkat Apple tertentu.
Saya tidak tahu apakah saya dapat membagikan kode dari artikel itu di sini, tetapi alamatnya adalah ini: http://webdesignerwall.com/tutorials/css-fix-for-ios-vh-unit-bug
Mengutip artikel: "hanya cocokkan tinggi elemen dengan tinggi perangkat menggunakan kueri media yang menargetkan versi iPhone dan iPad resolusi lama."
Mereka menambahkan hanya 6 permintaan media untuk mengadaptasi elemen ketinggian penuh, dan itu harus berfungsi karena sepenuhnya diterapkan CSS.
Sunting tertunda: Saya tidak dapat mengujinya sekarang, tetapi saya akan kembali dan melaporkan hasil saya.
sumber
Karena saya baru, saya tidak dapat mengomentari jawaban lain.
Jika seseorang mencari jawaban untuk membuat ini berfungsi (dan dapat menggunakan javascript - karena tampaknya diperlukan untuk membuat ini berfungsi saat ini) pendekatan ini telah bekerja cukup baik untuk saya dan itu juga bertanggung jawab atas perubahan orientasi seluler. Saya menggunakan Jquery untuk kode contoh tetapi harus bisa dilakukan dengan vanillaJS.
-Pertama, saya menggunakan skrip untuk mendeteksi apakah perangkat itu menyentuh atau membawa. Contoh tanpa tulang:
Ini menambahkan kelas ke elemen tubuh sesuai dengan jenis perangkat (hover atau sentuh) yang dapat digunakan nanti untuk skrip ketinggian.
-Selanjutnya gunakan kode ini untuk mengatur ketinggian perangkat saat memuat dan perubahan orientasi:
-Timeout diatur sehingga perangkat akan menghitung ketinggian baru dengan benar pada perubahan orientasi. Jika tidak ada waktu habis, menurut pengalaman saya ketinggiannya tidak akan benar. 500 ms mungkin berlebihan tetapi telah bekerja untuk saya.
-100vh pada hover-devices adalah fallback jika browser menimpa CSS 100vh.
sumber
Kode berikut menyelesaikan masalah (dengan jQuery).
Dan elemen lainnya digunakan
%
sebagai unit untuk menggantikanvh
.sumber
Ini pekerjaan yang saya gunakan untuk aplikasi Bereaksi saya.
iPhone 11 Pro & iPhone Pro Max - 120px
iPhone 8 - 80px
Ini kompromi tetapi perbaikan yang relatif sederhana
sumber
Berikut ini bekerja untuk saya:
The
body
akan mengambil ketinggian viewport terlihat dan#your-app-container
denganheight: 100%
akan membuat wadah mengambil ketinggian viewport terlihat.sumber
Semoga, ini akan menjadi variabel lingkungan CSS yang terdefinisi UA seperti yang disarankan di sini: https://github.com/w3c/csswg-drafts/issues/2630#issuecomment-397536046
sumber
Karena itu tidak akan diperbaiki, Anda dapat melakukan sesuatu seperti:
Bagi saya itu adalah solusi tercepat dan lebih murni daripada bermain dengan JavaScript yang tidak dapat berfungsi pada banyak perangkat dan browser.
Cukup gunakan nilai yang tepat
vh
yang sesuai dengan kebutuhan Anda.sumber
Menggunakan vh pada perangkat seluler tidak akan berfungsi dengan 100vh, karena pilihan desain mereka menggunakan seluruh ketinggian perangkat tidak termasuk bilah alamat dll.
Jika Anda mencari tata letak termasuk ketinggian div sebanding dengan ketinggian tampilan sebenarnya, saya menggunakan solusi css murni berikut:
Anda memiliki dua opsi untuk mengatur ketinggian viewport, secara manual mengatur --devHeight ke ketinggian yang berfungsi (tetapi Anda harus memasukkan nilai ini untuk setiap jenis perangkat yang Anda kodekan)
atau
Gunakan javascript untuk mendapatkan ketinggian jendela dan kemudian perbarui --devheight tentang memuat dan menyegarkan viewport (namun ini memang mengharuskan menggunakan javascript dan bukan solusi css murni)
Setelah Anda mendapatkan ketinggian tampilan yang benar, Anda dapat membuat beberapa div pada persentase yang tepat dari total tinggi viewport dengan hanya mengubah pengali di setiap div yang Anda tetapkan ketinggiannya.
0,10 = 10% tinggi tampilan 0,57 = 57% tinggi tampilan
Semoga ini bisa membantu seseorang;)
sumber
Anda dapat melakukan ini dengan menambahkan skrip dan gaya berikut
Gaya
sumber
Cobalah
html, body { height: 100% }
sesuatu dengan efek 100vh pada perangkat seluler.sumber
Anda dapat mencoba memberikan
position: fixed; top: 0; bottom: 0;
properti ke wadah Anda.sumber