最大高さの子:100%が親からオーバーフローしています


139

私は予期しない動作と思われるものを理解しようとしています:

max-heightを使用するコンテナー内にmax-heightが100%の要素がありますが、予期せず、子が親からオーバーフローします。

テストケース:http : //jsfiddle.net/bq4Wu/16/

.container {  
    background: blue; 
    padding: 10px; 
    max-height: 200px; 
    max-width: 200px; 
}

img { 
    display: block;
    max-height: 100%; 
    max-width: 100%; 
}

ただし、親に明示的な高さが指定されている場合、これは修正されています。

テストケース:http : //jsfiddle.net/bq4Wu/17/

.container {  
    height: 200px;
}

子供が最初の例で親の最大高さを尊重しない理由を誰かが知っていますか?明示的な高さが必要なのはなぜですか?

回答:


209

max-height子供のパーセンテージを指定する場合max-height奇妙なことに、親の高さではなく、親の実際の高さのパーセンテージです。同じことがにも当てはまりますmax-width

したがって、親に明示的な高さを指定しない場合、子のmax-height計算に使用max-heightするベースの高さはないため、を計算しnone、子をできるだけ高くすることができます。現在、子に作用する他の唯一の制約max-widthはその親の制約であり、画像自体は幅よりも高いので、全体として可能な限り大きいままでアスペクト比を維持するために、コンテナーの高さを下にオーバーフローします。

親に明示的な高さを指定すると、子は最大でその明示的な高さの100%でなければならないことを認識します。これにより、(アスペクト比を維持したまま)親の高さに制限できます。


4
これは、特に私の友人の入力と混合された有用な説明です:「max-height:100%(子)of max-height:100%(親)= 0-これが、子が親の値を尊重しない理由です」。
iamkeir 2013年

8
どちらを受け入れるかわかりません-これは「なぜ」に答えます。
iamkeir 2013年

それが明確に言及されていないのであなたの目標が何であるかわからないので、私は「なぜ」に答えました。多分それについて詳しく述べれば、私はそれに答えることができます。
BoltClock

それが私の実際の質問に答えるのでこれを受け入れました、ありがとう。以下の@Danielの回答が修正を提供することに注意してください。
iamkeir 2013年

私の場合display: flex; flex-direction: column、問題を解決し、必要なスクロールバーを追加しました。
xdevs23

73

少し遊んだ。firefoxの大きな画像では、inheritプロパティ値を使用して良い結果が得られました。これは役に立ちますか?

.container {
    background: blue;
    padding: 10px;
    max-height: 100px;
    max-width: 100px;
    text-align:center;
}

img {
    max-height: inherit;
    max-width: inherit;
}

どちらを受け入れるかわかりません-これは「修正」に答えます。
iamkeir 2013年

理由に答えて@BoltClockを受け入れましたが、修正を提供していただきありがとうございます。
iamkeir 2013年

1
@BoltClockに加えて、私の答えは彼の言うことを正確に実行することです。CSSはコンピューターに要素の処理方法を指示するだけですが、計算後、すべての値を高さ、幅、色、座標などのレンダリングに必要な基本的な値に区切ります。継承プロパティはimgに親の「計算された」値を取ります。したがって、max-heightおよびmax-width cssプロパティで高さと幅の計算値を取得します。
Daniel

2
max:height: 100%高さが固定されていない場合、これは機能しません。jsfiddle.net
umbreak

2
幅と高さを修正済みとして宣言できないため、レイアウトが反応しdispaly: flex;ます。新しいスレッドを開きました:新しいスレッドを開きました:stackoverflow.com/questions/29732391/… ただし、最悪の場合、Jqueryを使用してimgの実際の幅と高さを取得し、親画像のdivに設定できます。
Didac Montero、

7

私はここで解決策を見つけました:http : //www.sitepoint.com/maintain-image-aspect-ratios-responsive-web-design/

トリックは要素のWIDTHとPADDING-BOTTOMの間に関係があるために可能です。そう:

親:

container {
  height: 0;
  padding-bottom: 66%; /* for a 4:3 container size */
  }

子(width関連するすべてのcssを削除、つまり、width:100%):

img {
  max-height: 100%;
  max-width: 100%;
  position: absolute;     
  display:block;
  margin:0 auto; /* center */
  left:0;        /* center */
  right:0;       /* center */
  }

