position: sticky berfungsi di beberapa browser seluler sekarang, jadi Anda dapat membuat bilah menu menggulir dengan laman tetapi kemudian tetap berada di bagian atas area pandang setiap kali pengguna menggulir melewatinya.
Tetapi bagaimana jika Anda ingin sedikit mengubah gaya bilah menu lengket Anda setiap kali saat ini 'menempel'? misalnya, Anda mungkin ingin bilah memiliki sudut membulat setiap kali bergulir dengan halaman, tetapi segera setelah bilah menempel di bagian atas viewport, Anda ingin menyingkirkan sudut membulat atas, dan menambahkan sedikit bayangan di bawahnya Itu.
Apakah ada jenis pseudoselector (misalnya ::stuck
) untuk menargetkan elemen yang telah position: sticky
dan saat ini melekat? Atau apakah vendor browser memiliki hal seperti ini yang sedang direncanakan? Jika tidak, kemana saya akan memintanya?
NB. solusi javascript tidak baik untuk ini karena di seluler Anda biasanya hanya mendapatkan satu scroll
peristiwa ketika pengguna melepaskan jarinya, jadi JS tidak dapat mengetahui saat yang tepat saat ambang batas gulir dilewati.
sumber
position
properti pada:stuck
pemilih harus diabaikan? (aturan untuk vendor browser yang saya maksud, mirip dengan aturan tentang bagaimanaleft
mendahulukan,right
dll.)):stuck
yang mengubahtop
nilainya dari0
menjadi300px
, lalu gulir ke bawah150px
... apakah itu melekat atau tidak? Atau pikirkan tentang elemen denganposition: sticky
dan dibottom: 0
mana:stuck
mungkin berubahfont-size
dan oleh karena itu ukuran elemen (oleh karena itu mengubah momen di mana ia harus menempel) ...while
siklus dirancang dengan buruk karena memungkinkan putaran tanpa akhir :) Namun terima kasih telah menyelesaikannya;)Dalam beberapa kasus, yang sederhana
IntersectionObserver
dapat melakukan trik, jika situasinya memungkinkan untuk menempel pada satu atau dua piksel di luar wadah akarnya, daripada disiram dengan benar. Dengan cara itu ketika ia berada tepat di luar tepi, pengamat menembak dan kami pergi dan berlari.Tempelkan elemen keluar dari wadahnya dengan
top: -2px
, lalu targetkan melaluistuck
atribut ...Contoh di sini: https://codepen.io/anon/pen/vqyQEK
sumber
stuck
kelas akan lebih baik daripada atribut khusus ... Apakah ada alasan khusus untuk pilihan Anda?padding-top: 60px
dalam kasus Anda :)Seseorang di blog Google Developers mengklaim telah menemukan solusi berbasis JavaScript yang performatif dengan IntersectionObserver .
Bit kode yang relevan di sini:
Saya sendiri belum mereplikasi, tetapi mungkin itu membantu seseorang tersandung pada pertanyaan ini.
sumber
Bukan penggemar menggunakan js hacks untuk hal-hal styling (yaitu getBoudingClientRect, scroll listening, resize listening), tapi begitulah cara saya memecahkan masalah saat ini. Solusi ini akan memiliki masalah dengan laman yang memiliki konten yang dapat diminimalkan / dimaksimalkan (<detail>), atau pengguliran bersarang, atau benar-benar bola kurva apa pun. Karena itu, ini adalah solusi sederhana ketika masalahnya juga sederhana.
sumber
if (requestedFrame) { return; }
Ini bukan "pembunuh kinerja" karena pengelompokan bingkai animasi. Intersection Observer masih merupakan perbaikan.Cara ringkas saat Anda memiliki elemen di atas
position:sticky
elemen. Ini menetapkan atributstuck
yang dapat Anda cocokkan dengan CSSheader[stuck]
:HTML:
JS:
sumber