格闘中!scrollとabsoluteに不具合?これなんだろう

最終更新日
2023年5月20日

格闘中!scrollとabsoluteに不具合?これなんだろう

こんにちは。
ぴころじーの竹川です。

本日、メニューを作っていて、どうもおかしな現象が発生しています。いくら調べても解決策が見当たらず、未だに解決していない案件です。誰か分かる方がいれば!?こっそり教えてください(ぇ

こうなって欲しい(理想)

左側に隠れているメニューブロックに対して、ホバーしたらひょっこり表示されるというものです。よくあるメニューだと思います。

具体的にはこのような感じです。(うちのサンプルサイトで申し訳ありません。)

通常時のメニュー(引っ込んでます)

通常時のメニュー

ホバーしたときのメニュー(表示されています)

ホバーしたときのメニュー

動きとしてはこうなって欲しいところです。といいますか、動きは問題ないのです。問題なのは、表示の方・・・!

必要な仕様

動きや表示など、必要な仕様は決めています。

  • 非表示のとき、メニューがあると分かるように、少しだけ表示する。
  • メニュータブを付ける。
  • リストが多くなり、Y方向にはみ出てもスクロールする。
  • ホバーしたら左からフェイドインする。

解決すべき問題(現実)

仕様の2番目と3番目がどうもうまく行かないという現象に見舞われました。

cssでコンテナ要素にoverflow-y:scrollを付けます。(3番目)

同様に、cssでコンテナ要素の疑似要素としてメニュータブを付けます。(2番目)

この2つが相反してしまうのです。3番目を適用すれば、2番目が反映されなくなり、2番目を適用すれば、3番目が反映されなくなるのです。

なお、前者のほうが可能性があると考えており、スクロールを有効にした場合、疑似ブロック自体は正常に配置されていると思われます。ただ、表示されていません。

overflow-y:scrollのscroll以外で、clip、initial、revert、unset、visibleの場合はタブが表示されます。

また、block:absoluteのabsolute以外の場合は、表示場所がおかしくなりますが、タブが表示されます。

隠れているメニュータブ

該当のcss(sassですが・・・。)はこんな感じです。問題の箇所を太線にしました。

#block-sitetree-menu {
  display: block;
  position: fixed;
  top: 0;
  width: 405px;
  height: 100vh;
  padding: 0;
  left: -400px;
  background-color: #000;
  transition: all 0.6s;
  z-index: 3;
  overflow-y: scroll;
  -ms-overflow-style: none; // IE/Edgeでスクロールバーを非表示
  scrollbar-width: none; // Firefox
  &::-webkit-scrollbar { // Chrome/Safari
    display: none;
  }
  &:hover {
    left: 0;
  }
  &::before {
    content: 'メニュー';
    position: absolute;
    display: block;
    color: #fff;
    top: 50px;
    left: 380px;
    z-index: 4;
    width: max-content;
    background-color: #000;
    transform: rotate(90deg);
    padding: 10px;
    border-radius: 5px 5px 0 0;
    font-size: 16px;
  }
  ul.sitetree-menu {
    flex-direction: column;
    li.menu-item--expanded { // 下位に展開できるメニューがあるとき
      >a {
        pointer-events: none; // 直下のaタグを無効にする
      }
    }
  }
}

う~ん。難しいです!解決したら続報するかもしれません。