Saya menggunakan ScrollIntoView () untuk menggulir item yang disorot dalam daftar ke tampilan. Ketika saya menggulir ke bawah ScrollIntoView (false) bekerja dengan sempurna. Tetapi ketika saya menggulir ke atas, ScrollIntoView (true) menyebabkan seluruh halaman bergerak sedikit yang menurut saya memang dimaksudkan. Apakah ada cara untuk menghindari pemindahan seluruh halaman saat menggunakan ScrollIntoView (true)?
Ini adalah struktur halaman saya -
#listOfDivs {
position:fixed;
top:100px;
width: 300px;
height: 300px;
overflow-y: scroll;
}
<div="container">
<div="content">
<div id="listOfDivs">
<div id="item1"> </div>
<div id="item2"> </div>
<div id="itemn"> </div>
</div>
</div>
</div>
listOfDivs berasal dari panggilan ajax. Menggunakan safari seluler.
Terima kasih atas bantuan Anda sebelumnya!
javascript
css
Aku disini
sumber
sumber
Jawaban:
Anda bisa menggunakan
scrollTop
sebagai penggantiscrollIntoView()
:jsFiddle: http://jsfiddle.net/LEqjm/
Jika ada lebih dari satu elemen yang dapat digulir yang ingin Anda gulir, Anda harus mengubah
scrollTop
masing-masing satu per satu, berdasarkanoffsetTop
elemen intervening. Ini akan memberi Anda kendali penuh untuk menghindari masalah yang Anda hadapi.EDIT: offsetTop tidak selalu terkait dengan elemen induk - ini relatif terhadap leluhur yang diposisikan pertama. Jika elemen induk tidak diposisikan (relatif, absolut, atau tetap), Anda mungkin perlu mengubah baris kedua menjadi:
sumber
target.parentNode.scrollTop = target.offsetTop - target.parentNode.offsetTop
position: relative
, Anda tidak boleh mengurangi offsetnya. Tapi Anda benar untuk banyak kasus.position: relative
div prent: itu benar-benar memperbaiki masalahPerbaiki dengan:
lihat: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
sumber
block : 'nearest'
parameternya tidak ada.sumber
top: el['offsetTop']
Saya mengalami masalah ini juga, dan menghabiskan waktu berjam-jam untuk mengatasinya. Saya berharap resolusi saya masih dapat membantu beberapa orang.
Perbaikan saya akhirnya menjadi:
.scrollIntoView()
menjadi.scrollIntoView({block: 'nearest'})
(terima kasih kepada @jfrohn).overflow: -moz-hidden-unscrollable;
pada elemen penampung yang bergeser.sumber
Bermain-main dengan
scrollIntoViewIfNeeded()
... pastikan itu didukung oleh browser.sumber
Saya telah menambahkan cara untuk menampilkan perilaku penting ScrollIntoView - http://jsfiddle.net/LEqjm/258/ [ini seharusnya menjadi komentar tetapi saya tidak memiliki cukup reputasi]
sumber
Plugin jQuery
scrollintoview()
meningkatkan kegunaanAlih-alih penerapan DOM default, Anda dapat menggunakan plugin yang menganimasikan gerakan dan tidak memiliki efek yang tidak diinginkan. Berikut cara paling sederhana untuk menggunakannya dengan default:
Buka posting blog ini di mana Anda dapat membaca semua detailnya dan pada akhirnya akan membawa Anda ke kode sumber GitHub dari plugin tersebut.
Plugin ini secara otomatis mencari elemen leluhur terdekat yang dapat di-scroll dan menggulirnya sehingga elemen yang dipilih berada di dalam port tampilan yang terlihat. Jika elemen sudah ada di port tampilan, ia tentu saja tidak melakukan apa-apa.
sumber
Menggunakan ide Brilliant, berikut adalah solusi yang hanya (secara vertikal) menggulung jika elemen saat ini TIDAK terlihat. Idenya adalah untuk mendapatkan kotak pembatas viewport dan elemen yang akan ditampilkan di ruang koordinat jendela browser. Periksa apakah terlihat dan jika tidak, gulir sejauh yang diperlukan sehingga elemen ditampilkan di bagian atas atau bawah viewport.
sumber
Menambahkan lebih banyak informasi untuk
@Jesco
memposting.Element.scrollIntoViewIfNeeded()
non-standard WebKit method
untuk browser Chrome, Opera, Safari.Jika elemen sudah berada dalam area yang terlihat di jendela browser, maka tidak ada pengguliran yang terjadi .
Element.scrollIntoView()
metode menggulung elemen yang dipanggil ke dalam area yang terlihat di jendela browser.Coba kode di bawah ini di
mozilla.org
scrollIntoView()
tautan. Posting untuk mengidentifikasi Browsersumber
dalam konteks saya, dia akan mendorong bilah alat lengket dari layar, atau masuk di sebelah tombol hebat dengan absolut.
menggunakan penyelesaian terdekat.
sumber
saya memiliki masalah yang sama, saya memperbaikinya dengan menghapus
transform:translateY
CSS yang saya tempatkan difooter
halaman.sumber