これはiOS(およびiOSのみ)での通常の動作です。と要素overflow: hidden
の両方を宣言することで、この問題を回避できます。さらに、本体をに設定する必要があります。html
body
position: relative
オーバーフロー動作
ここではいくつかのことが行われています。修正が機能する理由を理解するには、最初にビューポートのオーバーフローがどのように設定されているかを確認する必要があります。
html
ビューポートのオーバーフローは、要素のオーバーフロー設定によって決定されます。
html
ただし、要素のオーバーフローをデフォルト( )のままにしておく限りvisible
、ボディのオーバーフロー設定はビューポートにも適用されます。つまり、ビューポートをターゲットにするときに、html
またはbody
を設定できます。overflow: hidden
これまでのところ、body要素自体のオーバーフロー動作は影響を受けません。
- これで、要素のオーバーフローを
html
以外visible
に設定すると、からビューポートへの転送はbody
発生しなくなります。特定のケースでは、両方のオーバーフローをhidden
に設定すると、html
要素の設定がビューポートに適用され、body
要素はそのオーバーフローも非表示にします。
これは実際には、iOSに固有のものではなく、そこにあるすべての合理的に最新のブラウザに当てはまります。
iOSの癖
現在、iOSはoverflow: hidden
ビューポートを無視します。ブラウザは、CSSで何を宣言したかに関係なく、コンテンツ全体を表示する権利を留保します。これは意図的なものであり、バグではなく、iOS 7および8でも引き続き当てはまります。これについても、誰もできることはありません。オフにすることはできません。
ただし、ビューポートではなくボディ要素自体にオーバーフローを非表示にすることで、この問題を回避できます。これを実現するには、最初に要素のオーバーフローを、またはなど以外の値に設定する必要があります(iOShtml
では、2つの間に違いはありません)。そうすれば、ボディオーバーフロー設定はビューポートに転送されず、に設定すると実際にはボディ要素に固定されます。visible
auto
hidden
overflow: hidden
これで、ほとんどのコンテンツが非表示になります。ただし、例外があります。絶対的に配置される要素です。それらの最終的なオフセット親は、ボディではなくビューポートです。それらが画面の外、右または下のどこかに配置されている場合でも、それらまでスクロールできます。これを防ぐには、body要素をに設定するだけですposition: relative
。これにより、配置されたコンテンツの親がオフセットされ、これらの要素がbodyボックスから外れるのを防ぐことができます。
コードで答える
注意すべき最後の落とし穴が1つあります。それは、ボディ自体がビューポートより大きくてはならないということです。
したがって、ボディはビューポートの幅と高さの100%に設定する必要があります。(これを実現するためのCSSのみの方法の功績は、このSOの回答html
に当てはまります。)要素と要素のマージンはbody
0であるhtml
必要があり、パディングや境界線も含まれていてはなりません。
最後に、ボディのパディングに対処するために、そしてボディに境界線を設定したい場合は、ボディに対して数学を機能box-sizing: border-box
させます。
だからここに行きます。
html {
overflow: hidden;
height: 100%;
margin: 0;
padding: 0;
border: none;
}
body {
overflow: hidden;
position: relative;
box-sizing: border-box;
margin: 0;
height: 100%;
}
注意:ボディのパディングとボーダーは自由に設定できます。