<body>に適用されたoverflow:hiddenはiPhone Safariで機能しますか?


131

overflow:hiddenに適用される<body>iPhoneのSafariで動作しますか?そうではないようです。それを達成するためにウェブサイト全体にラッパーを作成することはできません...

あなたは解決策を知っていますか?

例:長いページがあり、「折り目」の下にあるコンテンツを非表示にしたいのですが、iPhone / iPadで動作するはずです。


1
自分自身でこれに対する答えを見つけるために必死に探しています。
mwilcox、2010年

回答:


115

同様の問題がありoverflow: hidden;、両方に適用して問題htmlbody解決したことがわかりました。

html,
body {
    overflow: hidden;
} 

iOS 9の場合、代わりにこれを使用する必要がある場合があります:(ありがとうchaenu!)

html,
body {
    overflow: hidden;
    position: relative;
    height: 100%;
}

12
これはiOS Safariでは機能しません。位置:親族も必要です。
Kevin Borders

5
はい、相対とオーバーフローの両方をhtml + bodyに追加します
wutang

3
これはiOS 9では機能しません。本文とhtmlの相対位置を使用しても
Charles John Thompson III

1
警告の言葉、<html>タグにオーバーフローが隠されていると、jQueryのスクロールイベントが中断します
Brett Gregson

2
これはiOS 9、Safariでは機能しません。追加後も、ボディは引き続きスクロール可能position: relativeです。
江戸

87
body {
  position:relative; // that's it
  overflow:hidden;
}

3
感謝。君は。要素がビューポートの外側から内側に遷移するときに大きな問題がありました。コンテンツが拡張されるという奇妙なバグが発生するでしょう。これが私の解決策でした!
エリック14

48
私の場合、「position:relative」を追加しても効果はありませんでしたが、「position:fixed」を追加するとうまくいきました。
LeastOne 2015年

1
これはうまくいきました。私は、モバイルナビゲーションでコンテンツを確認してほしいサイトを構築しています。ただし、開いているときは、ナビゲーションの背後にあるコンテンツがバックグラウンドでスクロールします。位置、オーバーフロー、高さに関する他の回答も機能しましたが、高さを指定すると、ナビを開くとページが一番上にジャンプします。それは私の状況に固有のものだと思いますが、オーバーレイされたナビゲーションを持つ他の誰かが同じ問題を抱えている場合に備えて、私はそれを言及したいと思いました
moonunit7 2016

ラッパーはどこに行きますか?これは完全な答えですか?
クーゲル2017

8
固定位置を追加することで問題解決ますが、ページが一番上にジャンプします。これは、メニューまたはモーダルを表示しているときにこれをバックグラウンドで実装している場合、UXにとっては悪いことです。優れたUXを作成するには、位置をロックする前に、ページのスクロール位置を保存し、ロック解除後に再度適用する必要があります。
マイク

27

ここにリストされているいくつかの解決策は、弾性スクロールをストレッチするときにいくつかの奇妙な不具合がありました。私が使用したことを修正するには:

body.lock-position {
  height: 100%;
  overflow: hidden;
  width: 100%;
  position: fixed;
}

出典:http : //www.teamtownend.com/2013/07/ios-prevent-scrolling-on-body/


4
これは便利です(私の場合、よりもうまく機能しposition: relativeます)。ただし、デフォルトのスタイル(メニューを閉じるなど)に戻した後、スクロール位置が失われます。
jmarceli 2017年

1
スクロール位置のためには、このような何かをjsファイル(この例ではjqueryの)を使用することができます // on menu open // save window pos $('body').attr( 'data-pos', $(window).scrollTop() ) ; // ... // on menu close // scroll to saved window pos $( window ).scrollTop( $('body').attr( 'data-pos' ) );
デイビー

それは本当に私にとってカチカチでした!
D.Steinel 2017年

8

iOS 8および9で本日この問題が発生しましたが、高さを追加する必要があるようです:100%;

だから追加

html,
body {
  position: relative;
  height: 100%;
  overflow: hidden;
}

4

ここで回答とコメントを結合し、ここで同様の質問を結合しますうまくいきました。

したがって、全体として回答を投稿します。

これは、サイトコンテンツのラッパーdivを<body>タグのすぐ内側に配置する方法です。

 <!DOCTYPE HTML>
 <html>
 <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <!-- other meta and head stuff here -->
 <head>
 <body>
     <div class="wrapper">
         <!-- Your site content here -->
     </div>
 </body>
 </html>

以下のようにラッパークラスを作成します。

