Ребенок с максимальной высотой: 100% переполняет родительский

Я пытаюсь понять, что для меня неожиданное поведение:

У меня есть элемент с максимальной высотой 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;
}

Кто-нибудь знает, почему ребенок не соблюдал максимальную высоту своего родителя в первом примере? Почему требуется явная высота?

Ответ 1

Когда вы укажете процент для max-height для дочернего элемента, это процент от фактической высоты родителя, а не родительский max-height, достаточно странно. То же самое относится к max-width.

Итак, если вы не укажете явную высоту для родителя, тогда нет базовой высоты для дочернего элемента max-height, поэтому max-height вычисляет до none, позволяя ребенку быть как как можно выше. Единственным другим ограничением, действующим теперь на дочерний элемент, является max-width его родительского элемента, и поскольку сам образ выше его ширины, он переполняет высоту контейнера вниз, чтобы поддерживать его соотношение сторон, но при этом все еще в размере возможно в целом.

Когда вы указываете явную высоту для родителя, тогда ребенок знает, что он должен быть не более 100% от этой явной высоты. Это позволяет ограничить родительскую высоту (сохраняя при этом ее соотношение сторон).

Ответ 2

.container {
  background: blue;
  padding: 10px;
  max-height: 200px;
  max-width: 200px;
  float: left;
  margin-right: 20px;
}

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

.img2 {
  display: block;
  max-height: inherit;
  max-width: inherit;
}
<!-- example 1  -->
<div class="container">
  <img class='img1' src="http://via.placeholder.com/350x450" />
</div>

<!-- example 2  -->

<div class="container">
  <img class='img2' src="http://via.placeholder.com/350x450" />
</div>

Ответ 3

Я нашел решение здесь: http://www.sitepoint.com/maintain-image-aspect-ratios-responsive-web-design/

Хитрость возможна, потому что существует связь между ШИРОКОЙ и ДОБАВКОЙ ДНА элемента. Итак:

Родитель:

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

дочерний элемент (удалить все CSS, относящиеся к ширине, то есть ширина: 100%):

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

Ответ 4

Возможно, кто-то еще может объяснить причины вашей проблемы, но вы можете решить ее, указав высоту контейнера, а затем установив высоту изображения на 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>

Ответ 5

Ближайшим, к которому я могу обратиться, является следующий пример:

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%; 
}

Основная проблема заключается в том, что высота принимает процент высоты контейнеров, поэтому она ищет явно установленную высоту в родительском контейнере, а не max-height.

Единственный способ обойти это в некоторой степени, я вижу, это скрипка выше, где вы можете скрыть переполнение, но затем заполнение по-прежнему действует как видимое пространство для изображения, и вместо этого заменяется сплошной рамкой (а затем добавление пограничного поля, чтобы сделать его 200px, если эта ширина вам нужна)

Не уверен, что это будет соответствовать тому, в чем вы нуждаетесь, но, пожалуй, лучше всего.

Ответ 6

Вы можете использовать свойство object-fit

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

Как предложено здесь

Полное объяснение этого свойства Chris Mills в Dev.Opera

И еще лучший в CSS-трюках

Поддерживается в

  • Chrome 31 +
  • Safari 7.1 +
  • Firefox 36 +
  • Opera 26 +
  • Android 4.4.4 +
  • iOS 8 +

Я только что проверил, что вивальди и хром поддерживают его (не удивительно)

В настоящее время он не поддерживается в IE, но... кто заботится? Кроме того, iOS поддерживает привязку к объектам, но не к объектной позиции, но скоро.

Ответ 7

Вот решение для недавно открытого вопроса, помеченного как дубликат этого вопроса. Тег <img> превышал максимальную высоту родительского <div>.

Сломан: скрипка

Работает: Fiddle

В этом случае добавление display:flex к 2 родительским тегам <div> было ответом

Ответ 8

Хорошее решение - не использовать высоту для родителя, а использовать его только для ребенка с View Port :

Пример скрипки: https://jsfiddle.net/voan3v13/1/

body, html {
  width: 100%;
  height: 100%;
}
.parent {
  width: 400px;
  background: green;
}

.child {
  max-height: 40vh;
  background: blue;
  overflow-y: scroll;
}

Ответ 9

Вместо того, чтобы использовать 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

Ответ 10

Ваш контейнер не имеет высоты.

Добавить   высота: 200 пикселей;

в контейнеры css, и котенок останется внутри.