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

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

ただいまの
回答率

87.34%

モーダルウィンドウを出して中身をスクロールするき、背景(body)も動いてしまうので固定したいです。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,274

score 12

 前提・実現したいこと

モーダルウィンドウを出して、その中のテキストをスクロールしようとすると、背景(body)が動いてしまいます。
モーダルが開いているときは、固定したいです。
PC、Androidは問題ないのですが、iOS11,10が動いてしまいます。

参考サイトをいろいろみましたが、iOSの仕様が変わったせいか、overflow: hidden;がきかなかったり、
背景固定で紹介しているサイトでも現在は動いてしまうものが多く、実現したいものが見つけられませんでした。

下記のサイトがわかりやすかったので、ここをベースにして背景固定にしたいですが、可能でしょうか。
http://cly7796.net/wp/smartphone/prevent-scrolling-with-ios/

 該当のソースコード

<header class="header">ヘッダー</header>
<div class="contents">
    <p>コンテンツ本文コンテンツ本文コンテンツ本文コンテンツ本文</p>
    <p>コンテンツ本文<button class="modal-link" data-modaibody="modal01">モーダル01</button>コンテンツ本文コンテンツ本文コンテンツ本文</p>
    ~略~
    <p>コンテンツ本文コンテンツ本文コンテンツ本文コンテンツ本文</p>
</div>
<footer class="footer">フッター</footer>

<div class="modal-bg"></div>
<div class="modal-contents">
    <button class="modal-close">閉じる</button>
    <div class="modal-scroll">
        <div id="modal01" class="modal-body">
            <p>モーダル01の中身です。</p>
        </div>
        <div id="modal02" class="modal-body">
            <p>モーダル02の中身です。</p>
            ~略~
            <p>モーダル02の中身です。</p>
        </div>
    </div>
</div>
html.is-fixed,
html.is-fixed body {
height: 100%;
    overflow: hidden;
}
.modal-bg {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(0, 0, 0, 0.4);
}
.modal-bg.is-show {
    display: block;
}
.modal-contents {
    display: none;
    position: fixed;
    top: 50%;
    left: 50%;
    width: 300px;
    height: 300px;
    transform: translate(-50%, -50%);
    background: #ffffff;
}
.modal-contents.is-show {
    display: block;
}
.modal-scroll {
    height: 100%;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    overflow-scrolling: touch;
}
.modal-body {
    display: none;
}
.modal-body.is-show {
    display: block;
}
.modal-close {
    position: absolute;
    top: -30px;
    right: 0;
}
$(function() {
    $('.modal-link').on('click', function() {
        var target = $(this).data('modaibody');
        $('html').addClass('is-fixed');
        $('.modal-bg').addClass('is-show');
        $('.modal-contents').addClass('is-show');
        $('#' + target).addClass('is-show');
    });

    $('.modal-close').on('click', function() {
        $('html').removeClass('is-fixed');
        $('.modal-bg').removeClass('is-show');
        $('.modal-contents').removeClass('is-show');
        $('.modal-body').removeClass('is-show');
    });
});

 試したこと

jsでtouchmove で event.preventDefault();をするというのもみつけましたが、
jsの記述の仕方がわからず、組み合わせることができずにいます。

 試したこと 2

Bootstrap4ではどうだろうとiOSでみてみました。
「長いコンテンツのスクロール」に、"モーダルはページ自体とは独立してスクロール。"とありますが、
これも背景が動く状態で参考にできませんでした。
https://cccabinet.jpn.org/bootstrap4/components/modal

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

dialogのサンプル

.d{height:500px;}
#d1{background-Color:yellow;}
#d2{background-Color:lime;}
#d3{background-Color:aqua;}
dialog{
  height:60px;
  width:250px;
  top:calc(50% - 30px);
  position:fixed;
  overflow-x:hidden;
  overflow-y:scroll;
}
dialog:not([open]) {
  display:none;
}
*::-ms-backdrop, dialog {
  color:red;
  padding:10px;
  background-Color:#ffffff;
  border:3px solid #000000;
  left:calc(50% - 125px);
  }
:-ms-lang(x), ::-webkit-meter-bar,dialog {
  padding:10px;
  background-Color:#ffffff;
  border:3px solid #000000;
  left:calc(50% - 125px);
}
window.addEventListener('DOMContentLoaded', function(e){
  document.querySelector('input[value=open').addEventListener('click',function(e){
    document.querySelector('dialog').setAttribute("open","open");
  });
  document.querySelector('dialog input[value=close]').addEventListener('click',function(e){
    var n=e.target;
    var p=null;
    while(n){
      n=n.parentNode;
      if(n.nodeName=="DIALOG"){
        n.removeAttribute("open");
        break;
      }
    }
  });
});
<dialog>
<span><input type="button" value="close"></span>
<hr>
<textarea size="10">
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccc
dddddddddddddddddddd
eeeeeeeeeeeeeeeeeeee
ffffffffffffffffffff
gggggggggggggggggggg
</textarea>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
</dialog>
<div id="d1" class="d">
<input type="button" value="open">
d1</div>
<div id="d2" class="d">d2</div>
<div id="d3" class="d">d3</div>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る