.wrapper{
    position:relative; //that's it
    overflow:hidden;
}

私もここでこの答えからアイデアを得ました

そして、ここでのこの答えは、思考の糧も持っています。デスクトップとデバイスの両方で同じように機能するもの。


これが私の解決策でした。
Roel Magdaleno

1
これにより、モーダルが閉じられたときにページが上にスクロールされます。
Jason


4

私にとってこれ:

height: 100%; 
overflow: hidden; 
width: 100%; 
position: fixed;

SafariのiOSでは十分ではありませんでした。私も追加する必要がありました:

top: 0;
left: 0;
right: 0;
bottom: 0;

それをうまく機能させるために。今はうまくいきます:)


2

私は<body><div class="wrapper">

ポップアップが開くと......

<body> 100%の高さとオーバーフローを取得します:非表示

<div class="wrapper"> 位置を取得:相対;オーバーフロー:非表示;高さ:100%;

JS / jQueryを使用してページの実際のスクロール位置を取得し、その値を本体のデータ属性として格納します

次に、.wrapper DIVのスクロール位置までスクロールします(ウィンドウではありません)

これが私の解決策です:

JS / jQuery:

// when popup opens

$('body').attr( 'data-pos', $(window).scrollTop()); // get actual scrollpos
$('body').addClass('locked'); // add class to body
$('.wrapper').scrollTop( $('body').attr( 'data-pos' ) ); // let wrapper scroll to scrollpos

// when popup close

$("body").removeClass('locked');
$( window ).scrollTop( $('body').attr( 'data-pos' ));

CSS:

body.locked {position:relative;overflow:hidden;height:100%;}
body.locked .wrapper {position:relative;overflow:hidden;height:100%;}

それは両側でうまく働きます...デスクトップとモバイル(iOS)。

ヒントと改善は大歓迎です:)

乾杯!


1
html {
  position:relative;
  top:0px;
  left:0px;
  overflow:auto;
  height:auto
}

これをあなたのCSSにデフォルトとして追加してください

.class-on-html{
  position:fixed;
  top:0px;
  left:0px;
  overflow:hidden;
  height:100%;
}

このクラスのtoggleClassはページをカットします

このクラスをオフにすると、最初の行はスクロールバーを呼び出します。


0

はい、これは、overflow:hiddenを使用してdivのクリアを処理する場合に、レイアウトを壊してしまうSafariの新しいアップデートに関連しています。


10
これについて詳しく説明したり、出典を引用したりできますか?この答えは正しいかもしれませんが、あまり役に立ちません。
pjmorse 2014年

0

適用されますが、DOM内の特定の要素にのみ適用されます。たとえば、テーブル、td、またはその他の要素では機能しませんが、<DIV>タグでは機能します。
例えば:

<body>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>

iOS 4.3でのみテストされています。

細かい編集:overflow:scrollを使用して2本の指のスクロールが機能するようにするとよいでしょう。


0

要素に表示したくないコンテンツをクラスでラップし、そのクラスをdisplay:noneiphoneやその他のハンドヘルドデバイス専用のスタイルシートに設定してみませんか?

<!--[if !IE]>-->
<link media="only screen and (max-device-width: 480px)" href="small-device.css" type= "text/css" rel="stylesheet">
<!--<![endif]-->

0

これが私がしたことです:私はボディのy位置を確認してから、ボディを固定し、トップをその位置のネガティブに調整します。逆に、本文を静的にして、スクロールを前に記録した値に設定します。

var body_x_position = 0;

function disable_bk_scrl(){

    var elb = document.querySelector('body');

    body_x_position = elb.scrollTop;
    // get scroll position in px

    var body_x_position_m = body_x_position*(-1);
    console.log(body_x_position);

    document.body.style.position = "fixed";

    $('body').css({ top: body_x_position_m });

}

function enable_bk_scrl(){  

    document.body.style.position = "static";

    document.body.scrollTo(0, body_x_position);

    console.log(body_x_position);
}

-3

本体の高さを300ピクセル未満に変更するだけです(ランドスペースのモバイルビューポートの高さは約300ピクセルから500ピクセルです)。

JS

$( '.offcanvas-toggle' ).on( 'click', function() {
    $( 'body' ).toggleClass( 'offcanvas-expanded' );
});

CSS

.offcanvas-expended { /* this is class added to body on click */
    height: 200px;
}
.offcanvas {
    height: 100%;
}

あまりエレガントなソリューションではなく、選択した特定のピクセルよりも大きいiOSデバイスで問題が発生します。別のソリューションを使用する必要があります。
Badrush
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.