質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

314閲覧

modaal.jsのモーダル画面に「次へ」「前へ」ボタンを設置したい

k_o

総合スコア3

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2024/07/07 10:47

編集2024/07/07 10:50

実現したいこと

modaal.jsのモーダル画面に「前へ」「次へ」ボタンを設置したい。

困っていること

modaal.jsというライブラリを使って複数設置のモーダル画面を作成してます。

modaal.js

内容は企業サイトの社員メンバーのページを作成しております。
モーダル画面は横幅100%になります。

立ち上がったモーダル画面に、「次へ」「前へ」ボタンを設置して、次のモーダル、前のモーダルに遷移させたいのですが、調べたのですがどうしてもやり方がわかりません。

あと、一番目のモーダルには「前へ」ボタンは表示させないで「次へ」ボタンのみ。
最後のモーダルには「前へ」ボタンは表示させて「次へ」ボタンは非表示にしたいです。

どなたかご教授のほど何卒宜しくお願い致します。

発生している問題・分からないこと

modaal.jsに「前へ」「次へ」ボタンを設置したいのですが、実現方法がわかりません。ネットで調べたのですが、そのような情報が見つからなくてご相談いたしました。

該当のソースコード

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Document</title> 7 8<link href=" 9https://cdn.jsdelivr.net/npm/modaal@0.4.4/dist/css/modaal.min.css 10" rel="stylesheet"> 11 12 13<style> 14 ul { 15 list-style-type: none; 16 display: flex; 17 li { 18 margin-right: 20px; 19 } 20 } 21</style> 22</head> 23<body> 24 25 <div id="inline01" style="display:none;" class="white-popup-block"> 26 <h1>Modaal01</h1> 27 <p>Modaal01インラインテキストテスト</p> 28 </div> 29 30 <div id="inline02" style="display:none;" class="white-popup-block"> 31 <h1>Modaal02</h1> 32 <p>Modaal02インラインテキストテスト</p> 33 </div> 34 35 <div id="inline03" style="display:none;" class="white-popup-block"> 36 <h1>Modaal03</h1> 37 <p>Modaal03インラインテキストテスト</p> 38 </div> 39 40 <div class="staff_list_wrap"> 41 <ul class="slides-wrapper staff_list"> 42 <li class="staff_slide"> 43 <a href="#inline01" class="staff_link btn inline" data-group="people"> 44 <button>modaalその1</button> 45 </a> 46 </li> 47 48 <li class="staff_slide"> 49 <a href="#inline02" class="staff_link btn inline" data-group="people"> 50 <button>modaalその1</button> 51 </a> 52 </li> 53 54 <li class="staff_slide"> 55 <a href="#inline03" class="staff_link btn inline" data-group="people"> 56 <button>modaalその1</button> 57 </a> 58 </li> 59 </ul> 60 </div> 61 62 <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> 63 64 <script src=" 65 https://cdn.jsdelivr.net/npm/modaal@0.4.4/dist/js/modaal.min.js 66 "></script> 67 68 <script type="text/javascript"> 69$(document).ready(function() { 70 $('.inline').modaal({ 71 fullscreen: true, 72 type: 'inline', 73 group: 'members', 74 after_open: function(modal) { 75 const currentIndex = modal.index; 76 const totalModals = modal.group.length; 77 $('.modaal-prev, .modaal-next').remove(); 78 79 if (currentIndex > 0) { 80 $('<button class="modaal-prev">前へ戻る</button>').appendTo('.modaal-content-container').click(function() { 81 $.modaal('close'); 82 setTimeout(function() { 83 $(modal.group[currentIndex - 1]).click(); 84 }, 200); 85 }); 86 } 87 88 if (currentIndex < totalModals - 1) { 89 $('<button class="modaal-next">次を見る</button>').appendTo('.modaal-content-container').click(function() { 90 $.modaal('close'); 91 setTimeout(function() { 92 $(modal.group[currentIndex + 1]).click(); 93 }, 200); 94 }); 95 } 96 } 97 }); 98 }); 99 100// 101 102 </script> 103 104</body> 105</html>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

modaal.jsのカスタム方法を色々と検索したのですが、「前へ」「次へ」ボタン設置については解決方法が出てきませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yametai

2024/07/07 14:31

