身長100%で縦スクロールバーを表示


84

好奇心から、以下の例を考慮すると、#container divにマージンがあると、ブラウザーに垂直スクロールバーが表示されるのはなぜですか?コンテナの高さは、100%に設定されている本体の高さよりもはるかに小さくなっています。

#containerを除くすべての要素のパディングとマージンを0に設定しました。#containerdivの絶対位置を意図的に省略していることに注意してください。この場合、ブラウザは体の高さをどのように計算し、マージンはそれにどのように影響しますか?

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
* { padding:0; margin:0;}
html, body { height:100%; }
#container
{
  padding:10px;
  margin:50px;
  border:1px solid black;
  width: 200px;
  height: 100px;
}
</style>
</head>
<body>
  <div id='container'>
  </div>
</body>
</html>

JSFiddleの


回答:


65

htmlとの背景をペイントするとbody(それぞれが独自の色を与える)、あなたはすぐに気づくbodyとともに、シフトダウンしている#container、と#container自体が上からオフセットされていないbodyすべての。これはマージン崩壊の副作用であり、ここで詳しく説明します(ただし、その回答はわずかに異なる設定について説明しています)。

宣言したので、スクロールバーが表示されるのはこの動作です bodyの高さを100%しているですhtmlbodyマージンは高さの計算に含まれないため、の実際の高さは影響を受けないことに注意してください。


これは、ページ上の要素の高さが、ウィンドウ、本文、本文の内側または上の要素の順に計算されることを意味しますか?すべてのパーセンテージはpx、pt、またはemの値に変換されますか?
TMB 2012年

5
@TMB:高さhtmlが100%の場合、ビューポート(ブラウザの表示領域)の100%になり、高さbodyが100%の場合、親の100%になりhtmlます。以下のパーセンテージは、常に要素の祖先のパーセンテージです。高さを100%に設定しない場合、htmlまたはbody他のブロック要素と同じように動作します。詳細については、w3.org / TR / CSS21 / syndata.html#percentage-unitsを参照してください。%sとemsは、ブラウザが画面上で物事を測定してレンダリングするためにどれだけ大きいか小さいかを正確に知るために、レンダリング中に最終的にすべて絶対値に変換する必要があります。
BoltClock

1
@neodymium:その通りです。両方ともhtmlbody他のブロックレベルの要素と同じように動作します。
–BoltClock

8
では、どのように修正する必要がありますか?ミシェルが示唆するようにコンテナを浮かせることによって?
ダンダスカレスク2015

1
@Daniel Albuschat:光栄です!
BoltClock

19

少し遅れますが、多分それは誰かを助けます。

W3Cが言うように、に追加するとスクロールバーfloat: left;#container削除されます。

•フロートボックスと他のボックスの間のマージンは折りたたまれません(フロートとその流入する子の間でも)。


18

@ BoltClock♦の答えに基づいて、マージンをゼロにすることで修正しました...
だから

html,body, #st-full-pg {
   height: 100%;
   margin: 0;
}

id "st-full-pg"がパネルdiv(さらにpanel-headingとpanel-bodyを含む)に割り当てられている場合に機能します


3

追加するのfloat:left;は良いことですが、を使用して中央の水平位置を妨げることになりますmargin:auto;

マージンの大きさがわかっている場合は、calcを使用して身長のパーセンテージでそれを説明できます。

height: calc(100% - 50px);

ブラウザのサポートは良好ですが、IE11 +のみ https://caniuse.com/#feat=calc


なぜ50px?マジックナンバー。
Ivan Rubinson 2018

「マージンがどれだけ大きいか知っているなら。」OPが50pxで参照しているものだと思います
クレイ

2
html,body {
   height: 100%;
   margin: 0;
   overflow: hidden;
}

これは私のために働いた


2
フッターがある場合は削除されます
Alexander

1

私は解決策を見つけました:パディングを追加します:1px 0; 本体に垂直スクロールバーが表示されないようにする


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

ボディスクロールを削除する場合は、次のスタイルを追加します。

body {
    height: 100%;
    overflow: hidden;
}

これにより、2本の垂直スクロールバーがあった問題が修正されました。htmlを設定overflow: hiddenし、本体をそのままにしておくと修正されました。私の体とhtmlの両方にがありますheight: 100%
karai17 2017年

0

のすべてのコンテンツをbodywrapというdivに入れる前に、この問題が修正されているのを見ました。ラップのスタイルはに設定する必要がありますposition: relative; min-height: 100%;。位置まで#container上からのdivは50pxとは50pxにパディングを設定してラップの内側のdivを入れたままに。マージンは、ラップと先ほど作成したdivでは機能しませんが、その#container中のすべてで機能します。

これがjsfiddleの修正です


0

@BoltClockに触発されて、これを試してみましたが、ズームアウトおよびズームインしても機能しました。

Browser: Chrome 51

html{
  height: 100%;
}
body{
  height: 100%;
  margin: 0px;
  position: relative;
  top: -20px;
}

body20px下にシフトしたと思います。


0
/*removes default margin & padding*/
html, body{
    padding: 0px !important;
    margin: 0px !important;
}

/*sets body height to max; and allows scrollbar as page content grows*/
body{
    min-height: 100vh;
}

0

コードサンプルも含まれている、より理解しやすい回答を求めてここに来る人にとって、この回答(ここからコピー)はあなたにぴったりです。

JavaScriptや明確なピクセル値(など100px)は必要ありません。純粋なCSSとパーセンテージだけです。

あなたのdivがそれだけでそこに座っている場合height: 50%、体の高さの50%を意味します。通常、体の高さは目に見えるコンテンツがない場合はゼロであるため、その50%はちょうどゼロです。

これは、(に基づくソリューションである。この(アンコメント)backgroundパディングの視覚化を得るためにラインを):

/* Makes <html> take up the full page without requiring content to stretch it to that height. */

html
{
  height: 100%;
  
  /* background: green; */
}

body
{
  /*
    100% the height of <html> minus 1 multiple of the total extra height from the padding of <html>.
    This prevents an unnecessary vertical scrollbar from appearing.
  */
  height: calc(100% - 1em);
  
  /* background: blue; */
}

/* In most cases it's better to use stylesheets instead of inline-CSS. */
div
{
  width: 50%;
  height: 50%;
  
  background: red;
}
<div></div>

上記は、通常のパディングが引き続き存在するように作成されています。あなたは赤の寸法を設定することができdiv100%、まだ各側面/端にパディングを参照してください。このパディングが必要ない場合は、これを使用してください(見栄えは良くありませんが、最初の例を使用することをお勧めします)。

/* Makes <html> take up the full page without requiring content to stretch it to that height. */

html, body
{
  height: 100%;
}

/* You can uncomment it but you wouldn't be able to see it anyway. */

/*
html
{
  background: green;
}
*/

body
{
  margin: 0;
  
 /* background: blue; */
}

/* In most cases it's better to use stylesheets instead of inline-CSS */
div
{
  width: 50%;
  height: 50%;
  
  background: red;
}
<div></div>


-2

overflow: hidden;HTMLと本文に追加します。

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

42
このソリューションは、スクロールバーを完全に削除します。スクロールが必要なページでも
Vil

1
最初の行のタイプミス、overflow:hidded
Tim Grant

-9

簡単な解決策を見つけました:高さを100%ではなく99.99%に設定してみてください


これがひどい考えである理由はたくさんあります。たとえば、ユーザーウィンドウごとの任意の高さの違いや、内部の丸め方法がブラウザによって異なることなどです。
テラアシュリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.