やりたい事
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なく実装する事ができました!!