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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

JavaScript

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

569閲覧

[CSS、iOS]-webkit-overflow-scrolling:touch;を指定している領域の子要素をモーダルで表示すると親要素の範囲内にしか現れない

MakotoOoka

総合スコア51

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

JavaScript

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2019/01/18 03:01

編集2019/01/18 03:02

前提・実現したいこと

カルーセル内のコンテンツをモーダルで全画面表示させたい。

<ul>内のlistを-webkit-overflow-scrolling:touch;で 簡易カルーセルにしています。

list内にはモーダルを出現させる為のトリガーと
モーダルに表示するコンテンツが内包されています。

モーダル表示するコンテンツは
display:none;にしておいて
jQueryでfadeInさせています。

発生している問題・エラーメッセージ

windows:chrome、IE、Edge、firefox
android:chrome
では問題なく意図通りの動きになりましたが
iOS:safari、chrome
で動作させた際、

<ul>内にモーダルが表示され全画面表示になりません。 重なり順の問題かとz-indexなどを見直してみましたが 原因がわかりません。

調べてみると
https://github.com/scottjehl/Device-Bugs/issues/14
にoverflow-scrolling:touch;を指定していると
z-indexが無視されるようだという事が書かれていましたが
これを解消する方法がわかりません。

該当のソースコード

html

1<ul> 2 <li> 3 <label>button1</label> 4 <div><p>モーダル表示させるコンテンツ1</p></div> 5 </li> 6 <li> 7 <label>button2</label> 8 <div><p>モーダル表示させるコンテンツ2</p></div> 9 </li> 10 <li> 11 <label>button3</label> 12 <div><p>モーダル表示させるコンテンツ3</p></div> 13 </li> 14</ul>

css

1ul{ 2 width:100%; 3 overflow-x:scroll; 4 -webkit-overflow-scrolling:touch; 5 overflow-scrolling:touch; 6 display:flex; 7 list-style:none; 8} 9li{ 10 width:250px; 11 min-width:250px; 12 padding:20px; 13 box-sizing:border-box; 14 border:1px solid #CCC; 15} 16label{ 17 cursor:pointer; 18} 19label:after{ 20 content:none; 21} 22div{ 23 display:none; 24 position:fixed; 25 top:0;left:0;right:0;bottom:0; 26 z-index:100; 27 background-color:rgba(0, 0, 0, .70); 28 padding:30px; 29} 30p{ 31 background-color: #FFF; 32 padding:20px; 33}

jQuery

1$(function() { 2 var $overlay = $('div'); 3 $('label').on('click', function() { 4 $(this).next($overlay).fadeIn(300); 5 }); 6}); 7```※jQueryのver.は3.3.1です。 8### 試したこと 9 overflow-x:scroll; 10または 11 -webkit-overflow-scrolling:touch; 12を切ると意図通りの動きになりますが 13この2つを指定したままでモーダルを発動させたいのですが 14上手くいきません。

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

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

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

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

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

guest

回答1

0

自己解決

overflow-x:scroll;
-webkit-overflow-scrolling:touch;
の両方を指定している状態で実現する事は現状不可能に近い事が判明した為
モーダル表示させるコンテンツを<ul>要素の外にコピーして表示する方法で暫定的に実現。

フロー
1)カルーセルコンテンツの<label>をタップ
2)<label>要素の直後にある非表示状態モーダルコンテンツをコピー
3)カルーセルコンテンツの外にあるdiv.modalにコピーしたコンテンツをappend
4).modalをフェードイン
5)モーダルコンテンツ内の閉じるボタンをタップしたら
6).modalをフェードアウト
7).modalにペーストされていたコンテンツを空に戻す

という面倒な段階を踏むことになりましたが
一応意図通りの動きにはなりました。

これしか方法無いのかなぁ……。

HTML

1<ul> 2 <li> 3 <label>button1</label> 4 <div class="off"><div class="on"><p>モーダル表示させるコンテンツ1</p><button class="close">閉じる</button></div></div> 5 </li> 6 <li> 7 <label>button2</label> 8 <div class="off"><div class="on"><p>モーダル表示させるコンテンツ2</p><button class="close">閉じる</button></div></div> 9 </li> 10 <li> 11 <label>button3</label> 12 <div class="off"><div class="on"><p>モーダル表示させるコンテンツ3</p><button class="close">閉じる</button></div></div> 13 </li> 14</ul> 15<div class="modal"></div>

CSS

1ul{ 2 width:100%; 3 overflow-x:scroll; 4 -webkit-overflow-scrolling:touch; 5 overflow-scrolling:touch; 6 display:flex; 7 list-style:none; 8} 9li{ 10 width:250px; 11 min-width:250px; 12 padding:20px; 13 box-sizing:border-box; 14 border:1px solid #CCC; 15} 16label{cursor:pointer;} 17label:after{content:none;} 18.off{ 19 display: none;/*liモーダル表示させるコンテンツ(非表示)*/ 20} 21.on{ 22 padding:20px;/*ulの外にコピーする部分*/ 23} 24p{ 25 background-color: #FFF; 26 padding:20px; 27} 28.modal{ 29 display:none; 30 position:fixed; 31 top:0;left:0;right:0;bottom:0; 32 z-index:100; 33 background-color:rgba(0, 0, 0, .70); 34} 35button{cursor:pointer;}

jquery

1$(function() { 2 $("label").on('click',function(){ 3 //クリックされた要素の次のdivの小要素をコピーして.modalにペースト 4 $(this).next("div").children(".on").clone().appendTo(".modal"); 5 //.modalをフェードイン 6 $(".modal").fadeIn(300); 7 //.closeが押されたら 8 $("button").on("click",function(){ 9 $.when(//.modalをフェードアウトしてから 10 $(".modal").fadeOut(300) 11 ).done(//.modalにペーストした内容を削除 12 $(".modal").empty() 13 ) 14 }); 15 }); 16});

投稿2019/01/18 10:14

MakotoOoka

総合スコア51

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問