子要素のdivがfocusされたら親要素のheaderのstyleを変更する→【修正】cssでも解決できました

スポンサーリンク

やりたい事

headerの子要素にあるdivがfocusされたら、親要素headerのheightを変更する。
cssにfocus-withinがありますが、これだと子孫要素にfocusされた場合は有効ですが、親要素のStyleを変更する事はできません。

<小言>
今回なぜこのようなJSを使う羽目になったかと言いますと、、、
【前提】
・ハンバーガーメニューをCSSのみで実装している
・header内にcontainerを作成して、その中にdiv spanでclose openのアニメーションをつけている
・containerの子孫要素にfocusがあった場合、ハンバーガーメニューを開く仕組みにしている
・ハンバーガーメニューは高さmaxで開きたいのでheaderにheight 100vhを設定している

【問題】
・headerのheightを100vhに設定していると、下のコンテンツのタッチイベントが効かない

【解決策】
・設計を立て直す ←面倒くさいのでやめました・・・
・divにfocusされたらheaderのheightを短くする ←採用

そもそもの設計ミスですが、JS超初心者なので勉強も兼ねてJSを追記することにしました。

header height を調整する2パターンのCSSを作成

cssにheader heightのメソッドを作成します。

/* 閉時ている状態 */
/* 通常時はcloseなので、htmlのheaderにはcloseのclassを予め付与します */
  .header_close {
    height: 82px;
  }

/* 開いた時 */
  .header_open {
    height: 100vh;
  }

divがfocusされたらStyleを変更するJSを記載

focusイベントには、focusとblurを使用します。
focus = 設定
blur = 解除
となります。

focusされるdiv要素にはid名を付与しました。
id=”nav_sp_button”

id名を使って、document.getElementByIdで処理を施していきます。

// DOM呼び出し
window.onload = function(){

// それぞれのhtml要素を変数に格納します。
let headerHeight = document.getElementById('nav_sp_button');
let changeStyle = document.getElementById('header');
    
// 実行処理を実装します。
// focusされた時
function changeHeightOn(){
    changeStyle.classList.add('header_open');
    changeStyle.classList.remove('header_close');
}
// 解除する時
function changeHeightOff(){
    changeStyle.classList.remove('header_open');
    changeStyle.classList.add('header_close');
}   

// 実行タイミングを設定します
 headerHeight.addEventListener('focus',changeHeightOn);
 headerHeight.addEventListener('blur',changeHeightOff);
};

<個人的ハマりpoint>
・ハンバーガーメニューの開閉だからとdivをonclickで実装できると思い込んでいた。cssでfocusを設定しているのに早く気付くべきだった…
・DOMのwindow.onloadを忘れていたがために動かなかった。

今までJSに抵抗があり身構えてしまっていましたが、少しずつお近づきになれればなと、、、
上記のちょっとしたJSですが、実装できるとテンション上がります。ブラウザー上で動きが確認できるのはうれしいです!(笑)

【修正】親要素であるheaderにfocus-withinを適用

上記ではJSで子要素にfocusがある時にStyleを変更させていましたが、親であるheaderにもfocus-withinをつけることで解決ができました。
JSの記述は不必要であったので、訂正します。

  #header:focus-within{
    height: 100vh;
  }

親要素であるheaderにfocus-withinを付与して、子孫要素にfocusがあった際の実行処理を記載します。
この3行だけでJSなく実装する事ができました!!

タイトルとURLをコピーしました