これはiOS(およびiOSのみ)での通常の動作です。と要素overflow: hiddenの両方を宣言することで、この問題を回避できます。さらに、本体をに設定する必要があります。htmlbodyposition: 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つの間に違いはありません)。そうすれば、ボディオーバーフロー設定はビューポートに転送されず、に設定すると実際にはボディ要素に固定されます。visibleautohiddenoverflow: hidden
これで、ほとんどのコンテンツが非表示になります。ただし、例外があります。絶対的に配置される要素です。それらの最終的なオフセット親は、ボディではなくビューポートです。それらが画面の外、右または下のどこかに配置されている場合でも、それらまでスクロールできます。これを防ぐには、body要素をに設定するだけですposition: relative。これにより、配置されたコンテンツの親がオフセットされ、これらの要素がbodyボックスから外れるのを防ぐことができます。
コードで答える
注意すべき最後の落とし穴が1つあります。それは、ボディ自体がビューポートより大きくてはならないということです。
したがって、ボディはビューポートの幅と高さの100%に設定する必要があります。(これを実現するためのCSSのみの方法の功績は、このSOの回答htmlに当てはまります。)要素と要素のマージンはbody0である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%;
}
注意:ボディのパディングとボーダーは自由に設定できます。