Saat ini saya sedang mengembangkan situs responsif menggunakan Bootstrap Twitter.
Situs ini memiliki gambar latar belakang layar penuh di ponsel / tablet / desktop. Gambar-gambar ini berputar dan memudar melalui masing-masing, menggunakan dua div.
Hampir sempurna, kecuali satu masalah. Menggunakan iOS Safari, Browser Android atau Chrome di Android latar belakang sedikit melompat ketika pengguna menggulir ke bawah halaman dan menyebabkan bilah alamat bersembunyi.
Situsnya ada di sini: http://lt2.daveclarke.me/
Kunjungi di perangkat seluler dan gulir ke bawah dan Anda akan melihat ukuran gambar / pindahkan.
Kode yang saya gunakan untuk DIV latar belakang adalah sebagai berikut:
#bg1 {
background-color: #3d3d3f;
background-repeat:no-repeat;
background-attachment:fixed;
background-position:center center;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover; position:fixed;
width:100%;
height:100%;
left:0px;
top:0px;
z-index:-1;
display:none;
}
Semua saran diterima - ini sudah cukup lama saya lakukan !!
position: fixed
.Jawaban:
Masalah ini disebabkan oleh bilah URL menyusut / meluncur keluar dari jalan dan mengubah ukuran div # bg1 dan # bg2 karena mereka 100% tinggi dan "tetap". Karena gambar latar diatur ke "cover", gambar akan menyesuaikan ukuran / posisi gambar karena area yang mengandung lebih besar.
Berdasarkan sifat responsif situs, latar belakang harus diukur. Saya menghibur dua solusi yang mungkin:
1) Atur # bg1, # bg2 tinggi ke 100vh. Secara teori, ini solusi yang elegan. Namun, iOS memiliki vh bug ( http://thatemil.com/blog/2013/06/13/viewport-relative-unit-strangeness-in-ios-6/ ). Saya mencoba menggunakan ketinggian max untuk mencegah masalah, tetapi tetap saja.
2) Ukuran viewport, ketika ditentukan oleh Javascript, tidak terpengaruh oleh bilah URL. Oleh karena itu, Javascript dapat digunakan untuk mengatur ketinggian statis pada # bg1 dan # bg2 berdasarkan ukuran viewport. Ini bukan solusi terbaik karena ini bukan CSS murni dan ada sedikit lompatan gambar pada pemuatan halaman. Namun, ini adalah satu-satunya solusi yang saya lihat mengingat bug "vh" iOS (yang tampaknya tidak diperbaiki di iOS 7).
Di samping catatan, saya telah melihat begitu banyak masalah dengan bilah ukuran URL ini di iOS dan Android. Saya mengerti tujuannya, tetapi mereka benar-benar perlu memikirkan fungsionalitas aneh dan malapetaka yang mereka bawa ke situs web. Perubahan terbaru, adalah Anda tidak lagi dapat "menyembunyikan" bilah URL saat memuat halaman di iOS atau Chrome menggunakan trik gulir.
EDIT: Meskipun skrip di atas berfungsi dengan baik untuk menjaga ukuran latar belakang, itu menyebabkan jeda ketika pengguna menggulir ke bawah. Ini karena menjaga ukuran latar belakang hingga 100% dari tinggi layar dikurangi bilah URL. Jika kita menambahkan 60px ke ketinggian, seperti yang disarankan swiss, masalah ini hilang. Itu berarti kita tidak bisa melihat 60px bawah gambar latar belakang ketika URL bar hadir, tetapi itu mencegah pengguna dari pernah melihat celah.
sumber
bg.height(jQuery(window).height() + 60);
yang bekerja dengan indah di semua perangkat saya! Terima kasih :)vh
unit dan tentu saja100vh
lebih besar ketika bilah alamat disembunyikan. Sungguh bodoh bahwa lompatan ini terjadi setelah scrolling berhenti. Itu hanya terlihat buggy. Saya akhirnya menggunakan transisi pada ketinggian untuk membuatnya tampak disengaja.body
ke pembungkus yang<div>
membungkus seluruh isi halaman. Tidak ada latar belakang melompat di iOS atau Android!Saya menemukan bahwa jawaban Jason tidak bekerja untuk saya dan saya masih mendapatkan lompatan. Javascript memastikan tidak ada celah di bagian atas halaman tetapi latar belakang masih melompat setiap kali bilah alamat menghilang / muncul kembali. Jadi seperti halnya memperbaiki Javascript, saya melamar
transition: height 999999s
ke div. Ini menciptakan transisi dengan durasi yang sangat lama sehingga hampir membekukan elemen.sumber
vw
atauvh
untuk mengatur ukuran font di dalam wadah induk itu.Saya punya masalah serupa di tajuk situs web kami.
Ini akan berakhir dalam pengalaman gulir yang gelisah pada android chrome, karena .header-container akan kembali skala setelah bar-url bersembunyi dan jari dihapus dari layar.
Solusi-CSS:
Menambahkan dua baris berikut, akan mencegah bahwa bar-url menyembunyikan dan pengguliran vertikal masih dimungkinkan:
sumber
Masalahnya dapat diselesaikan dengan kueri media dan beberapa matematika. Inilah solusi untuk orientasi portait:
Karena vh akan berubah ketika bilah url menghilang, Anda harus menentukan ketinggian dengan cara lain. Untungnya, lebar viewport konstan dan perangkat seluler hanya memiliki beberapa rasio aspek yang berbeda; jika Anda dapat menentukan lebar dan rasio aspek, sedikit matematika akan memberi Anda ketinggian viewport persis seperti yang seharusnya bekerja. Inilah prosesnya
1) Buat serangkaian kueri media untuk rasio aspek yang ingin Anda targetkan.
gunakan rasio aspek-perangkat alih-alih rasio aspek karena yang terakhir akan mengubah ukuran ketika bilah url menghilang
Saya menambahkan 'max' ke rasio aspek-perangkat untuk menargetkan setiap rasio aspek yang terjadi di antara yang paling populer. Mereka tidak akan setepat itu, tetapi mereka hanya akan untuk sebagian kecil pengguna dan masih akan cukup dekat dengan vh yang tepat.
ingat kueri media menggunakan horisontal / vertikal, jadi untuk portait Anda perlu membalik angka
2) untuk setiap kueri media, gandakan persentase tinggi vertikal apa pun yang Anda inginkan elemen di dalam dengan kebalikan dari rasio aspek.
3) Anda harus menentukan tinggi bar url, dan kemudian minusnya dari ketinggian. Saya belum menemukan pengukuran yang tepat, tetapi saya menggunakan 9% untuk perangkat seluler dalam lanskap dan itu tampaknya bekerja cukup baik.
Ini bukan solusi yang sangat elegan, tetapi opsi lain juga tidak terlalu bagus, mengingat mereka adalah:
Membuat situs web Anda terlihat bermasalah bagi pengguna,
memiliki elemen berukuran tidak tepat, atau
Menggunakan javascript untuk beberapa gaya dasar ,
Kekurangannya adalah beberapa perangkat mungkin memiliki ketinggian url bar berbeda atau rasio aspek dari yang paling populer. Namun, menggunakan metode ini jika hanya sejumlah kecil perangkat mengalami penambahan / pengurangan beberapa piksel, yang tampaknya jauh lebih baik bagi saya daripada semua orang yang memiliki ukuran situs web ketika menggesek.
Untuk membuatnya lebih mudah, saya juga membuat mixin SASS:
sumber
@mixin vh-fix($vh: 100)
=>height: calc(100vw * (1.333 * $vh / 100) - 9%)
height: calc(100vw * (1.333 * #{$vh} / 100) - 9%)
-9%
.Semua jawaban di sini menggunakan
window
tinggi, yang dipengaruhi oleh bilah URL. Apakah semua orang lupa tentangscreen
ketinggian?Inilah solusi jQuery saya:
Menambahkan
.css()
bagian adalah mengubah elemen posisi absolut tak terhindarkan atas atas ke bawah, sehingga tidak ada lompatan sama sekali. Meskipun, saya kira tidak ada alasan untuk tidak langsung menambahkannya ke CSS normal.Kami membutuhkan sniffer agen pengguna karena ketinggian layar di desktop tidak akan membantu.
Juga, ini semua mengasumsikan
#background
adalah elemen posisi tetap mengisi jendela.Untuk pemurni JavaScript (peringatan - belum teruji):
EDIT: Maaf ini tidak langsung menjawab masalah spesifik Anda dengan lebih dari satu latar belakang. Tapi ini adalah salah satu hasil pertama ketika mencari masalah latar belakang tetap melompat di ponsel.
sumber
Saya mengalami masalah ini juga ketika saya mencoba untuk membuat layar masuk yang akan menutupi seluruh viewport. Sayangnya, jawaban yang diterima tidak lagi berfungsi.
1) Elemen dengan ketinggian yang disetel untuk
100vh
diubah ukurannya setiap kali ukuran viewport berubah, termasuk kasus-kasus ketika itu disebabkan oleh (dis) muncul bilah URL.2)
$(window).height()
mengembalikan nilai juga dipengaruhi oleh ukuran bilah URL.Salah satu solusinya adalah "membekukan" elemen menggunakan
transition: height 999999s
seperti yang disarankan dalam jawaban oleh AlexKempton . Kerugiannya adalah ini secara efektif menonaktifkan adaptasi untuk semua perubahan ukuran viewport, termasuk yang disebabkan oleh rotasi layar.Jadi solusi saya adalah mengelola perubahan viewport secara manual menggunakan JavaScript. Itu memungkinkan saya untuk mengabaikan perubahan kecil yang kemungkinan disebabkan oleh bilah URL dan hanya bereaksi pada yang besar.
EDIT: Saya benar-benar menggunakan teknik ini bersama dengan
height: 100vh
. Halaman ini ditampilkan dengan benar dari awal dan kemudian javascript menendang dan mulai mengelola ketinggian secara manual. Dengan cara ini tidak ada berkedip sama sekali saat halaman sedang memuat (atau bahkan sesudahnya).sumber
height: 100vh
dalam CSS awal, saya mengaturmin-height:100vh
dan kemudian pada ukuran jendela saya menghitungmin-height
dan mengaturnya ke ketinggian view-port. Ini berguna ketika situs Anda dilihat pada layar kecil dan konten terlalu besar untuk muat di viewport. SetTimeout debounce / throttle pada acara pengubahan ukuran membantu meningkatkan kinerja pada beberapa browser (pengubahan ukuran cenderung sering terjadi)min-height
tetapi kemudian saya mengalami masalah ketika saya perlu memusatkan konten batin secara vertikal. Entah bagaimana pemusatan vertikal bisa menjadi rumit ketika elemen luar telahheight
diatur keauto
. Jadi saya datang dengan ketinggian minimum tetap yang seharusnya cukup untuk memuat segala jenis konten yang mungkin dan mengaturnya di CSS awal. Karenamin-height
memiliki prioritas lebih tinggi daripadaheight
, itu berfungsi dengan cukup baik.display: table
dan kemudian mengatur wadah internaldisplay: table-cell
denganvertical-align: middle
. Bekerja seperti pesona.Solusi Saat ini saya menggunakan adalah untuk memeriksa
userAgent
di$(document).ready
untuk melihat apakah itu salah satu browser menyinggung. Jika ya, ikuti langkah-langkah ini:$(window).resize
, hanya perbarui nilai ketinggian yang relevan jika dimensi viewport horizontal baru berbeda dari nilai awalnyaSecara opsional, Anda juga dapat menguji izin untuk mengubah ukuran vertikal hanya ketika mereka melampaui ketinggian bilah alamat.
Oh, dan bilah alamat tidak memengaruhi
$(window).height
. Lihat: bilah alamat browser Webkit Mobile (chrome) mengubah $ (window) .height (); membuat ukuran latar belakang: tutup kembali skala setiap kali JS "Window" lebar-tinggi vs "layar" lebar-tinggi?sumber
Saya menemukan solusi yang sangat mudah tanpa menggunakan Javascript:
Yang dilakukan adalah menunda gerakan sehingga sangat lambat sehingga tidak terlihat.
sumber
100%
,100vh
. IE8 adalah satu-satunya browser utama yang tidak mendukung transisi.Solusi saya melibatkan sedikit javascript. Simpan 100% atau 100vh pada div (ini akan menghindari div tidak muncul pada pemuatan halaman awal). Kemudian ketika halaman dimuat, ambil tinggi jendela dan terapkan pada elemen yang dimaksud. Hindari lompatan karena sekarang Anda memiliki ketinggian statis pada div Anda.
sumber
Saya membuat solusi javascript vanilla untuk menggunakan unit VH. Menggunakan VH hampir di mana saja dipengaruhi oleh address bar yang meminimalkan scroll. Untuk memperbaiki jank yang menunjukkan kapan halaman digambar ulang, saya punya js ini di sini yang akan mengambil semua elemen Anda menggunakan unit VH (jika Anda memberi mereka kelas
.vh-fix
), dan memberi mereka ketinggian pixel inline. Pada dasarnya membekukan mereka pada ketinggian yang kita inginkan. Anda bisa melakukan ini secara rotasi atau mengubah ukuran viewport agar tetap responsif.Ini telah menyelesaikan semua kasus penggunaan saya, semoga membantu.
sumber
ini solusi saya untuk mengatasi masalah ini, saya telah menambahkan komentar langsung pada kode. Saya telah menguji solusi ini dan berfungsi dengan baik. Semoga kita akan bermanfaat karena setiap orang memiliki masalah yang sama.
sumber
Ini adalah solusi terbaik (paling sederhana) di atas semua yang saya coba.
... Dan ini tidak menyimpan pengalaman asli bilah alamat !
Anda dapat mengatur ketinggian dengan CSS menjadi 100% misalnya, dan kemudian mengatur ketinggian ke 0,9 * tinggi jendela dalam px dengan javascript, ketika dokumen dimuat.
Misalnya dengan jQuery:
$("#element").css("height", 0.9*$(window).height());
)
Sayangnya tidak ada apa pun yang bekerja dengan CSS murni: P tetapi juga minfull itu
vh
danvw
buggy di iPhone - gunakan persentase.sumber
Saya mengatur elemen lebar saya, dengan javascript. Setelah saya mengatur de vh.
html
css
javascript
Ini bekerja untuk saya. Saya tidak menggunakan jquery dll. karena saya ingin memuat secepat mungkin.
sumber
Butuh beberapa jam untuk memahami semua detail masalah ini dan mencari tahu penerapan terbaiknya. Ternyata per April 2016 hanya iOS Chrome yang memiliki masalah ini. Saya mencoba di Android Chrome dan iOS Safari - keduanya baik-baik saja tanpa perbaikan ini. Jadi perbaikan untuk iOS Chrome yang saya gunakan adalah:
sumber
Jawaban sederhana jika latar belakang Anda memungkinkan, mengapa tidak mengatur ukuran latar belakang: untuk sesuatu yang hanya menutupi lebar perangkat dengan kueri media dan gunakan di samping: setelah posisi: tetap; retas di sini .
IE: ukuran latar: 901px; untuk layar apa saja <900px? Tidak sempurna atau responsif tetapi berhasil membuat saya tertarik pada ponsel <480px karena saya menggunakan BG abstrak.
sumber
Saya menggunakan solusi ini: Perbaiki tinggi bg1 pada pemuatan halaman dengan:
Kemudian lampirkan pendengar acara ukuran ke Window yang melakukan ini: jika perbedaan ketinggian setelah mengubah ukuran kurang dari 60px (apa pun lebih dari tinggi url bar) maka jangan lakukan apa pun dan jika lebih besar dari 60px maka atur tinggi bg1 lagi ke tinggi induknya! kode lengkap:
PS: Bug ini sangat menjengkelkan!
sumber
Mirip dengan jawaban @AlexKempton. (tidak bisa berkomentar maaf)
Saya telah menggunakan penundaan transisi yang lama untuk mencegah pengubahan ukuran elemen.
misalnya:
Pengorbanannya adalah ini mencegah perubahan ukuran elemen termasuk pada perputaran perangkat, namun, Anda dapat menggunakan beberapa JS untuk mendeteksi
orientationchange
dan mengatur ulang ketinggian jika ini merupakan masalah.sumber
Bagi mereka yang ingin mendengarkan ketinggian bagian dalam aktual dan gulir vertikal jendela saat browser seluler Chrome mentransisikan bilah URL dari yang ditampilkan ke tersembunyi dan sebaliknya, satu-satunya solusi yang saya temukan adalah mengatur fungsi interval, dan mengukur perbedaan
window.innerHeight
dengan nilai sebelumnya.Ini memperkenalkan kode ini:
Saya harap ini berguna. Adakah yang tahu solusi yang lebih baik?
sumber
Solusi yang saya temukan ketika mengalami masalah serupa adalah mengatur ketinggian elemen
window.innerHeight
setiap kalitouchmove
peristiwa dipecat.Hal ini membuat rentang elemen tepat 100% dari layar yang tersedia setiap saat, tidak lebih dan tidak kurang. Bahkan selama bilah alamat bersembunyi atau ditampilkan.
Namun sayang sekali kita harus menemukan tambalan semacam itu, di mana cara sederhana
position: fixed
seharusnya berhasil.sumber
Dengan dukungan properti khusus CSS (variabel) di iOS, Anda dapat mengatur ini dengan JS dan menggunakannya hanya di iOS.
sumber
Jawaban saya adalah untuk semua orang yang datang ke sini (seperti yang saya lakukan) untuk menemukan jawaban untuk bug yang disebabkan oleh antarmuka persembunyian bare / browser.
Bilah alamat penyembunyian menyebabkan peristiwa pengubahan ukuran memicu. Tetapi berbeda dari peristiwa pengubahan ukuran lainnya, seperti beralih ke mode lansekap, ini tidak mengubah lebar jendela. Jadi solusi saya adalah untuk menghubungkan ke acara pengubahan ukuran dan memeriksa apakah lebarnya sama.
sumber