Прокручиваемый изгиб ребенка с flex-grow 1 - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь создать прокручиваемый flex-child, высота которого определяется его свойством flex-grow.

Пример:

.container {
  display: flex;
  flex-direction: column;
  height: 100%;
}

.heading {
  background: #9D8189;
  flex: 0 0 auto;
  padding: 2rem;
  min-height: 10rem;
}

.content {
  background: #FFE5D9;
  flex: 1 0 auto;
  padding: 2rem;
  /* Makes it scrollable but breaks the flexbox layout */
  max-height: 40vh;
  overflow: scroll;
}

.box {
  background: #D8E2DC;
  padding: 7rem;
}
<body>
  <div class="container">
    <div class="heading">heading</div>
    <div class="content">
      <div class="box">box1</div>
      <div class="box">box2</div>
      <div class="box">box3</div>
    </div>
  </div>
</body>

( jsfiddle )

Макет состоит из flex-parent .container и двух flex-children:

  • .heading, который имеет фиксированную высоту, определяемую padding и min-height и
  • .content, который должен занять все оставшееся после .heading пробела. Для этого у первого flex-child (.heading) есть flex: 0 0 auto, а у второго flex-child (.content) - flex: 1 0 auto.

Тем не менее, я также хочу, чтобы .content содержал прокручиваемый контент внутри. На данный момент единственный способ, которым я вижу, что я могу это сделать, это заставить .content иметь несколько фиксированную высоту (например, через max-height, как я делал в приведенном примере, установив его на 40vh). Но хотя он делает его прокручиваемым, он также нарушает компоновку flexbox, где высота content равна parent высота минус heading высота.

Кажется, что как только я указываю .content высоту, он перестает уважать расположение flexbox, что имеет смысл. Но есть ли другой способ сделать его прокручиваемым, сохраняя при этом его высоту, которая определяется макетом flexbox?

Ответы [ 2 ]

1 голос
/ 11 мая 2019

height:100% требует вычисления height из родительского элемента, если только сам элемент не является HTML. Вам нужно: html, body, {height:100%}, поэтому .container {height:100%} в качестве значения, значение height будет унаследовано от HTML (окно браузера), затем от BODY и, наконец, .container.

VH также может использоваться вместо %, чтобы упростить его.

.container должен быть установлен на overflow:hidden, чтобы позволить детям прокручиваться, достигнув предела родителя.

Пример кода:

* {
  box-sizing: border-box;
  padding: 0;
  margin: 0;
}

.container {
  display: flex;
  flex-direction: column;
  height: 100vh;/* update */
  overflow:hidden;/* update */
}

.heading {
  background: #9D8189;
  /*flex: 0 0 auto; */
  padding: 2rem;
  min-height: 10rem;/* if needed */
}

.content {
  background: #FFE5D9;
  flex: 1 ;/* make it simple */
  padding: 2rem;
  overflow: auto;/* scroll if needed */
}

.box {
  background: #D8E2DC;
  padding: 7rem;
}
  <div class="container">
    <div class="heading">heading</div>
    <div class="content">
      <div class="box">box1</div>
      <div class="box">box2</div>
      <div class="box">box3</div>
      <div class="box">box3</div>
    </div>
  </div>
0 голосов
/ 11 мая 2019

Поместите min-height: 0 в. content стиль класса, и он должен работать так, как вы ожидаете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...