Saya ingin membuat Bilah Navigasi tetap di atas setelah saya gulir ke sana, tetapi tidak berfungsi dan saya tidak tahu mengapa. Jika Anda dapat membantu, ini kode HTML dan CSS saya:
.nav-selections {
text-transform: uppercase;
letter-spacing: 5px;
font: 18px "lato",sans-serif;
display: inline-block;
text-decoration: none;
color: white;
padding: 18px;
float: right;
margin-left: 50px;
transition: 1.5s;
}
.nav-selections:hover{
transition: 1.5s;
color: black;
}
ul {
background-color: #B79b58;
overflow: auto;
}
li {
list-style-type: none;
}
<nav style="position: sticky; position: -webkit-sticky;">
<ul align="left">
<li><a href="#/contact" class="nav-selections" style="margin-right:35px;">Contact</a></li>
<li><a href="#/about" class="nav-selections">About</a></li>
<li><a href="#/products" class="nav-selections">Products</a></li>
<li><a href="#" class="nav-selections">Home</a></li>
</ul>
</nav>
html
css
css-position
Harleyoc1
sumber
sumber
position: sticky
dapat berhenti bekerja jika ada di dalam kotak centang kecuali Anda hati-hati dan juga akan gagal jika adaoverflow: hidden
atau dioverflow: auto
antara itu dan apa pun yang bergulir di dalamnya (root tubuh atau leluhur terdekat dengan overflow: gulir)overflow: hidden
danoverflow: auto
! Aku sudah menggaruk-garuk kepalaku selama berhari-hari mencoba menyelesaikan masalah iniJawaban:
Jadi, dalam contoh Anda, Anda harus menentukan posisi di mana ia harus tetap pada akhirnya dengan menggunakan
top
properti.sumber
Periksa apakah elemen leluhur memiliki set overflow (misalnya
overflow:hidden
); coba matikan. Anda mungkin harus naik pohon DOM lebih tinggi dari yang Anda harapkan =).Ini dapat memengaruhi
position:sticky
elemen turunan Anda.sumber
$(stickyElement).parents().css("overflow", "visible")
konsol web akan membantu dan ternyata berhasil. Kemudian saya menemukan orang tua yang jauh denganoverflow:hidden
gaya yang menyebabkan masalah. Saya berharap saya membaca jawaban ini dengan lebih hati-hatioverflow:hidden
, Anda dapat menjalankan skrip ini di konsol browser Anda untuk memeriksa semua orang tua / leluhur dari elemen yang diberikan: gist.github.com/brandonjp/478cf6e32d90ab9cb2cd8cbb0799c7a7Saya memiliki masalah yang sama, dan saya menemukan jawabannya di sini .
Jika elemen Anda tidak lengket seperti yang diharapkan, hal pertama yang harus diperiksa adalah aturan yang diterapkan pada wadah.
Secara khusus, cari properti overflow yang ditetapkan pada induk. Anda tidak dapat menggunakan :
overflow: hidden
,overflow: scroll
atauoverflow: auto
pada orang tua dariposition: sticky
elemen.sumber
Beberapa hal lagi yang saya temui:
Ketika elemen lengket Anda adalah komponen (sudut dll)
Jika elemen 'sticky' itu sendiri adalah komponen dengan pemilih elemen kustom, seperti komponen sudut bernama
<app-menu-bar>
Anda perlu menambahkan berikut ini ke css komponen:atau
Safari di iOS khususnya tampaknya memerlukan
display:block
bahkan pada elemen rootapp-root
aplikasi sudut atau itu tidak akan menempel.Jika Anda membuat komponen dan mendefinisikan css di dalam komponen (bayangan DOM / gaya enkapsulasi), pastikan
position: sticky
sedang diterapkan ke pemilih 'luar' (mis.app-menu-bar
Di devtools harus menunjukkan posisi lengket) dan bukan tingkat atasdiv
dalam komponen. Dengan Angular, ini dapat dicapai dengan:host
pemilih di css untuk komponen Anda.Lain
Jika elemen yang mengikuti elemen lengket Anda memiliki latar belakang yang solid, Anda harus menambahkan yang berikut untuk menghentikannya agar tidak tergelincir di bawahnya:
Elemen lengket Anda harus menjadi yang pertama (sebelum konten Anda) jika menggunakan
top
dan setelah itu jika menggunakanbottom
.Ada komplikasi saat menggunakan
overflow: hidden
elemen pembungkus Anda - secara umum itu akan membunuh elemen lengket di dalamnya. Lebih baik dijelaskan dalam pertanyaan iniPeramban seluler dapat menonaktifkan item yang diposisikan tetap / tetap ketika keyboard pada layar terlihat. Saya tidak yakin dengan aturan yang pasti (apakah ada yang pernah tahu) tetapi ketika keyboard terlihat Anda sedang melihat semacam 'jendela' ke jendela dan Anda tidak akan dapat dengan mudah mendapatkan hal-hal yang melekat pada bagian atas layar yang terlihat.
Pastikan Anda memiliki:
position: sticky;
dan tidak
display: sticky;
Masalah kegunaan yang salah
sumber
display: block
danposition: relative
memicu perilaku yang benar di Safari - apakah itu hanyadisplay: block
diperlukan? Tentu saja mungkin tidak ada salahnya menentukan keduanyadisplay: block
cukupIni adalah kelanjutan dari jawaban dari MarsAndBack dan Miftah Mizwar.
Jawaban mereka benar. Namun, sulit untuk mengidentifikasi masalah leluhur.
Untuk membuatnya sangat sederhana, jalankan skrip jQuery ini di konsol browser Anda dan itu akan memberi tahu Anda nilai properti overflow pada setiap leluhur.
Di mana leluhur tidak perlu
overflow: visible
mengubah CSS-nya sehingga membuatnya!Juga, seperti yang dinyatakan di tempat lain, pastikan elemen lengket Anda memiliki ini di CSS:
sumber
overflow: invisible
.(async function() { let response = await fetch('https://code.jquery.com/jquery-3.3.1.min.js'); let script = await response.text(); eval(script); })();
var p = $0.parentElement; while(p != null) { var ov = getComputedStyle(p).overflow; if(ov !== 'visible') console.warn(ov, p); else console.log(ov, p); p = p.parentElement; }
Dimana$0
adalah elemen terakhir yang dipilih dalam alat pengembang.position: fixed
dan menyesuaikan properti dengan JavaScript. Pertanyaan tidak menyatakan perlunya JavaScript.Saya harus menggunakan CSS berikut untuk membuatnya berfungsi:
Jika dosen di atas tidak bekerja maka ...
Telusuri semua leluhur dan pastikan tidak ada unsur-unsur ini yang memiliki
overflow: hidden
. Anda harus mengubahnya keoverflow: visible
sumber
Jika Anda menemukan ini dan lengket Anda tidak berfungsi - coba setel induk ke:
Bekerja untukku
sumber
display: unset
, yang mungkin tidak selalu dapat segera hidupcontents
,initial
(?) Daninline
Momen lucu yang tidak jelas bagi saya: setidaknya di Chrome 70
position: sticky
tidak berlaku jika Anda menyetelnya menggunakan DevTools.sumber
Sepertinya navbar yang akan ditempel tidak boleh berada di dalam div atau bagian dengan konten lain. Tidak ada solusi yang bekerja untuk saya sampai saya mengambil navbar dari div yang berbagi navbar dengan topbar lain. Saya sebelumnya memiliki topbar dan navbar dibungkus dengan div umum.
sumber
display: unset
, pembatasan ini diangkat! lihat stackoverflow.com/a/60560997/2902367 Tampaknya juga berfungsi dengancontents
,initial
(?) daninline
dari komentar saya:
Ada polyfill untuk digunakan untuk browser lain selain FF dan Chrome. Ini adalah aturan eksperimental yang dapat diimplementasikan atau tidak kapan saja melalui browser. Chrome menambahkannya beberapa tahun yang lalu dan kemudian menjatuhkannya, sepertinya kembali ... tapi untuk berapa lama?
Posisi terdekat adalah posisi: relatif + koordinat yang diperbarui saat menggulir setelah mencapai titik lengket, jika Anda ingin mengubahnya menjadi skrip javascript
sumber
Saya tahu ini sepertinya sudah dijawab, tetapi saya menemukan kasus tertentu, dan saya merasa sebagian besar jawaban tidak tepat.
The
overflow:hidden
jawaban mencakup 90% dari kasus. Itu kurang lebih skenario "lengket nav".Tapi perilaku lengket paling baik digunakan di ketinggian wadah. Pikirkan formulir buletin di kolom kanan situs web Anda yang bergulir ke bawah dengan halaman. Jika elemen lengket Anda adalah satu-satunya anak dari wadah, wadah adalah ukuran yang sama persis, dan tidak ada ruang untuk menggulir.
Wadah Anda harus setinggi yang Anda harapkan dapat digulirkan oleh elemen Anda. Yang dalam skenario "kolom kanan" saya adalah ketinggian kolom kiri. Cara terbaik untuk mencapai ini adalah dengan menggunakan
display:table-cell
kolom. Jika Anda tidak bisa, dan terjebak denganfloat:right
dan seperti saya, Anda harus menebak ketinggian kolom kiri untuk menghitungnya dengan Javascript.sumber
sticky-limit: parent
,sticky-limit: body
atausticky-limit: nth-parent(3)
... Pokoknya: Jika Anda bisa, Anda dapat mengangkat batasan ini dengan mengatur induk pembatasdisplay: unset
, seperti yang tercantum di stackoverflow.com/a/60560997/2902367 . Tampaknya juga bekerja dengancontents
,initial
(?) Daninline
Saya tahu ini adalah pos lama. Tetapi jika ada seseorang seperti saya yang baru saja mulai bermain-main dengan posisi: lengket ini bisa berguna.
Dalam kasus saya, saya menggunakan posisi: sticky sebagai item grid. Itu tidak berfungsi dan masalahnya adalah overflow-x: disembunyikan pada
html
elemen. Segera setelah saya menghapus properti itu berfungsi dengan baik. Memiliki overflow-x: disembunyikan padabody
elemen tampaknya bekerja dengan baik, tidak tahu mengapasumber
dua jawaban di sini:
hapus
overflow
properti daribody
tagdiatur
height: 100%
kebody
untuk memperbaiki masalah denganoverflow-y: auto
sumber
Saya percaya artikel ini mengatakan banyak tentang cara
sticky
kerjanyasumber
Perilaku nyata dari elemen lengket adalah:
Elemen yang diposisikan dengan lengket diperlakukan sebagai posisi yang relatif sampai blok yang mengandung melintasi ambang yang ditentukan (seperti pengaturan atas ke nilai selain otomatis) dalam akar alirannya (atau wadah yang digulirkan di dalamnya), di mana titik itu diperlakukan sebagai "macet" "Sampai bertemu ujung berlawanan dari blok yang mengandungnya.
Elemen diposisikan sesuai dengan aliran normal dokumen, dan kemudian diimbangi relatif terhadap leluhur gulir terdekat dan berisi blok (leluhur tingkat blok terdekat), termasuk elemen terkait tabel, berdasarkan nilai atas, kanan, bawah, dan pergi. Offset tidak mempengaruhi posisi elemen lainnya.
Nilai ini selalu menciptakan konteks susun baru. Perhatikan bahwa elemen lengket "menempel" ke leluhur terdekatnya yang memiliki "mekanisme gulir" (dibuat ketika limpahan disembunyikan, gulir, otomatis, atau overlay), bahkan jika leluhur itu bukan leluhur terdekat yang benar-benar menggulir.
Contoh ini akan membantu Anda memahami:
code
https://codepen.io/darylljann/pen/PpjwPMsumber
jika perbaikan danday74 tidak berfungsi, periksa apakah elemen induk memiliki ketinggian.
Dalam kasus saya, saya memiliki dua anak, satu mengambang ke kiri dan satu lagi mengambang kanan. Saya ingin yang mengapung yang tepat menjadi lengket tetapi harus menambahkan
<div style="clear: both;"></div>
di ujung induk, untuk memberikan ketinggian.sumber
float:left
ke elemen induk (tanpa mengapung tingginya adalah 0) danposition:sticky
berhasil.Saya menggunakan solusi JS. Ini bekerja di Firefox dan Chrome. Ada masalah, beri tahu saya.
html
css
js
sumber
z-index
juga sangat penting. Kadang-kadang itu akan berhasil tetapi Anda tidak akan melihatnya. Coba atur ke angka yang sangat tinggi hanya untuk memastikan. Juga tidak selalu menempatkantop: 0
tetapi mencoba sesuatu yang lebih tinggi jika tersembunyi di suatu tempat (di bawah toolbar)sumber
Inilah yang membuat saya tersandung ... div lengket saya ada di dalam div lain sehingga div induk perlu beberapa konten tambahan SETELAH div lengket, untuk membuat div induk "cukup tinggi" untuk lengket div untuk "geser" konten lainnya sebagai Anda gulir ke bawah.
Jadi dalam kasus saya, tepat setelah div lengket, saya harus menambahkan:
(Aplikasi saya memiliki dua div berdampingan, dengan gambar "tinggi" di sebelah kiri, dan formulir entri data pendek di sebelah kanan, dan saya ingin formulir entri data melayang di sebelah gambar saat Anda menggulir ke bawah, jadi formulir selalu di layar. Itu tidak akan berfungsi sampai saya menambahkan "konten ekstra" di atas sehingga div lengket memiliki sesuatu untuk "meluncur"
sumber
BENAR bahwa
overflow
kebutuhan untuk dihapus atau diaturinitial
untuk membuatposition: sticky
karya pada elemen anak. Saya menggunakan Desain Material di aplikasi Angular saya dan menemukan bahwa beberapa komponen Material mengubahoverflow
nilainya. Perbaikan untuk skenario saya adalahsumber