Saya memiliki situs dengan bilah navigasi tetap di atas dan 3 div di bawahnya di area konten utama.
Saya mencoba menggunakan scrollspy dari kerangka bootstrap.
Saya memilikinya dengan sukses menyoroti berbagai judul di menu saat Anda menggulir melewati divs.
Saya juga memilikinya sehingga ketika Anda mengklik menu, itu akan menggulir ke bagian halaman yang benar. Namun, offsetnya salah (Ini tidak memperhitungkan bilah navigasi, jadi saya perlu mengimbangi sekitar 40 piksel)
Saya melihat di halaman Bootstrap yang menyebutkan opsi offset tetapi saya tidak yakin bagaimana menggunakannya.
Saya juga tidak mengerti maksudnya ketika dikatakan Anda dapat menggunakan scrollspy dengan $('#navbar').scrollspy()
, saya tidak yakin di mana harus memasukkannya jadi saya tidak dan semuanya tampaknya berfungsi (kecuali offset).
Saya pikir offsetnya mungkin data-offset='10'
pada tag bodi, tetapi tidak melakukan apa-apa untuk saya.
Saya merasa ini adalah sesuatu yang sangat jelas dan saya melewatkannya. Ada bantuan?
Kode saya adalah
...
<!-- note: the data-offset doesn't do anything for me -->
<body data-spy="scroll" data-offset="20">
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="#">VIPS</a>
<ul class="nav">
<li class="active">
<a href="#trafficContainer">Traffic</a>
</li>
<li class="">
<a href="#responseContainer">Response Times</a>
</li>
<li class="">
<a href="#cpuContainer">CPU</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="span12">
<div id="trafficContainer" class="graph" style="position: relative;">
<!-- graph goes here -->
</div>
</div>
</div>
<div class="row">
<div class="span12">
<div id="responseContainer" class="graph" style="position: relative;">
<!-- graph goes here -->
</div>
</div>
</div>
<div class="row">
<div class="span12">
<div id="cpuContainer" class="graph" style="position: relative;">
<!-- graph goes here -->
</div>
</div>
</div>
</div>
...
<script src="assets/js/jquery-1.7.1.min.js"></script>
<script src="assets/js/bootstrap-scrollspy.js"></script>
</body>
</html>
sumber
Jawaban:
Bootstrap menggunakan offset untuk menyelesaikan spionase saja, bukan scrolling. Artinya, menggulir ke tempat yang tepat terserah Anda.
Coba ini, ini berfungsi untuk saya: tambahkan pengendali peristiwa untuk klik navigasi.
Saya menemukannya di sini: https://github.com/twitter/bootstrap/issues/3316
sumber
window.location.hash = $(this).attr('href')
fungsi ini.var navOffset = $('#navbar').height();
danscrollBy(0, -navOffset);
Triknya, seperti yang disinggung Tim, adalah memanfaatkan padding. Jadi masalahnya, browser Anda selalu ingin menggulirkan jangkar Anda ke bagian atas jendela. jika Anda mengatur jangkar di tempat teks Anda sebenarnya dimulai, itu akan ditutup oleh bilah menu Anda. Sebaliknya, yang Anda lakukan adalah menyetel jangkar ke wadah
<section>
atau<div>
id tag, yang akan digunakan secara otomatis oleh nav / navbar. Kemudian Anda harus mengaturpadding-top
wadah Anda ke jumlah offset yang Anda inginkan, danmargin-top
untuk wadah kebalikan daripadding-top
. Sekarang blok penampung Anda dan jangkar dimulai tepat di bagian atas halaman, tetapi konten di dalamnya tidak dimulai sampai di bawah bilah menu.Jika Anda menggunakan jangkar biasa, Anda dapat mencapai hal yang sama dengan menggunakan margin-top negatif di wadah Anda seperti di atas, tetapi tanpa bantalan. Kemudian Anda memasang
<a target="...">
jangkar biasa sebagai anak pertama dari wadah tersebut. Kemudian Anda memberi gaya pada elemen anak kedua dengan kebalikan tetapi samamargin-top
, tetapi menggunakan selektor.container:first-child +
.Ini semua menganggap bahwa
<body>
tag Anda sudah memiliki margin yang ditetapkan untuk dimulai di bawah header Anda, yang merupakan norma (jika tidak, halaman akan dirender dengan teks yang tertutup langsung dari kelelawar).Berikut adalah contoh penerapannya. Apa pun di halaman Anda dengan id dapat ditautkan dengan menempelkan # the-elements-id ke akhir URL Anda. Jika Anda membuat semua tag h Anda ad dt tag dengan id yang dapat ditautkan ( Seperti yang dilakukan github ) dengan semacam skrip yang memasukkan sedikit tautan di sebelah kiri mereka ; menambahkan yang berikut ini ke CSS Anda akan menangani offset bilah navigasi untuk Anda:
sumber
Anda dapat mengubah offset scrollspy dengan cepat (dengan asumsi Anda memata-matai tubuh):
Ini juga berfungsi jika Anda perlu mengubah nilai offset secara dinamis. (Saya suka scrollspy untuk beralih ketika bagian berikutnya sekitar setengah jendela jadi saya perlu mengubah offset selama pengubahan ukuran jendela.)
sumber
$('body').data()['bs.scrollspy'].options.offset
. Berguna untuk memicu scrollspy pada pemuatan halaman dengan menggunakanwindow.scrollBy(X,Y)
Jika Anda menginginkan offset 10 Anda akan meletakkan ini di kepala Anda:
Tag tubuh Anda akan terlihat seperti ini:
sumber
Dari masalah bootstrap # 3316 :
Jadi pengaturan offset hanya mempengaruhi di mana scrollspy menganggap halaman digulir . Itu tidak mempengaruhi pengguliran saat Anda mengeklik tag jangkar.
Menggunakan bilah navigasi tetap berarti browser menggulir ke tempat yang salah. Anda dapat memperbaikinya dengan JavaScript:
Namun, untuk memastikan bahwa scrollspy menyoroti elemen saat ini dengan benar, Anda masih perlu menyetel offset:
Berikut demo lengkapnya di JSFiddle .
Sebagai alternatif, Anda dapat mengisi tag anchor Anda, seperti yang disarankan oleh trik CSS .
sumber
Saya pikir offset itu mungkin melakukan sesuatu dengan posisi bawah bagian.
Saya memperbaiki masalah saya - sama seperti masalah Anda - dengan menambahkan
di deklarasi untuk bagian di bootstrap.css
Semoga membantu!
sumber
Saya menambahkan
.vspace
elemen 40px-height yang menahan jangkar di depan setiaph1
elemen saya .Di CSS:
Ini berfungsi dengan baik dan ruang tidak sesak.
sumber
Bootstrap 4 (pembaruan 2019)
Menerapkan: Memperbaiki Nav, Scrollspy, dan Smooth Scrolling
Ini solusi dari @ wilfred-hughes di atas, tepatnya memperbaiki masalah yang tumpang tindih dengan Bootstrap Fixed Navbar dengan menggunakan CSS ':: before' untuk menambahkan blok yang tidak ditampilkan sebelum setiap tag bagian. Keuntungan: Anda tidak akan mendapatkan bantalan yang tidak perlu di antara bagian Anda. Misalnya, bagian 3 dapat diposisikan secara vertikal tepat di atas bagian 2 dan masih akan bergulir ke posisi yang benar-benar tepat di atas bagian 3.
Catatan samping: menyetel offset scrollspy di tag skrip tidak menyebabkan apa pun terjadi ($ ('# navbar'). Scrollspy ({offset: 105});) dan upaya untuk menyesuaikan offset di blok animasi masih mengakibatkan ketidaksejajaran pasca- animasi.
index.html
nanti di index.html ...
style.css:
Kredit: @ wilfred-hughes di atas dan sumber asli dari pengguna @mnot di https://github.com/twbs/bootstrap/issues/1768
sumber
Saya mengalami masalah dengan solusi dari acjohnson55 dan Kurt UXD. Keduanya bekerja untuk mengklik link ke hash, tetapi scrollspy offset masih belum benar.
Saya datang dengan solusi berikut:
Dan CSS yang sesuai:
Anda perlu mengganti padding / margin 40px dengan tinggi navbar Anda, dan id dari jangkar Anda.
Dalam pengaturan ini saya bahkan dapat mengamati efek pengaturan nilai untuk atribut data-offset. Jika menemukan nilai besar untuk data-offset sekitar 100-200 mengarah ke perilaku yang lebih diharapkan (scrollspy- "switch" akan terjadi jika heading ada di tengah layar).
Saya juga menemukan bahwa scrollspy sangat sensitif terhadap kesalahan seperti tag div yang tidak ditutup (yang cukup jelas), jadi http://validator.w3.org/check adalah teman saya di sini.
Menurut pendapat saya scrollspy bekerja paling baik dengan seluruh bagian yang membawa ID jangkar, karena elemen jangkar biasa tidak mengarah pada efek yang diharapkan saat menggulir ke belakang (scrollspy- "switch" akhirnya terjadi segera setelah Anda menekan elemen jangkar, misalnya tajuk Anda, tetapi pada saat itu Anda telah menggulir konten yang diharapkan pengguna termasuk dalam judul yang sesuai).
sumber
Jika Anda tersandung pertanyaan ini (seperti yang saya lakukan) melalui Google dan masih mencari cara untuk secara dinamis mengubah offset scrollspy. Saya sekarang melampirkan tautan ke solusi yang berhasil untuk saya.
Lihatlah posting yang saya buat di utas lain . Ini berisi potongan tentang bagaimana Anda dapat mengubah nilai offset secara terprogram dan secara dinamis bereaksi terhadap perubahan (misalnya jika bilah navigasi berubah ukuran).
Anda tidak perlu mengutak-atik perbaikan CSS, melainkan mengatur offset yang saat ini Anda butuhkan dalam ketergantungan peristiwa tertentu.
sumber
Anda juga dapat membuka
bootstap-offset.js
dan memodifikasisana.
sumber
Setel saja:
data-offset
secara default adalah "50" dan itu setara dengan 10px, jadi naikkan sajadata-offset
dan masalah Anda terpecahkan.sumber