CSS Flexbox
Концепция Flexbox была разработана, чтобы упростить задачу создания гибких и адаптивных макетов на веб-страницах. Flexbox предоставляет нам более простой и интуитивный подход к созданию макетов на основе блоков и их позиционирования, чем традиционный CSS.
Flexbox позволяет создавать сложные макеты, где элементы могут быть размещены в различных направлениях, настраивать расстояние между элементами, и изменять размеры элементов, в зависимости от доступного места на экране.
Основная концепция
Перед тем, как мы погрузимся в детали Flexbox, давайте рассмотрим основную концепцию, которую вам нужно знать.
- Контейнер Flexbox - это элемент, который содержит дочерние элементы, которые мы хотим расположить внутри макета.
- Элементы Flexbox - это дочерние элементы, которые находятся внутри контейнера Flexbox. Эти элементы будут позиционироваться и выравниваться в соответствии с правилами, определенными в контейнере Flexbox.
Основные свойства
Существует несколько свойств, которые определяют поведение Flexbox. Вот некоторые из них:
display: определяет тип контейнера. Для создания контейнера Flexbox, нужно установить значениеdisplayнаflex..container { display: flex; }
flex-direction: Свойствоflex-directionопределяет направление, в котором располагаются элементы внутри контейнера Flexbox. Значение этого свойства может быть одним из четырех вариантов:row,row-reverse,columnиcolumn-reverse..container { display: flex; flex-direction: row; }
justify-content: Свойствоjustify-contentопределяет, как контейнер Flexbox распределяет свои элементы по оси главного направления (основной оси). В зависимости от выбранного значения, элементы могут быть выровнены по левому краю, по центру, по правому краю, равномерно распределены по всей ширине контейнера или даже выравниваться с помощью отступов между элементами..container { display: flex; justify-content: center; }
align-items: Свойствоalign-itemsопределяет, как контейнер Flexbox распределяет свои элементы по поперечной оси (второстепенной оси). Это свойство может устанавливать выравнивание элементов вверху, по центру, внизу, распределение элементов с помощью отступов между ними или масштабирование элементов..container { display: flex; align-items: center; }
flex-wrap: Свойствоflex-wrapопределяет, переносится ли содержимое контейнера Flexbox на новую строку, если элементы не помещаются в одну строку. Это свойство может устанавливать значениеnowrap(по умолчанию), которое заставляет элементы помещаться на одной строке,wrap, которое позволяет элементам переноситься на новую строку, когда они не помещаются на одной строке, иwrap-reverse, которое делает то же самое, что иwrap, но в обратном порядке..container { display: flex; flex-wrap: wrap; }
flex-grow: Свойствоflex-growопределяет, насколько большой относительно других элементов будет элемент внутри контейнера Flexbox. Это свойство устанавливает, сколько доступного пространства на основной оси (главной оси) займет элемент. Значения свойства являются положительными числами. Когда у элементов в контейнере Flexbox есть свободное пространство, оно распределяется между элементами в соответствии с их значениями свойства flex-grow. Если у одного элемента значение flex-grow равно 1, а у другого - 2, то второй элемент займет в два раза больше свободного пространства, чем первый.В этом примере элементу с классом.item { flex-grow: 2; }
.itemбудет выделено в два раза больше свободного пространства, чем элементам сflex-grow: 1.flex-shrink: Свойствоflex-shrinkопределяет, насколько сильно элемент может уменьшаться в размере на основной оси (главной оси), чтобы поместиться в контейнере Flexbox. Это свойство устанавливает, сколько пространства элемент может освободить на основной оси, если это необходимо. Значения свойства также являются положительными числами..item { flex-shrink: 2; }
flex-basis: Свойствоflex-basisустанавливает базовую ширину элемента внутри контейнера Flexbox. Значение свойства может быть установлено в пикселях, процентах или ключевых словах, таких какauto, которое означает, что ширина элемента определяется его содержимым.В этом примере элемент с классом.item { flex-basis: 100px; }
.itemбудет иметь базовую ширину равную 100 пикселям.flex: Свойствоflexявляется сокращением для свойствflex-grow,flex-shrinkиflex-basis. Синтаксис свойстваflexвыглядит следующим образом:Это означает, что элемент будет растягиваться и сжиматься, если необходимо, и его базовая ширина будет определяться его содержимым. То есть, значение.item { flex: 1 0 auto; }
1устанавливаетflex-grow: 1,0-flex-shrink: 0, аauto-flex-basis: auto. Также возможно указание только двух значений: например,flex: 1 0, в этом случае значениеflex-basisбудет установлено наauto.В этом примере элемент с классом.item { flex: 1; }
.itemбудет растягиваться, если есть свободное пространство, но не будет сжиматься, даже если доступное пространство недостаточно.align-self: Свойствоalign-selfустанавливает выравнивание элемента внутри контейнера Flexbox по вертикали. Значение свойства может быть установлено наauto,flex-start,flex-end,center,baselineилиstretch. Значениеautoнаследует значение свойстваalign-itemsиз родительского контейнера.В этом примере элемент с классом.item { align-self: center; }
.itemбудет выровнен по центру внутри контейнера Flexbox.
Flexbox предоставляет различные инструменты для управления расположением элементов на странице. Он позволяет легко располагать элементы по горизонтали и вертикали, контролировать их размеры и изменять порядок их следования. При правильном использовании Flexbox можно значительно упростить и ускорить создание адаптивных макетов.
Пример использования Flexbox
Вкачестве примера приводим код страницы с исползованием Flexbox:
<!DOCTYPE html>
<html>
<head>
<title>Flexbox Example Page</title>
<style>
body {
margin: 0;
padding: 0;
font-family: Arial, sans-serif;
}
header {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #333;
color: #fff;
padding: 20px;
}
nav {
display: flex;
justify-content: center;
align-items: center;
background-color: #ddd;
padding: 10px;
}
nav ul {
display: flex;
list-style: none;
margin: 0;
padding: 0;
}
nav li {
margin: 0 10px;
}
main {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
align-items: flex-start;
padding: 20px;
background-color: #f1f1f1;
}
.card {
flex: 0 1 calc(30% - 40px);
max-width: calc(30% - 40px);
background-color: #fff;
padding: 20px;
margin-bottom: 20px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.card img {
width: 100%;
height: auto;
margin-bottom: 10px;
}
.card h2 {
font-size: 24px;
margin-bottom: 10px;
}
.card p {
font-size: 16px;
line-height: 1.5;
margin-bottom: 10px;
text-align: center;
}
.card a {
display: inline-block;
background-color: #333;
color: #fff;
padding: 10px 20px;
border-radius: 5px;
text-decoration: none;
margin-top: 10px;
}
</style>
</head>
<body>
<header>
<h1>Flexbox Example Page</h1>
<form>
<input type="search" name="search" placeholder="Search...">
<button type="submit">Search</button>
</form>
</header>
<nav>
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Products</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<main>
<div class="card">
<img src="https://via.placeholder.com/400x200" alt="Product 1">
<h2>Product 1</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vitae dui sed lacus tincidunt tristique. Donec accumsan luctus felis, vel rhoncus nisi fermentum nec.</p>
<a href="#">Learn More</a>
</div>
<div class="card">
<img src="https://via.placeholder.com/400x200" alt="Product 2">
<h2>Product 2</h2>
<p>Quisque eget ipsum at urna hendrerit posuere. Sed hendrerit elit ipsum, sit amet aliquam purus placerat ut. Sed euismod orci sit amet nibh aliquet, non ultrices ex laoreet.</p>
<a href="#">Learn More</a>
</div>
<div class="card">
<img src="https://via.placeholder.com/400x200" alt="Product 3">
<h2>Product 3</h2>
<p>Nam commodo pharetra magna vel ornare. Nulla viverra tincidunt dolor eget volutpat. Sed fermentum massa sed justo tristique tincidunt. Nulla quis leo eu ipsum dignissim elementum.</p>
<a href="#">Learn More</a>
</div>
<div class="card">
<img src="https://via.placeholder.com/400x200" alt="Product 4">
<h2>Product 4</h2>
<p>Integer bibendum consectetur risus a scelerisque. In hac habitasse platea dictumst. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
<a href="#">Learn More</a>
</div>
<div class="card">
<img src="https://via.placeholder.com/400x200" alt="Product 5">
<h2>Product 5</h2>
<p>Vestibulum aliquet diam non risus pellentesque, in eleifend lacus pretium. Sed at odio vitae mi imperdiet venenatis vel non odio. Ut non tortor in nisi dictum molestie.</p>
<a href="#">Learn More</a>
</div>
<div class="card">
<img src="https://via.placeholder.com/400x200" alt="Product 6">
<h2>Product 6</h2>
<p>Aliquam rutrum euismod urna a mollis. Ut eget ante ante. Fusce sagittis leo vel sapien bibendum lacinia. Suspendisse at nunc commodo, ultricies turpis ac, pellentesque velit.</p>
<a href="#">Learn More</a>
</div>
</main>
</body>
</html>
Результат кода
В этом примере использованы следующие элементы Flexbox:
- Для расположения элементов внутри заголовка
<header>используетсяdisplay: flexиjustify-content: space-between, чтобы выровнять элементы по главной оси и создать пространство между ними. - Для расположения элементов меню
<nav>используетсяdisplay: flexиjustify-content: center, чтобы выровнять элементы по главной оси и расположить их по центру. - В основной области контента
<main>используетсяdisplay: flexиflex-wrap: wrap, чтобы элементы переносились на новую строку при достижении границы контейнера.justify-content: space-betweenиспользуется для выравнивания элементов по главной оси и создания пространства между ними.
- Внутри каждой карточки
<div class="card">используетсяdisplay: flex, чтобы выровнять элементы по главной оси.flex-direction: columnустанавливает направление элементов по оси, чтобы заголовок, текст и ссылка располагались вертикально друг под другом.align-items: centerвыравнивает элементы по второстепенной оси, чтобы элементы были по центру вертикально.flex-grow: 1устанавливает, что элементы могут растягиваться по оси, чтобы занять всё доступное пространство.
Таким образом, пример страницы с использованием Flexbox демонстрирует, как можно использовать различные свойства Flexbox для создания адаптивного макета. С помощью display: flex, justify-content, align-items и других свойств можно контролировать расположение элементов на странице, а flex-grow и другие свойства позволяют гибко настраивать размеры и распределение элементов внутри контейнера.
