サイドバーのメニュー下の広告

サイドバーのメニュー下に、広告を配置。スクロールしていくと、広告部分だけが残る、いわゆる追尾方広告とか言われるスタイル。

今回は jQuery を使って、広告のセクション(.fix_container)に、新たに .fixedというクラスを追加して、上部に固定させるタイプ。

問題点

通常使用には問題なし、意図したとおりに広告セクションが表示し続ける。しかし、アコーディオンメニューとの組み合わせで問題が発生する。

アコーディオンメニューを開いた状態でスクロールすると、意図しない位置で(開いたメニューに被った位置)で、広告セクションが固定されてしまう。

原因

先ずは、今回のスクリプト。非常に単純なもの。

$(function(){
  var fixbox = $('.fix_container');
  var offset = fixbox.offset().top;
  $(window).scroll(function () {
    if($(window).scrollTop() > offset -20) {
      fixbox.addClass('fixed');
    } else {
      fixbox.removeClass('fixed');
    }
  });
});

なんか変だけど、結局は、offset().topで、('.fix_container')の座標を取得している。この取得した座標は、ドキュメント上の絶対位置に当る。

アコーディオンメニューを開くことで、実際の表示と、取得した座標がズレが生じる。そしてスクリプトは、そのまま取得している座標を基準に動くことで、上記の問題が発生する。

当該部分のCSS

.side-container section {
  padding: 0;
  margin: 0 0 50px 0;
}
.fix_container{
  width: 300px;
  margin: 0 auto;
}
.fixed{
  position: fixed;
  top: 20px;
}
.move_container{
  width: 300px;
  margin: 0;
}

なんとなく・・・・・・

var offset = fixbox.offset().top; で取得した offset の変更とか再取得とかを考えたのだが・・・・無理みたい?