【css / javascript】スクロールバーが反応しない!?

先日、こんな感じ↓のレイアウトを作ろうとしました。

f:id:kento0824jp:20171112225406p:plain

要素Aの子に横スクロールできる要素1があって、
要素2がその下にくっついてる感じです。

今回親要素にはposition: relative、要素1にはposition: absoluteが設定されてるので、要素2は要素1の高さの影響を受けません。
また、要素1の高ささをいろいろと変えたいので、親要素には高さを設定していません。
なのでそのままだと要素2は要素1に重なってしまいます。

 

これを回避するためにこんなスクリプトを当てていました。

$(function(){
    var youso1_height = $('#youso1').height();
    $('#youso2').css('top', youso1_height + 'px');
});

要素1の高さを要素2の位置(top)に設定します。
これできれいに縦に並んだぜ!やったぜ!と思いきや…

要素1のスクロールバーがまったく反応しない(押せない)事態が発生。
(表示はされてます)

これはどうしましょう…と会社の先輩方に相談したところ、
大変迅速に原因と対処法を頂いたのでまとめておきます。

 

原因

そもそもの原因は要素2がスクロールバーの上に重なってしまっていることでした。
要素が上に重なっていると、スクロールバーを押すことは出来ないみたいです。

 

今回は要素2のtopを要素1のheightと同じ値に設定していたのですが、
これは要素1と2が1ピクセルの隙間もなく縦に並ぶことを意味します。

一方でスクロールバーは要素1をちょっとはみ出た所に表示されるので、今回のようなことが起きてしまったのです。

 

ちなみに実験してみたのですが、
marginが重なるのはokpaddingはダメでした。borderより内側ならダメということですね。

対処法

jsで設定する要素2のtopに適当な数字を足して、要素1との間に隙間をあけてやればOKです。

$(function(){
    var youso1_height = $('#youso1').height();
    var youso2_top = youso1_height;
    $('#youso2').css('top', youso2_top + 'px');
});

もしくは要素1にmargin-bottomを適当に設定して、heightでなくouterHeightを取得する方法でもOKです。

$(function(){
    var youso1_height = $('#youso1').outerHeight();
    $('#youso2').css('top', youso1_height + 'px');
});

 

 

まとめ

スクロールバーは、上にある要素のborderより内側が重なっていると押せない。

 

position:absoluteを使うときは要注意ですね…