HTML div растет за пределы максимальной высоты родительского контейнера

#html #css

#HTML #css

Вопрос:

Я знаю, что есть множество вопросов, задающих одно и то же, но ни одно из решений, с которыми я столкнулся, не подходит для сценария, который я настроил.

У меня есть простая структура, которая имеет один основной внешний div и внутренний div. Внутри внутреннего div я разделил на два по высоте 10% и 90% соответственно. Кажется, что второе разделение выходит за рамки ограничений, установленных max-height, и я не могу понять, почему.

РЕДАКТИРОВАТЬ Мне нужно, чтобы полоса прокрутки присутствовала во втором разделении (.content), а не во внутреннем div (.main-body)

 .outer-layer {
  position: fixed;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, .6);
  z-index: 15000;
  top: 0;
  left: 0;
  padding: 10px;
}
.main-body {
  position: fixed;
  top: 18%;
  left: 18%;
  background: #fff;
  width: 60%;
  min-height: 30%;
  max-height: 60%;
  padding: 10px;
}
.header {
  height: 10%;
  max-height: 10%;
  background: red;
}
.content {
  max-height: 90%;
  width: calc(100% - 20px);
  height: 90%;
  background: blue;
  padding: 10px;
  overflow: auto;
}  
 <div class="outer-layer">
  <div class="main-body">
    <div class="header">
      <h2>Hello</h2>
      <!--header-->
    </div>
    <div class="content">
      <p>dynamic content</p>
      <p>dynamic content</p>
      <p>dynamic content</p>
      <p>dynamic content</p>
      <p>dynamic content</p>
      <p>dynamic content</p>
      <!--content-->
    </div>
    <!--body-->
  </div>
  <!--overlay-->
</div>  

В настоящее время я тестирую в Chrome

Я включил эту скрипку

Ответ №1:

Является ли этот JSFiddle тем, к чему вы стремитесь?

В вашей первоначальной версии было несколько небольших сбоев, которые я исправил и изложил ниже…

1. Вы не можете использовать высоту в процентах для элемента, родительский элемент которого не имеет заданной высоты. Поскольку вы не указываете .main-body заданную высоту, его дочерние элементы не будут учитывать высоты в процентах. Это решается путем указания .main-body высоты.

2. Ваш <h2> имеет большие вертикальные поля, и поэтому его высота увеличивается по сравнению с высотой его родителя. Удалите их, выполнив h2 {margin: 0;} .

3. Помните, что заполнение является аддитивным! заполнение 10 пикселей как в верхней, так и в нижней части элемента добавит 20 пикселей к его высоте. Вы можете использовать box-sizing: border-box; свои элементы, чтобы избежать этого — это заставляет элемент применять их отступы внутрь, а не наружу, тем самым не влияя на его высоту / ширину.

Комментарии:

1. Я был немного несправедлив, чтобы включить тег h2 в скрипку, но хороший глаз. На самом деле я использовал стилизованный тег span в своем реальном решении.

Ответ №2:

Страница должна отображать информацию независимо. Предполагая, что внутреннее содержимое больше внешнего, using overflow создает для вас полосу прокрутки.

 .main-body {
  overflow-y: scroll;
}
  

http://www.w3schools.com/cssref/pr_pos_overflow.asp


После редактирования обновлений:

 .header {
  position:fixed;
  width: 60%;
}

.content {
  margin-top: 10%; // To match the header's height
}
  

Стиль будет отключен, но вы можете настроить его так, чтобы он лучше соответствовал вашему проекту.

Комментарии:

1. В данном случае это не проблема. Изменение переполнения не будет иметь никакого эффекта.

2. Извините, я изначально пропустил одну часть своего вопроса. Пожалуйста, смотрите Обновление

Ответ №3:

JSfiddle: https://jsfiddle.net/nu5LkL6b/9 /

Как обсуждалось: вы не можете использовать высоту в процентах для элемента, родительский элемент которого не имеет заданной высоты. Поскольку вы не задаете .main-body заданную высоту, его дочерние элементы не будут учитывать высоты, основанные на процентах. Это решается путем присвоения .main-body высоты.

Маленький Enhc:

 .content {
  max-height: 90%;
  width: calc(100% - 20px);
  height: calc(90% - 20px);
  background: blue;
  padding: 10px;
  overflow: auto;
}
  

CSS:

 .outer-layer {
  position: fixed;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, .6);
  z-index: 15000;
  top: 0;
  left: 0;
  padding: 10px;
}
.main-body {
  position: fixed;
  top: 18%;
  left: 18%;
  background: #fff;
  width: 60%;
  min-height: 30%;
  height: 60%;
  padding: 10px;
}
.header {
  height: 10%;
  max-height: 10%;
  background: red;
}
.content {
  max-height: 90%;
  width: calc(100% - 20px);
  height: calc(90% - 20px);
  background: blue;
  padding: 10px;
  overflow: auto;
}
h2 {
  margin-top: 0;
}
  

Ответ №4:

У вас h2 есть «собственный» запас, который добавляется к main-body высоте и разбивает процент. Удалите это поле. Тогда у вас main-body есть отступы, которые также добавляют дополнительные пиксели. Удалите его, и 90% 10% он подойдет 100% .

 h2 {
    margin: 0;
}

.outer-layer {
  position: fixed;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, .6);
  z-index: 15000;
  top: 0;
  left: 0;
  padding: 10px;
}
.main-body {
  position: fixed;
  top: 18%;
  left: 18%;
  background: #fff;
  width: 60%;
  min-height: 30%;
  max-height: 60%;
}
.header {
  height: 10%;
  max-height: 10%;
  background: red;
}
.content {
  max-height: 90%;
  width: calc(100% - 20px);
  height: 90%;
  background: blue;
  padding: 10px;
  overflow: auto;
}  
 <div class="outer-layer">
  <div class="main-body">
    <div class="header">
      <h2>Hello</h2>
      <!--header-->
    </div>
    <div class="content">
      <p>dynamic content</p>
      <p>dynamic content</p>
      <p>dynamic content</p>
      <p>dynamic content</p>
      <p>dynamic content</p>
      <p>dynamic content</p>
      <!--content-->
    </div>
    <!--body-->
  </div>
  <!--overlay-->
</div>  

Комментарии:

1. Я считаю, что проблема OP заключается в том, что синий div должен иметь максимальную высоту, а не расширяться до длины его содержимого.

2. @Santi Он на самом деле не говорит, чего он ожидает. Мы должны угадать. Я думаю, что как моя, так и ваша интерпретация и ответы являются действительными.

3. Он сказал: «Второе разделение, похоже, выходит за рамки ограничений, установленных max-height, и я не могу понять, почему».

4. @Santi, да, и мой ответ, и ваш, и overflow: hidden / scroll в основном тексте означает, что «второе разделение не выходит за рамки ограничений, установленных max-height»…

5. Взгляните на скрипку вашего ответа. Высота белого div в вашем примере составляет 402 пикселя. Высота синего div — с максимальной высотой 90% — составляет 1600 пикселей. Я не верю, что ваш пример разрешает «второе разделение, превышающее ограничения, установленные max-height».

Ответ №5:

вам нужно добавить высоту к родительскому элементу, т.е .main-body

  .main-body{
        height:72%;    /* added */
        padding:0px;  /* editied  */
    }
    .header{
      height:20%;   /* edited*/
      max-height:20%; /* edited but actually not needed to have max height */
    }