私が取り組んでいるサイトで、Bootstrapドキュメント CSS および JSから直接取得した自動フローティング サブナビゲーション バーを実装しました。1 つのビューにのみ表示されますが、これは Rails ビューであるため、読み込まれるオブジェクトに応じて動的に生成されます。
私が見つけたのは、サブナビゲーション バーの下に表示されるコンテンツが十分に長い場合、サブナビゲーション バーの動作が期待どおりに機能することです。 .
ただし、ページがこれよりも短い場合、サブナビゲーション バーは実際に表示されなくなる前に固定され、かなり耳障りなジャンプが発生します。言うまでもなく、バーがあった場所のスペースを見ることができます。見ることができます。
適切なボディ パディングを考慮して、固定 (メイン) ナビゲーション バーを使用していることを付け加えておきます。
$('.subnav').offset.top
返される値に問題があるようです。
jQuery / JSのほうが優れている人は、これを診断して、サブナビゲーションバーがスクロールされて表示されなくなったときにのみ固定されるようにする方法を考え出すことができますか?
Javascript:
var $win = $(window)
, $nav = $('.subnav')
, navTop = $('.subnav').length && $('.subnav').offset().top
, isFixed = 0
, $hiddenName = $('.subnav .hide')
processScroll()
$nav.on('click', function () {
if (!isFixed) setTimeout(function () { $win.scrollTop($win.scrollTop() - 47) }, 10)
})
$win.on('scroll', processScroll)
function processScroll() {
var i, scrollTop = $win.scrollTop()
if (scrollTop >= navTop && !isFixed) {
isFixed = 1
$nav.addClass('subnav-fixed')
$hiddenName.removeClass('hide')
if (!$('.subnav li').hasClass('active')) {
$('.subnav li:eq(1)').addClass('active')
}
} else if (scrollTop <= navTop && isFixed) {
isFixed = 0
$nav.removeClass('subnav-fixed')
$hiddenName.addClass('hide')
$('.subnav li').removeClass('active')
}
}
Replicating Bootstraps main nav and subnav - この質問を見たことがありますが、まだ使用しているため、問題を回避できるとは思いません.offset()
アップデート:
まだ運がありません。navTop
ページの長さが短くなるにつれて、それでも短くなるように見えますが、これは を使用しているため意味がありませんoffset().top
。その方法がどのように機能するかについて、私が得ていないものはありますか?
更新 2
Bootstrap 2.1.0 では、実際のコンポーネントとしてサブナビゲーション バーと、スティッキー動作を処理するための jQuery プラグインが実際に含まれているため、これは解決されるようです。それでも、offset() 関数がそれほど信頼できない理由を理解したいと思います。