回答編集履歴

1

閉じる関数が何度も呼び出されていたのが原因だと分かりました。

2023/04/22 10:14

投稿

a_a
a_a

スコア13

test CHANGED
@@ -1,3 +1,54 @@
1
1
  - モーダルを開いた後、クリックするたびに閉じる関数が反応していましたが、クラスがダブっていたことが原因でした。 クラスを変更することで解決しました。
2
2
 
3
3
  - 2回目以降、モーダル閉じると上へスクロールしてしまう現象は、「let scrollY = body.style.top;」の記述場所を変更することで解決しました(閉じる関数が呼び出される前に記述)
4
+
5
+ 根本的な解決になっていなかったのでやり直しました。
6
+ 「let scrollY = body.style.top;」の場所は元に戻して、閉じるイベントをremoveしました。
7
+ ```Javascript
8
+ const mdlOpens = document.querySelectorAll('.js_mdl_open');// 開くボタン
9
+ const mdls = document.querySelectorAll('.js_mdl');// モーダル本体
10
+ const body = document.body;
11
+
12
+ mdlOpens.forEach( mdlOpen => {
13
+ //モーダル開くイベント発火
14
+ mdlOpen.addEventListener("click", e =>{
15
+ e.preventDefault();
16
+ e.stopPropagation();
17
+ body.style.top = -(window.pageYOffset) +'px';//fixedより後にきてはダメ
18
+ const datavalue = mdlOpen.dataset.mdlopen;//dataset.mdlopen
19
+
20
+ mdls.forEach( (mdl) => {
21
+ if( datavalue == mdl.dataset.mdl){//dataset.mdl
22
+ body.style.position = "fixed";
23
+ mdl.classList.add('mdl_active');
24
+
25
+ const closebtn = mdl.querySelector('.js_mdl_close_icon');
26
+ const mdlOverlay = mdl.querySelector('.js_mdl_overlay');
27
+
28
+ closebtn.addEventListener('click',closeModal);
29
+ mdlOverlay.addEventListener('click',closeModal);
30
+
31
+ // モーダル閉じる
32
+ function closeModal(e){
33
+ e.stopPropagation();
34
+ e.preventDefault();
35
+ let scrollY = body.style.top;// topの値取得して変数に格納
36
+ mdl.classList.remove('mdl_active')
37
+ body.style.position = "";
38
+ body.style.top = '';
39
+ window.scrollTo({
40
+ behavior: "instant",
41
+ left: 0,
42
+ top: parseInt(scrollY || '0')*-1
43
+ });
44
+
45
+ closebtn.removeEventListener('click',closeModal);
46
+ mdlOverlay.removeEventListener('click',closeModal);
47
+
48
+ };//closeModal
49
+ }//if
50
+ })//forEach
51
+ })
52
+ })//forEach
53
+ ```
54
+