5

プロパティobject-fitを使用できます

.cover {
    object-fit: cover;
    width: 150px;
    height: 100px;
}

ここに提案されたように

Dev.OperaのChris Millsによるこのプロパティの完全な説明

そしてCSS-Tricksでさらに良いもの

それはでサポートされています

  • Chrome 31以降
  • Safari 7.1以降
  • Firefox 36以降
  • Opera 26以上
  • Android 4.4.4以降
  • iOS 8以降

私はビバルディとクロムがそれをサポートしていることを確認しました(ここでは驚きません)

現在IEではサポートされていませんが、... 気になりますか?また、iOSはオブジェクトフィットをサポートしていますが、オブジェクトの位置はサポートしていませんが、まもなくサポートされます。


素敵な代替品!IEの適切な低下が許容できる場合、フレックスボックスも潜在的に支援できると思います。
iamkeir 2015

3

これは、この質問の複製としてマークされた、最近開いた質問の解決策です。<img>タグは、親の最大の高さを超えました<div>

壊れた:フィドル

働く:フィドル

この場合、display:flex2つの親<div>タグに追加することが答えでした


3

max-height:100%/ 100%を使用する代わりに、すべてのスペースを埋める別のアプローチはposition: absolute、top / bottom / left / rightを0に設定して使用します。

つまり、HTMLは次のようになります。

<div class="flex-content">
  <div class="scrollable-content-wrapper">
    <div class="scrollable-content">
      1, 2, 3
    </div>
   </div>
</div>
.flex-content {
  flex-grow: 1;
  position: relative;
  width: 100%;
  height: 100%;
}

.scrollable-content-wrapper {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  overflow: auto;
}

.scrollable-content {
}

Codesandbox-CSS Flex / Grid内のオーバーフローでライブの例を見ることができます


2

多分誰かがあなたの問題の背後にある理由を説明することができますが、あなたはコンテナの高さを指定してから、画像の高さを100%に設定することでそれを解決することができます。width画像のがの前に表示されることが重要ですheight

<html>
    <head>
        <style>
            .container {  
                background: blue; 
                padding: 10px;
                height: 100%;
                max-height: 200px; 
                max-width: 300px; 
            }

            .container img {
                width: 100%;
                height: 100%
            }
        </style>
    </head>
    <body>
        <div class="container">
            <img src="http://placekitten.com/400/500" />
        </div>
    </body>
</html>

画像が200x200より小さい場合にコンテナを小さくしたい場合は、はい、min-height / max-heightを使用する必要があります。
cimmanon 2013年

2

私がこれに到達できる最も近いのはこの例です:

http://jsfiddle.net/YRFJQ/1/

または

.container {  
  background: blue; 
  border: 10px solid blue; 
  max-height: 200px; 
  max-width: 200px; 
  overflow:hidden;
  box-sizing:border-box;
}

img { 
  display: block;
  max-height: 100%; 
  max-width: 100%; 
}

主な問題は、高さがコンテナの高さのパーセンテージを取るため、最大高さではなく、親コンテナで明示的に設定された高さを探していることです。

これをある程度見ることができる唯一の方法は、オーバーフローを非表示にすることができる上のフィドルですが、パディングは画像が流れ込むための可視スペースとして機能するため、代わりに実線の境界線で置き換えることができます(そして必要な幅であれば、ボーダーボックスを追加して200pxにします)

これがあなたがそれを必要とするものに合うかどうかはわかりませんが、私が達成できるように見える最高のものです。


残念ながら、画像のトリミングは理想的ではありません。あなたの入力をありがとう。
iamkeir 2013年


1

コンテナは、通常、コンテンツを適切にラップします。それはしばしば逆にうまく機能しません:子供たちは祖先をうまく満たしません。したがって、幅/高さの値を最も外側の要素ではなく最も内側の要素に設定し、外側の要素がその内容をラップするようにします。

.container {
    background: blue;
    padding: 10px;
}

img {
    display: block;
    max-height: 200px;
    max-width: 200px;
}

いい感じ、これが好きです。
iamkeir

0

コンテナに高さがありません。

高さを追加:200px;

コンテナのCSSと子猫は中にとどまります。


入力ありがとうございますが、私はこれをOPで識別しました。
iamkeir 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.