JavaRush /Курсы /Модуль 1: Web Core /Flexbox и отзывчивость

Flexbox и отзывчивость

Модуль 1: Web Core
13 уровень , 9 лекция
Открыта

10.1 Адаптивные колонки

Flexbox предназначен для одномерных композиций, что означает, что он идеально подходит для расположения элементов в строке или колонке. Рассмотрим основы Flexbox, а также техники для создания сложных и отзывчивых макетов.

Flex-контейнер и Flex-элементы

  • Flex-контейнер: элемент, к которому применяется свойство display: flex. Этот контейнер управляет расположением всех дочерних элементов (flex-элементов)
  • Flex-элементы: дочерние элементы flex-контейнера

1. Создание адаптивных колонок

Пример создания адаптивных колонок с использованием flex-wrap, flex-grow, flex-shrink и flex-basis:

CSS
    
      .flex-container {
        display: flex;
        flex-wrap: wrap;
        gap: 10px;
      }

      .flex-item {
        flex: 1 1 200px;
        background-color: #3498db;
        color: white;
        padding: 20px;
        text-align: center;
      }
    
  
HTML
    
      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Адаптивные колонки с Flexbox</title>
          <link rel="stylesheet" href="styles.css">
        </head>
        <body>
          <div class="flex-container">
            <div class="flex-item">Колонка 1</div>
            <div class="flex-item">Колонка 2</div>
            <div class="flex-item">Колонка 3</div>
          </div>
        </body>
      </html>
    
  

Объяснение кода:

  • .flex-container: определяет контейнер как flex-контейнер с элементами, которые могут переноситься на следующую строку при недостатке места (flex-wrap: wrap)
  • .flex-item: элементы имеют равные размеры и могут адаптироваться к доступному пространству (flex: 1 1 200px)

10.2 Адаптивная галерея изображений

Создадим адаптивную галерею изображений, которая меняет количество колонок в зависимости от размера экрана:

HTML
    
      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Responsive Flexbox Gallery</title>
          <style>
            .gallery {
              display: flex;
              flex-wrap: wrap;
              gap: 10px;
            }

            .gallery img {
              flex: 1 1 calc(33.333% - 10px);
              max-width: calc(33.333% - 10px);
              height: auto;
            }

            @media (max-width: 768px) {
              .gallery img {
                flex: 1 1 calc(50% - 10px);
                max-width: calc(50% - 10px);
              }
            }

            @media (max-width: 480px) {
              .gallery img {
                flex: 1 1 100%;
                max-width: 100%;
              }
            }
          </style>
        </head>
        <body>
          <div class="gallery">
            <img data-max-width="256" data-id="ebb06cf3-0e04-45bd-a33e-31fe096fd323" src="https://cdn.javarush.com/images/article/ebb06cf3-0e04-45bd-a33e-31fe096fd323/256.jpeg" alt="image 1">
            <img data-max-width="256" data-id="ddbb4085-7a58-44e0-88fe-a2368b777222" src="https://cdn.javarush.com/images/article/ddbb4085-7a58-44e0-88fe-a2368b777222/256.jpeg" alt="image 2">
            <img data-max-width="256" data-id="71be962a-10e9-4351-8c27-8846c6ad2e00" src="https://cdn.javarush.com/images/article/71be962a-10e9-4351-8c27-8846c6ad2e00/256.jpeg" alt="image 3">
            <img data-max-width="256" data-id="8afd6be8-0f8e-42e9-a64b-8549f12862f7" src="https://cdn.javarush.com/images/article/8afd6be8-0f8e-42e9-a64b-8549f12862f7/256.jpeg" alt="image 4">
            <img data-max-width="256" data-id="77241dcb-9b7f-471e-934e-9f7f2a42d369" src="https://cdn.javarush.com/images/article/77241dcb-9b7f-471e-934e-9f7f2a42d369/256.jpeg" alt="image 5">
          </div>
        </body>
      </html>
    
  
HTML
    
      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Responsive Flexbox Gallery</title>
          <style>
            .gallery {
              display: flex;
              flex-wrap: wrap;
              gap: 10px;
            }

            .gallery img {
              flex: 1 1 calc(33.333% - 10px);
              max-width: calc(33.333% - 10px);
              height: auto;
            }

            @media (max-width: 768px) {
              .gallery img {
                flex: 1 1 calc(50% - 10px);
                max-width: calc(50% - 10px);
              }
            }

            @media (max-width: 480px) {
              .gallery img {
                flex: 1 1 100%;
                max-width: 100%;
              }
            }
          </style>
        </head>
        <body>
          <div class="gallery">
            <img src="image1.jpg" alt="Image 1">
            <img src="image2.jpg" alt="Image 2">
            <img src="image3.jpg" alt="Image 3">
            <img src="image4.jpg" alt="Image 4">
            <img src="image5.jpg" alt="Image 5">
          </div>
        </body>
      </html>
    
  

Объяснение:

  • На больших экранах изображения занимают треть ширины контейнера
  • На экранах шириной до 768 пикселей изображения занимают половину ширины контейнера
  • На экранах шириной до 480 пикселей изображения занимают полную ширину контейнера

10.3 Сложный адаптивный макет с Flexbox

Создадим сложный макет с использованием Flexbox, который включает хедер, сайдбар, основной контент и футер, адаптирующийся к различным размерам экранов:

HTML
    
      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Complex Flexbox Layout</title>
          <style>
            body {
              display: flex;
              flex-direction: column;
              min-height: 100vh;
              margin: 0;
            }

            header, footer {
              background-color: #333;
              color: white;
              text-align: center;
              padding: 20px;
            }

            main {
              flex: 1;
              display: flex;
              flex-direction: column;
            }

            .content {
              flex: 1;
              padding: 20px;
              background-color: #f4f4f4;
            }

            aside {
              background-color: #ccc;
              padding: 20px;
            }

            @media (min-width: 768px) {
              main {
                flex-direction: row;
              }

              .content {
                flex: 3;
              }

              aside {
                flex: 1;
              }
            }
          </style>
        </head>
        <body>
          <header>Header</header>
          <main>
            <aside>Sidebar</aside>
            <div class="content">Main Content</div>
          </main>
          <footer>Footer</footer>
        </body>
      </html>
    
  

Объяснение:

  • На маленьких экранах макет состоит из хедера, основного контента, сайдбара и футера, расположенных вертикально
  • На экранах шириной 768 пикселей и больше основной контент и сайдбар располагаются горизонтально
1
Задача
Модуль 1: Web Core, 13 уровень, 9 лекция
Недоступна
Адаптивные колонки
Адаптивные колонки
1
Задача
Модуль 1: Web Core, 13 уровень, 9 лекция
Недоступна
Адаптивная галерея
Адаптивная галерея
1
Опрос
Отзывчивая графика, 13 уровень, 9 лекция
Недоступен
Отзывчивая графика
Отзывчивая графика
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
No Name Уровень 36
29 мая 2025
На этом уровне я полюбил flex