Как сделать так, чтобы только гибкий элемент переполнялся, а не весь родитель? - PullRequest
0 голосов
/ 22 октября 2018

У меня есть небольшая базовая страница макета.

Содержимое в центре с боковой панелью, содержащей фильтры.

Пожалуйста, смотрите: https://codepen.io/anon/pen/ePLmKB?editors=1100

Мне бы хотелось, чтобы мой.heading и .filter-block-heading всегда должны быть видны и иметь только прокручиваемые карты фильтра.Проблема заключается в переполнении целого столбца flex, из-за которого заголовок моего столбца прокручивается вне поля зрения

Мне нужно содержимое раздела .main, чтобы иметь возможность расширять весь раздел .content.Если содержимое небольшое, максимальная высота - это область просмотра минус высота нижнего колонтитула.Но если содержимое расширяется, боковые панели тоже должны расширяться.

Я пытался установить overflow: hidden для родителей, а затем overflow: auto для ребенка.

body {
  height: 100vh;
  overflow: auto;
}

.app {
  display: flex;
  flex-direction: column;
  position: relative;
  min-width: 1024px;
  width: 100%;
  height: auto;
}

header {
  background-color: #b4d15e;
}

footer {
  height: 56px;
  background-color: #5ed1b4;
}

.content {
  flex-direction: row;
  min-height: calc(100vh - 56px);
  display: flex;
}

.sidebar-1 {
  display: flex;
  flex-direction: column;
  position: relative;
  width: calc(20% + 0px);
  max-width: 300px;
  min-width: 200px;
  overflow-y: auto;
  box-shadow: 0 0 4.9px 0.2px rgba(0, 0, 0, 0.5);
  border-color: #e0e1e6;
  border-style: solid;
  border-width: 0 1px 0 0;
  flex: none;
  background: #f4f5f8;
}

.heading {
  display: flex;
  flex-direction: column;
}

.heading h2 {
  margin: 0;
}

.heading>div {
  display: flex;
  padding: 15px 7px 15px 12px;
  align-items: center;
}

.filters {
  position: absolute;
  height: auto;
  margin-top: 50px;
  width: 100%;
}

.filter-block {
  display: flex;
  flex-direction: column;
}

.filter-block-heading {
  min-height: 0;
  display: flex;
  flex-direction: row;
  flex-shrink: 0;
  padding-left: 10px;
  border-bottom: solid 3px #404c9a;
  text-align: center;
  font-size: 14px;
}

.single-filters {
  display: flex;
  flex-direction: column;
  width: 100%
}

.filter-card {
  width: 100% padding: 5px;
  margin-top: 12px;
  border-top: 2px solid red;
  border-bottom: 2px solid green;
}

.filter-card h3 {
  background-color: #A8AAFF;
  position: sticky;
  top: 0px;
  font-weight: bold;
}

.filter-card li {
  margin-top: 6px;
}

.main {
  display: flex;
  flex-direction: column;
  flex: 1 1 0%;
  width: 580px;
  padding: 30px;
}

.sidebar-2 {
  position: relative;
  transition: all 0.25s;
  width: calc(25% + 30px);
  max-width: 300px;
  overflow: hidden;
  box-shadow: 0 0 4.9px 0.2px rgba(0, 0, 0, 0.5);
}
<body>
  <div class='app'>
    <header>
      Header</header>
    <div class='content'>

      <div class='sidebar-1'>
        <div class='heading'>
          <div>
            <h2>All Filters</h2>
            <button>Show all</button>
          </div>
        </div>

        <div class='filters'>
          <div>

            <div class='filter-block'>
              <div class='filter-block-heading'>
                Custom Filters
              </div>

              <div class='single-filters'>

                <div>

                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>

                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class='main'>main</div>
      <div class='sidebar-2'>sidebar 2</div>
    </div>
    <footer>Footer</footer>
  </div>
</body>

1 Ответ

0 голосов
/ 23 октября 2018

Вы получаете полосу прокрутки в окне просмотра из-за этого правила:

.content {
    min-height: calc(100vh - 56px);
}

Таким образом, вы удаляете 56px с высоты, которая является высотой footer:

footer {
    height: 56px;
}

Но вы не вычитали высоту header.Вот почему переполнение.

Попробуйте вместо этого:

исправленный кодовый блок

/* body {
  height: 100vh;
  overflow: auto;
} */

.app {
  display: flex;
  flex-direction: column;
  position: relative;
  min-width: 1024px;
  width: 100%;
  /* height: auto; */
  height: 100vh; /* new */  
}

.content {
  flex-direction: row;
  /* min-height: calc(100vh - 56px); */
  flex: 1; /* new */
  display: flex;
}

/* no more changes */

header {
  background-color: #b4d15e;
}

footer {
  height: 56px;
  background-color: #5ed1b4;
}


.sidebar-1 {
  display: flex;
  flex-direction: column;
  position: relative;
  width: calc(20% + 0px);
  max-width: 300px;
  min-width: 200px;
  overflow-y: auto;
  box-shadow: 0 0 4.9px 0.2px rgba(0, 0, 0, 0.5);
  border-color: #e0e1e6;
  border-style: solid;
  border-width: 0 1px 0 0;
  flex: none;
  background: #f4f5f8;
}

.heading {
  display: flex;
  flex-direction: column;
}

.heading  h2 {
  margin: 0;
}

.heading > div {
  display: flex;
  padding: 15px 7px 15px 12px;
  align-items: center;
}

.filters {
  position: absolute;
  height: auto;
  margin-top: 50px;
  width: 100%;
}

.filter-block {
  display: flex;
  flex-direction: column;
}

.filter-block-heading {
  min-height: 0;
  display: flex;
  flex-direction: row;
  flex-shrink: 0;
  padding-left: 10px;
  border-bottom: solid 3px #404c9a;
  text-align: center;
  font-size: 14px;
}

.single-filters {
  display: flex;
  flex-direction: column;
  width: 100%
}

.filter-card {
  width: 100%
  padding: 5px;
  margin-top: 12px;
  border-top: 2px solid red;
  border-bottom: 2px solid green;
}

.filter-card h3 {
  background-color: #A8AAFF;
  position: sticky;
  top: 0px;
  font-weight: bold;
}

.filter-card li {
  margin-top: 6px;
}

.main {
  display: flex;
  flex-direction: column;
  flex: 1 1 0%;
  width: 580px;
  padding: 30px;
}

.sidebar-2 {
  position: relative;
  transition: all 0.25s;
  width: calc(25% + 30px);
  max-width: 300px;
  overflow: hidden;
  box-shadow: 0 0 4.9px 0.2px rgba(0, 0, 0, 0.5);
}
<body>
  <div class='app'>
    <header>Header</header>
    <div class='content'>
      <div class='sidebar-1'>
        <div class='heading'>
          <div>
            <h2>All Filters</h2>
            <button>Show all</button>
          </div>
        </div>
        <div class='filters'>
          <div>
            <div class='filter-block'>
              <div class='filter-block-heading'>
                Custom Filters
              </div>
              <div class='single-filters'>
                <div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                  <div class='filter-card'>
                    <h3>Single Filter</h3>
                    <ul>
                      <li>Option 1</li>
                      <li>Option 2</li>
                      <li>Option 3</li>
                    </ul>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class='main'>main</div>
      <div class='sidebar-2'>sidebar 2</div>
    </div>
    <footer>Footer</footer>
  </div>
</body>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...