Уменьшить боковую панель Flexbox до высоты содержимого

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

Мой код выглядит примерно так:

<div class = "fb-col">
    <!-- Headers, etc. -->
    <div class = "fb-row">
        <div class = "sidebar">
            <!-- Lots of content -->
        </div>
        <div class = "main">
            <!-- Less content -->
        </div>
     </div>
     <!-- Footers -->
</div>

со следующим CSS:

.fb-col {
    height: 100%;
    display: flex;
    flex-direction: column;
}
.fb-row {
    flex-grow: 1;

    display: flex;
    flex-direction: row;
    align-items: flex-start;
}
.sidebar {
    width: 25%;
    flex-grow: 0;
}
.main {
    flex-grow: 1;
}

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

Вы ищете что-то подобное? jsfiddle.net/x2L4f1zt/1

Hidden Hobbes 12.06.2018 17:46

Это выглядит примерно правильно. Будет ли увеличиваться боковая панель, если тело больше боковой панели?

Bottersnike 12.06.2018 18:08

Ох. @HiddenHobbes, почти идеально. Есть ли способ сделать так, чтобы высота боковой панели соответствовала родительскому гибкому полю? Установка 100vh заставляет его прокручиваться при добавлении верхнего и нижнего колонтитулов.

Bottersnike 12.06.2018 18:48

Не могли бы вы привести пример @Bottersnike? Вам трудно представить себе вашу проблему.

Hidden Hobbes 12.06.2018 22:19

@HiddenHobbes i.imgur.com/DWPnub0.png показывает это. Обычно боковая панель должна обрезаться в нижней части кнопки «Показать больше». Если высота тела меньше одной страницы, боковая панель должна быть достаточно большой, чтобы подтолкнуть нижний колонтитул к низу.

Bottersnike 12.06.2018 22:23
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
5
543
2

Ответы 2

Если я понял вашу проблему, вы можете попробовать следующим образом:

.fb-col {
    min-height: 100%;
    display: flex;
    flex-direction: column;
}
.fb-row {
    flex-grow: 1;
    display: flex;
    flex-direction: row;
    min-height: 100%;
}
.sidebar {
    width: 25%;
    flex-grow: 0;
    min-height: 100%;
}
.main {
    flex-grow: 1;
    min-height: 100%;
}

Таким образом, .sidebar и .main всегда будут иметь одинаковую высоту с минимальной высотой 100%.

Если не получается добавить, попробуйте добавить это правило:

html, body {
  height: 100%;
  margin: 0;
}

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

Bottersnike 12.06.2018 18:49

поэтому замените min-height: 100% на height: 100% в классе боковой панели и добавьте overflow: auto. Он должен работать.

Fab 12.06.2018 18:57

Если я понимаю вашу цель, я не верю, что flexbox (или любой CSS) может решить эту проблему - без применения абсолютных размеров; flexbox можно использовать для увеличения размера элемента (ов) меньше, но не наоборот.

flex-gorw и flex-shrink определяют размер элементов на основе главная ось - для flex-direction: row это горизонтальный.

Единственное решение, которое я могу придумать, - использовать JS / jQuery:

$(document).ready(function() {
	$(".sidebar").height($(".main").height());
});
.fb-col {
	display: flex;
	flex-direction: column;
}

.fb-row {
	display: flex;
	flex-direction: row;
	align-items: flex-start;
}

.sidebar {
	min-width: 25%;
	width: 25%;
	overflow: auto;
}

.main {
}





/* For illustrative purposes */
.fb-row {
	background-color: #FDD;
}

.sidebar {
	background-color: #DFD;
}

.main {
	background-color: #DDF;
}
<div class = "fb-col">
	<header><h1>Header</h1></header>
	<div class = "fb-row">
		<div class = "sidebar">
			<h2>Sidebar</h2>
			<nav>
				<ul>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
				</ul>
        <ul>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
				</ul>
        <ul>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
					<li><a href = "#">Link</a></li>
				</ul>
			</nav>
		</div>
		<div class = "main">
			<h2>Content</h2>
			<p>Bacon ipsum dolor amet strip steak pork chop porchetta spare ribs ribeye biltong salami tongue. Sirloin ham ball tip, tongue filet mignon cow kielbasa hamburger doner chicken. Pancetta bresaola chuck corned beef hamburger, tenderloin leberkas swine buffalo beef ribs. Filet mignon ball tip t-bone ground round beef ribs. Biltong burgdoggen venison tail hamburger spare ribs buffalo flank meatball tri-tip leberkas.</p>
			<p>Ribeye porchetta kevin, pork sausage strip steak ham chicken pork chop buffalo ground round t-bone cupim pork belly. Fatback flank prosciutto kevin pork chop, pork loin pig. T-bone landjaeger ball tip fatback, shank ribeye picanha pork ground round filet mignon meatball tri-tip jowl. Shoulder meatloaf pork loin meatball ball tip, hamburger kielbasa. Andouille strip steak alcatra ham hock chuck. Cupim chicken buffalo, picanha biltong landjaeger t-bone. Jowl sirloin meatloaf short ribs tongue ground round bacon chuck fatback meatball hamburger picanha turkey kevin pork.</p>
		</div>
	</div>
	<footer><h2>Footer</h2><small>legal and stuff</small></footer>
</div>

<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

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