Как иметь дополнительный макет разделенного экрана в HTML/CSS?

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

Что я хочу иметь, так это дополнительную нижнюю панель, которую можно показать или скрыть по запросу пользователя, которая всегда будет занимать нижние 25% экрана. Плитки выше должны затем сжаться до панели прокрутки НАД ней, чтобы вы могли независимо прокручивать плитки, не изменяя положение нижней панели.

Поэтому мне нужен внешний контейнер, который всегда составляет 100% высоты экрана без прокрутки.

Внутри этого мне нужна панель с прокручиваемым контентом. Если это единственная видимая панель, то она должна занимать 100% высоты внешнего контейнера, создавая иллюзию прокрутки основного экрана.

Когда нижняя панель видна, прокручиваемый контент должен занимать только первые 75% высоты экрана, а полоса прокрутки составляет только 75% высоты, чтобы отразить это. Нижние 25% — это новая панель, которую нужно исправить. Нижняя панель ТАКЖЕ должна иметь возможность независимой прокрутки. Таким образом, вы получаете две независимо прокручиваемые панели, расположенные друг над другом.

Я пытался сделать это с помощью flexbox, но мне не повезло. Может ли кто-нибудь посоветовать, что я делаю неправильно?

Скрипка ниже

https://jsfiddle.net/cdg6815s/2/

.app-container {
  height: 100%;
  padding: 10px;
  background-color: blue;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

.container {
  height: 80%;
  background-color: green;
  padding: 10px;
  flex: 0.8;
  overflow-y: scroll;
}

.logtailContainer {
  height: 20%;
  background-color: red;
  padding: 10px;
  flex: 0.2;
  overflow-y: scroll;
}

Просто добавьте body, html {height: 100%; margin: 0;} и, возможно, * {box-sizing: border-box;} - проверьте здесь

skobaljic 11.12.2020 15:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
393
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обновлено: комментарий skobaljic - это более простой способ сделать это. Я сохраняю этот ответ, так как он все еще работает.

Я предполагаю, что вы хотите что-то вроде этого:

* {
  box-sizing: border-box;
}

.b {
  height: 100vh;
  margin: 0;
  padding: 0;
}

.app-container {
  height: 100vh;
  padding: 10px;
  background-color: blue;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}

.contentpanel {
  max-height: 75vh;
  background-color: green;
  padding: 10px;
  flex: 0 1 75vh;
  overflow-y: scroll;
}

.lowerpanel {
  max-height: 25vh;
  background-color: red;
  padding: 10px;
  flex: 0 1 25vh;
  overflow-y: scroll;
}
<body class = "b">

  <div class = "app-container">
    <div class = "contentpanel">
      App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App
      tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br />
    </div>
    <div class = "lowerpanel">
      Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br
      /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br />
    </div>
  </div>
</body>

Несколько вопросов:

  1. Вы устанавливаете .app-container на 100% высоты, но какой. Вам нужно установить ссылку, поэтому необходимо установить высоту в body/html.
  2. flex свойство является сокращенным - так что вы устанавливали flex-рост (как вы, возможно, знаете), но это соотношение к тому, на что он будет расти. Установка свойства flex-basis на высоту может быть лучшим способом.
  3. Я изменил значения высоты на vh единиц, чтобы использовать высоту области просмотра в качестве эталона.
  4. Установка max-height для ваших элементов вместо высоты позволяет им уменьшаться/увеличиваться, но останавливаться на определенном значении высоты.

Спасибо за совет. И последнее: нижняя панель должна быть скрыта или отображена по желанию пользователя. Я собирался использовать display none/block, но в настоящее время с этим CSS, если нижняя панель скрыта, верхняя панель заполняет только 75% высоты. Я полагаю, чтобы он заполнил весь экран, если нижней панели нет, я меняю оба 75vh на 100vh?

NZJames 11.12.2020 15:46

Как ты его переключаешь? JS?

disinfor 11.12.2020 16:09

Если вы используете flex, вы можете использовать flex:1; или flex-grow:1 в основном контейнере вместо установки фиксированного height и установить только height/min-height во втором контейнере, который можно скрыть. чтобы заполнить окно, высота: 100vh и сброс полей для тела также эффективны здесь. если задействованы border и padding, обратите внимание также на модель box-sizing, чтобы включить их в свой размер.

вот демонстрация с флажком для переключения скрытия/отображения для второго контейнера и box-sizing, чтобы помнить padding из .app-container для расчета высоты 100vh.

body {
  margin: 0;
}

.app-container {
  height: 100vh;
  padding: 10px;
  background-color: blue;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
}

.contentpanel {
  background-color: green;
  padding: 10px;
  flex: 1;
  overflow-y: scroll;
}

.lowerpanel {
  height: 20%;
  background-color: red;
  padding: 10px;
  min-height: 4em;
  overflow-y: scroll;
}


/* demo purpose CSS to use input/label to toggle display of lowerpanel */
#hide {
  position: absolute;
  right: 100vw;
}

[for = "hide"] {
  cursor: pointer;
  background: #bee;
  border: 1px solid;
  border-radius: 5px;
  padding: 0.25em;
  display: block;
  width: max-content;
  margin: auto;
}

#hide:checked~.lowerpanel {
  display: none;
}
<div class = "app-container">

  <input type = "checkbox" id = "hide"><!-- input for demo purpose -->
  
  <div class = "contentpanel">

    <label for = "hide">toggle red container</label><!-- label for demo purpose -->

    App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles
    <br /><br /> App tiles<br /><br /> App tiles<br /><br /> App tiles<br /><br />
  </div>
  <div class = "lowerpanel">
    Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br
    /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br /> Logtail stuff<br /><br />
  </div>
  </div

Другие вопросы по теме