A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
こんにちは
不明点が多いので、方法を文章で示す回答になってしまいますが・・・
「メガメニュー」ってわからないけれど、javascriptのカテでのご質問なので、LightBox系の発展型のものと解釈しました。
「メガメニュー」にどのようなAPIが用意されているのか(ないのか)わかりませんが、以下の内容がユーザに解放されているものと仮定しました。
・表示中の(最上位)要素の識別子(または要素そのもの)の取得
・表示中の要素を「閉じる」メソッド
>クリックする要素以外を押したら閉じるようにしたいです。
>他の要素を触ったら閉じるような実装方法がありましたら、
「押す」なのか「触る」なのか不明ですが、多分、clickやmouseover(=hover)でとれる操作と想像しました。
「表示中のものを閉じる」ことは(多分)できるものと思いますので、ご質問を解決するには、閉じるタイミングさえ取得・判断できれば良いものと推測しました。
いわゆるLightBoxのように、背景に半透明のバックを設けているタイプのものであるなら、その背景要素のclickやmouseoverを取得すればよいので簡単です。
背景等に上記のイベントを設定して、表示要素を閉じればよいでしょう。
もともとは背景が無い場合でも、「透明な背景」を追加することが可能であるなら、この方法を応用することで簡単に解決するものと想像します。
背景などが無い場合は、他の要素でイベントを取得する必要がでてくるかも知れませんが、マウスイベントの場合、大抵のものはバブリングしますので、(例えば)documentにイベントを設定しておくことで、イベントの発生をまとめて取得することができます。
ですので、この中から閉じるべきタイミングを選別できれば解決ということになると想像します。
◇mouseoverの場合
「表示中の要素以外のmouseoverを取得する」と考えても良いですが、逆に考えた方が簡単になると思われます。
(対象)表示要素のmouseleaveがこれと一致するはずですので、こちらを取得して無条件で閉じれば良いと考えられます。
◇clickの場合
clickの場合は、イベントが発生要素でしか捉えられないので、そちらから判断する必要が出てきます。
上述のようにdocumentで捉えれば全てのclickイベントを感知できますが、実際のイベント発生要素は event.target で取得できます。
これが、「表示中の要素の子孫要素であれば何もしない、それ以外であれば閉じる」というロジックで処理することでご質問の内容は実現可能と想像します。
表示中の要素の識別子がidなのかclassなのかはたまた要素そのものなのか不明ですが、仮にactiveElementとして識別できるものとします。
let elm = event.target;
while( elm && activeElement !== elm){ elm = elm.parentNode; }
のように遡りながらチェックすることで、イベント発生要素が表示要素内(=子孫)の要素かそれ以外かを判定できますので、上記の結果がnullなら(=表示要素内ではないので)閉じればよいということになります。
表示中の要素は可変なので、比較対象は表示要素そのものでなくとも、その「メガメニュー」の包含要素(=固定)として判断してもよく、そちらの方が考え方は少しだけ簡単になるかも知れません。
もしもjQueryなどのライブラリを用いているのであれば、parents()メソッドで親要素をまとめて遡ることができますので、もう少し簡略な記述にできる可能性があります。
あるいは、「メガメニュー」のAPIにもっと便利な機能が用意されているようであれば、そちらを利用なさるのが良いでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 ファイルエクスプローラーでフォルダを閉じる操作について 2 2022/10/15 11:06
- 物理学 蓋が閉まっていることを確認して、主電源がはいるしくみの装置 5 2023/04/20 12:46
- Windows 10 画面上の[タスクバー]の位置の変更 1 2022/06/12 21:10
- Excel(エクセル) 開いているフォルダを全て閉じる、マクロを教えて下さい 3 2022/08/28 08:42
- その他(コンピューター・テクノロジー) HOI4のクリックがバグった 2 2023/04/29 17:51
- その他(コンピューター・テクノロジー) PC利用中に勝手に起動する窓を消し去る方法を教えて下さい。 1 2023/05/08 16:48
- その他(動画サービス) Tver アンケートに回答しても視聴できない(何度もアンケート画面が開く) 1 2023/01/13 21:47
- 化学 理科に詳しい方、教えてください。図のH字官式電気分解装置の使い方で、ピンチコックがいまいち分かりませ 1 2022/12/14 21:48
- インターネットビジネス Google によりアカウントは閉鎖されました 復活させるにはどうすれば? 基本的に無理ですか? 1 2023/08/18 17:04
- Visual Basic(VBA) VBA Bookの表示、非表示 1 2022/09/16 20:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
二次元配列を使って順位をだす...
-
読み込んだQRコードをフォーム...
-
jQueryで同じクラス名のものを...
-
正規表現について質問です。条...
-
ローディングアニメーションの...
-
GASでGoogleフォームの自動返信...
-
スマホ上で、左右スワイプで次...
-
ブックマークレットについて
-
React hooksが値を返して配列変...
-
画面遷移を行わずに同一ページ...
-
clear機能を失わずにファイルア...
-
初心者です。gulpでコンパイル...
-
セレクトボックスで配列を呼び...
-
追加ボタンを押した際に ok ボ...
-
①入力フォーム→②確認表示画面→③...
-
EasyUIのSubGrid(jquery)にお...
-
Q&A掲示板の入力フォームに文字...
-
メールフォームの日付入力フォ...
-
HTMLタグに複数のクラスを設定...
-
Googleフォームで選択肢に応じ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アコーディオンメニューにする...
-
iText セル内での自動改行について
-
Listでintの最大値を超える要素...
-
Aタグのhrefの値を取得したいの...
-
或る文字列の文字数が一定数以...
-
JS node.childNodesの仕様について
-
jtreeのノードを右クリックで選...
-
こんばんは。 メガメニューを今...
-
jQuery UIのDroppableにて
-
jQueryについて
-
ajaxで読み込んだDOMに対してin...
-
URL+URN=URI と習ったのですが...
-
iアプリで改行する方法を教えて...
-
新しいパソコンのネット設定な...
-
collection型を引数にしたファ...
-
(再質問)エクセルのマクロボ...
-
mとnを入力 mからnまでを加算し...
-
<p> </p>ってまずいの?
-
六本組み木の作り方を教えて下...
-
汎用機のJCLの入門書ありま...
おすすめ情報