> 1.4. The Basics > > ```html > <button class="inline">Show</button> > <div id="inline" style="display:none;"> > <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.</p> > </div> > ``` > > ```js > $('.inline').modaal({ > content_source: '#inline' > }); > ``` > > [GitHub - humaan/Modaal: An accessible dialog window library for all humans.](https://github.com/humaan/Modaal?tab=readme-ov-file#14-the-basics) Modaalの基本的な使い方は、上に引用した通り、 htmlにモーダルに表示するコンテンツを記述する形になると思います。 (前へ、次へボタンもこのhtmlの部分に記述するのが基本的かなと思いました。) after_openでボタンを追加しようとしていると思いますが、何か理由がありますか? > あと、一番目のモーダルには「前へ」ボタンは表示させないで「次へ」ボタンのみ。 > 最後のモーダルには「前へ」ボタンは表示させて「次へ」ボタンは非表示にしたいです。 after_openでボタンを追加せずに、 htmlにコンテンツを記述するので良いのでしたら、 一番目のモーダルのコンテンツには「次へ」ボタンのみ記述して、 最後のモーダルのコンテンツには「前へ」ボタンのみ記述するだけで良いのかなと思いました。 > 次のモーダル、前のモーダルに遷移させたいのですが、 モーダルを遷移させるという使い方をあまり見たことがないのですが、 表示中のモーダルを閉じて、次のモーダルを表示する、 という形にはできそうかなと思いました。
k_o

2024/07/07 15:20

ご連絡ありがとうございます! >after_openでボタンを追加しようとしていると思いますが、何か理由がありますか? >after_openでボタンを追加せずに、 >htmlにコンテンツを記述するので良いのでしたら、 >一番目のモーダルのコンテンツには「次へ」ボタンのみ記述して、 >最後のモーダルのコンテンツには「前へ」ボタンのみ記述するだけで良いのかなと思いました。 上記に関してですが、wordpressで動的に表示させたくて、色々調べていたらafter_openで「次へ」ボタンを表示しているソースがあったので使ってみました。 ※私はデザイナーで開発者の知識がないため、あまり理解せず利用しているところがございます。ご了承くださいませ。 >モーダルを遷移させるという使い方をあまり見たことがないのですが、 >表示中のモーダルを閉じて、次のモーダルを表示する、 >という形にはできそうかなと思いました。 モーダルを遷移の件ですが、以下のようなメンバー紹介のページをイメージしております。 https://katana-marketing.co.jp/member/ モーダルを遷移する方法が、調べてもなかなか出てこなくて、悩んだ挙句こちらにご相談させて頂きました。
yambejp

2024/07/08 01:32

モーダルはdialogが一番楽だと思いますがそれではだめなのでしょうか?
k_o

2024/07/08 08:15

ご連絡ありがとうございます! dialogタグは(知らなくて)選択肢に入ってなかったのですが、調べたら最近の各種ブラウザにも対応していて、非常に良さそうですね!こんな便利なタグも利用できるようになっていてびっくしました。 ライブラリで設定の方が、楽かなと思ってライブラリで設置の方向性で検討していたのですが、dialogタグで設置も良さそうですね。ご教示ありがとうございます!!
guest

回答2

0

コメントありがとうございます。

wordpressで動的に表示させたくて、

動的にボタンを表示させたいということ、理解しました。

以下のようなメンバー紹介のページをイメージしております。

参考サイトのリンクをありがとうございます。
確かに、このようなイメージだとモーダルのコンテンツ自体にボタンがあるより、
動的にボタンを表示した方がメンテナンスしやすいかもしれませんね。

「該当のソースコード」のコードはafter_openでindexや全体の数を取得することができずにエラーになっているようですね。
(公式のドキュメントを見ると、Modaalにはgroupというオプションもないように見えました。)

実際のサイトの要素・構成などによってそのままでは動かないかもしれませんが、
エラーを解消するように修正してみました。

html

1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>Document</title> 8 <link href="https://cdn.jsdelivr.net/npm/modaal@0.4.4/dist/css/modaal.min.css" rel="stylesheet"> 9 <style> 10 ul { 11 list-style-type: none; 12 display: flex; 13 14 li { 15 margin-right: 20px; 16 } 17 } 18 </style> 19</head> 20 21<body> 22 <div id="inline01" style="display:none;" class="white-popup-block"> 23 <h1>Modaal01</h1> 24 <p>Modaal01インラインテキストテスト</p> 25 </div> 26 <div id="inline02" style="display:none;" class="white-popup-block"> 27 <h1>Modaal02</h1> 28 <p>Modaal02インラインテキストテスト</p> 29 </div> 30 <div id="inline03" style="display:none;" class="white-popup-block"> 31 <h1>Modaal03</h1> 32 <p>Modaal03インラインテキストテスト</p> 33 </div> 34 <div class="staff_list_wrap"> 35 <ul class="slides-wrapper staff_list"> 36 <li class="staff_slide"> 37 <a href="#inline01" class="staff_link btn inline" data-group="people"> 38 <button>modaalその1</button> 39 </a> 40 </li> 41 <li class="staff_slide"> 42 <a href="#inline02" class="staff_link btn inline" data-group="people"> 43 <button>modaalその1</button> 44 </a> 45 </li> 46 <li class="staff_slide"> 47 <a href="#inline03" class="staff_link btn inline" data-group="people"> 48 <button>modaalその1</button> 49 </a> 50 </li> 51 </ul> 52 </div> 53 <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> 54 <script src="https://cdn.jsdelivr.net/npm/modaal@0.4.4/dist/js/modaal.min.js"></script> 55 <script type="text/javascript"> 56 $(document).ready(function () { 57 $('.inline').modaal({ 58 fullscreen: true, 59 type: 'inline', 60 // 公式ドキュメント「2.4. Configuration Events」より 61 // after_openのparamsはmodal_wrapperとなっていて、ここからindexを取得するのは手間のように思いました。 62 // before_openのparamsはeventとなっていて、ここからindexを取得する方が楽そうでした。(画面の構成によってはguidは適切じゃないかもしれません・・jQueryでindexを取得するなど見直しが必要かもしれません) 63 before_open: function (event) { 64 const currentIndex = event.handleObj.guid - 1 65 const totalModals = $(".inline").length 66 $('.modaal-prev, .modaal-next').remove(); 67 68 if (currentIndex > 0) { 69 // before_openにしたことで、表示されたモーダルに対してボタンを追加するのではなく、モーダルの元になるコンテンツにボタンを追加しました。 70 $('<button class="modaal-prev">前へ戻る</button>').appendTo('.white-popup-block').click(function () { 71 $(".inline").modaal('close'); 72 setTimeout(function () { 73 // `<a href="#inline__">`を探してクリックするように変更しました。 74 const prev = `#inline${String(currentIndex).padStart(2, "0")}` 75 $(`[href="${prev}"]`).click() 76 }, 350); // animation_speedのデフォルトは300のようですので、閉じるのを300と少し待つ必要がありそうです。(手元の環境では340だとモーダルが真っ白になりました。) 77 }); 78 } 79 if (currentIndex < totalModals - 1) { 80 $('<button class="modaal-next">次を見る</button>').appendTo('.white-popup-block').click(function () { 81 $(".inline").modaal('close'); 82 setTimeout(function () { 83 const next = `#inline${String(currentIndex + 2).padStart(2, "0")}` 84 $(`[href="${next}"]`).click() 85 }, 350); 86 }); 87 } 88 } 89 }); 90 }); 91 </script> 92</body> 93 94</html>

公式ドキュメントも参照すると良いかなと思います。

GitHub - humaan/Modaal: An accessible dialog window library for all humans.

投稿2024/07/08 02:11

yametai

総合スコア255

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k_o

2024/07/09 09:57

とても丁寧な解説付きで教えて頂き、ありがとうございます! 大感謝です! こちらのソースコードで、やりたいことが実現できそうな気がしました。 今晩、デザインしたページに組み込んで見ようと思います。 一時期は無理なのかなと諦めかけましたが、頂いたソースコードで解決しそうな気がします! アドバイス頂き、ありがとうございます!!
yametai

2024/07/09 13:25

コメントありがとうございます。 不明な点や実際のページで不都合な点などありましたらまたコメントくださいね。 頑張ってください。
guest

0

ベストアンサー

簡単なモーダルの実装例

html

1<script> 2document.addEventListener('click',({target})=>{ 3 if(target.matches('#dlg_open')){ 4 dlg.showModal(); 5 } 6 if(target.matches('#dlg .close')){ 7 dlg.close(); 8 } 9}); 10</script> 11<style> 12#dlg li:not(:has([name="select"]:checked)){ 13display:none; 14} 15ul:has(#s1:checked) ~ .s:not(.s1), 16ul:has(#s2:checked) ~ .s:not(.s2), 17ul:has(#s3:checked) ~ .s:not(.s3), 18ul:has(#s4:checked) ~ .s:not(.s4){ 19display:none; 20} 21#dlg ul{ 22list-style:none; 23padding:0; 24} 25[name=select]{display:none;} 26</style> 27<dialog id="dlg"> 28<ul> 29<li><div><input type="radio" name="select" id="s1" checked>content 1</div></li> 30<li><div><input type="radio" name="select" id="s2">content 2</div></li> 31<li><div><input type="radio" name="select" id="s3">content 3</div></li> 32<li><div><input type="radio" name="select" id="s4">content 4</div></li> 33</ul> 34<hr> 35[ 36 <span class="s s1"> 37 <label for="s2">次へ</label> 38 </span> 39 <span class="s s2"> 40 <label for="s1">前へ</label> | 41 <label for="s3">次へ</label> 42 </span> 43 <span class="s s3"> 44 <label for="s2">前へ</label> | 45 <label for="s4">次へ</label> 46 </span> 47 <span class="s s4"> 48 <label for="s3">前へ</label> 49 </span> 50 | <span class="close">閉じる</span> 51 ] 52</dialog> 53<input type="button" id="dlg_open" value="open">

上記「次へ/前へ」についてはhtmlであらかじめスタティックに用意していますが、動的に設定することも可能です

参考

動的なnav

html

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 let styleText=""; 4 document.querySelectorAll('#dlg [name=select]').forEach((x,y,z)=>{ 5 const n=dlg.querySelector('.close'); 6 const span=Object.assign(document.createElement('span'),{className:`s s${y+1}`}); 7 styleText+=`ul:has(#s${y+1}:checked) ~ #nav .s:not(.s${y+1}){display:none;} `; 8 if(y<=z.length-2){ 9 const label=Object.assign(document.createElement('label'),{htmlFor:`s${y+2}`,textContent:'次へ'}); 10 span.appendChild(label); 11 } 12 if(y>=1){ 13 if(span.querySelector('label')){ 14 span.appendChild(new Text(' | ')); 15 } 16 const label=Object.assign(document.createElement('label'),{htmlFor:`s${y}`,textContent:'前へ'}); 17 span.appendChild(label); 18 } 19 nav.appendChild(span); 20 }); 21 document.head.appendChild(Object.assign(document.createElement('style'),{textContent:styleText})); 22}); 23document.addEventListener('click',({target})=>{ 24 if(target.matches('#dlg_open')){ 25 dlg.showModal(); 26 } 27 if(target.matches('#dlg .close')){ 28 dlg.close(); 29 } 30}); 31</script> 32<style> 33#dlg li:not(:has([name="select"]:checked)){ 34display:none; 35} 36#dlg ul{ 37list-style:none; 38padding:0; 39} 40[name=select]{display:none;} 41</style> 42<dialog id="dlg"> 43<ul> 44<li><div><input type="radio" name="select" id="s1" checked>content 1</div></li> 45<li><div><input type="radio" name="select" id="s2">content 2</div></li> 46<li><div><input type="radio" name="select" id="s3">content 3</div></li> 47<li><div><input type="radio" name="select" id="s4">content 4</div></li> 48</ul> 49<hr> 50[ <span id="nav"></span> | <span class="close">閉じる</span> ] 51</dialog> 52<input type="button" id="dlg_open" value="open">

投稿2024/07/08 02:15

編集2024/07/08 04:02
yambejp

総合スコア115870

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k_o

2024/07/08 08:20

具体的なソースコードのアドバイスを、ありがとうございます!! 今、詳細確認ができないので、詳細は夜に確認して、試してみます! その後の進捗については、またご連絡させて頂きますので何卒宜しくお願い致します。mm 取り急ぎ、御礼申し上げます。 ありがとうございます!
k_o

2024/07/09 09:52

教えて頂いたソースコードをベースに、組み込んでみたところ、dialogタグでも実装できそうでした。 まだdialogタグで作成するか、modaal.jsのライブラリで作成するか迷い中ですが、かなり作業が進展し、非常に感謝しております!!アドバイスありがとうございますmm
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問