🔍 Начните печатать, чтобы искать по книге или перейти к нужной странице по номеру

Удобно листать не только прокруткой, но и клавишами‑стрелками:

 
между важными местами
Shift
между
разворотами
Васи­лий Полов­нёв, Игорь Пет­ров

ХТМЛ.
Вёрстка сайтов

Изда­тель­ство Бюро Гор­бу­нова
2021
Василий Половнёв, Игорь Петров

ХТМЛ.
Вёрстка сайтов

Издательство Бюро Горбунова
2021
удк 004.42
ббк З973.42
П52
Васи­лий Полов­нёв, Игорь Пет­ров
П52
ХТМЛ. Вёрстка сай­тов для дизай­не­ров, редак­то­ров и руко­во­ди­те­лей.—
М.: Изд‑во Бюро Гор­бу­нова, 2021

Эта книга — поша­го­вая инструк­ция по вёрстке сай­тов на язы­ках ХТМЛ и ЦСС. Вы узна­ете не только как свер­стать сайт, но и как опуб­ли­ко­вать его в интер­нете, настро­ить кра­си­вый шаринг в соц­сети и под­клю­чить системы аналитики.

Отдель­ный раз­дел книги посвя­щён работе с вер­сталь­щи­ком: как ста­вить задачи, полу­чать пред­ска­зу­е­мый резуль­тат и пра­вильно при­ни­мать и внед­рять вёрстку.

Оглавление

удк 004.42
ббк З973.42
П52
П52
Василий Половнёв, Игорь Петров
ХТМЛ. Вёрстка сайтов для дизайнеров, редакторов и руководителей.—
М.: Изд‑во Бюро Горбунова, 2021

Эта книга — пошаговая инструкция по вёрстке сайтов на языках ХТМЛ и ЦСС. Вы узнаете не только как сверстать сайт, но и как опубликовать его в интернете, настроить красивый шаринг в соцсети и подключить системы аналитики.

Отдельный раздел книги посвящён работе с верстальщиком: как ставить задачи, получать предсказуемый результат и правильно принимать и внедрять вёрстку.

Оглавление

Скрыто 184 разворота

Доба­вим мобиль­ную вер­сию. Зафик­си­руем поля стра­ницы, сде­лаем одну колонку и мак­си­мум рядов по содер­жи­мому. Поря­док эле­мен­тов не меняем.

@media (width < 768px) {
  .layoutContainer {
    padding: 20px 20px 30px; /* Меняем резиновые поля на фиксированные */
  }

  .about {
    grid-template-columns: 1fr; /* Одна колонка */
    grid-auto-flow: row; /* Столько рядов, сколько нужно, с высотой по содержимому */
    grid-auto-rows: max-content;
    gap: 20px;
  }

  .about .photo {
    width: 100%; /* Тянем фотографию на всю ширину экрана */
  }

  .about h1 {
    font-size: 14.5vw; /* Увеличиваем кегль заголовка */
  }
  
  .about .text > :last-child {
    order: -1; /* На мобильных первым идёт второй абзац */
  }
}

Роман Жалялов, дизайнер интерфейсов

Учусь на второй ступени Школы дизайнеров Бюро Горбунова.

Проектирую сайты и мобильные приложения, использую ФФФ, «травлю леску».

Добавим мобильную версию. Зафиксируем поля страницы, сделаем одну колонку и максимум рядов по содержимому. Порядок элементов не меняем.

@media (width < 768px) {
  .layoutContainer {
    padding: 20px 20px 30px; /* Меняем резиновые поля на фиксированные */
  }

  .about {
    grid-template-columns: 1fr; /* Одна колонка */
    grid-auto-flow: row; /* Столько рядов, сколько нужно, с высотой по содержимому */
    grid-auto-rows: max-content;
    gap: 20px;
  }

  .about .photo {
    width: 100%; /* Тянем фотографию на всю ширину экрана */
  }

  .about h1 {
    font-size: 14.5vw; /* Увеличиваем кегль заголовка */
  }
  
  .about .text > :last-child {
    order: -1; /* На мобильных первым идёт второй абзац */
  }
}

Роман Жалялов, дизайнер интерфейсов

Учусь на второй ступени Школы дизайнеров Бюро Горбунова.

Проектирую сайты и мобильные приложения, использую ФФФ, «травлю леску».

Роман Жалялов, дизайнер интерфейсов

Учусь на второй ступени Школы дизайнеров Бюро Горбунова.

Проектирую сайты и мобильные приложения, использую ФФФ, «травлю леску».

Вот что, в итоге, у нас получилось:

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Роман Жалялов, дизайнер интерфейсов</title>
  <link rel="stylesheet" href="reset.css">
</head>
<body>
  <div class="layoutContainer">
    <section class="about">
      <img class="photo" src="images/me.jpg">

      <h1>Роман Жалялов, дизайнер интерфейсов</h1>

      <div class="text">
        <p>Учусь на второй ступени Школы дизайнеров Бюро Горбунова.</p>

        <p>Проектирую сайты и мобильные приложения, использую ФФФ, «травлю леску».</p>
      </div>

      <footer class="social">
        <a><svg width="46" height="40" viewBox="0 0 25 22" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2.55 9.598c7.077-3.253 16.236-7.218 17.5-7.767C23.367.395 24.384.67 23.877 3.851c-.365 2.287-1.416 9.857-2.254 14.569-.497 2.794-1.613 3.125-3.367 1.916-.843-.582-5.101-3.523-6.025-4.213-.844-.63-2.007-1.387-.548-2.878.519-.531 3.923-3.926 6.574-6.569.348-.347-.089-.917-.49-.638a3088.93 3088.93 0 0 0-9.16 6.36c-.953.676-1.868.986-3.511.493-1.241-.373-2.453-.817-2.925-.986-1.817-.652-1.386-1.496.379-2.307Z" fill="currentColor"></path></svg></a>
        <a><svg viewBox="1 1.203 28.002 17.595" width="54.465" height="33" xmlns="http://www.w3.org/2000/svg"><path d="M9.144 1.203c.808 0 1.554.062 2.238.249a4.855 4.855 0 0 1 1.741.684c.498.311.87.746 1.119 1.306s.373 1.243.373 1.989c0 .87-.187 1.616-.622 2.176-.373.56-.995 1.057-1.741 1.43 1.057.311 1.865.87 2.362 1.616a4.9 4.9 0 0 1 .808 2.735c0 .87-.187 1.616-.497 2.238a4.123 4.123 0 0 1-1.368 1.554 6.429 6.429 0 0 1-1.989.87c-.746.187-1.492.311-2.238.311H1V1.203h8.144Zm-.497 6.963c.684 0 1.243-.187 1.679-.497.436-.31.622-.87.622-1.554 0-.373-.062-.746-.187-.995s-.311-.435-.56-.622c-.249-.124-.497-.249-.808-.311-.311-.062-.622-.062-.995-.062H4.792v4.041h3.855Zm.187 7.336c.373 0 .746-.062 1.057-.124.311-.062.622-.187.87-.373.249-.187.435-.373.622-.684.124-.311.249-.684.249-1.119 0-.87-.249-1.492-.746-1.927-.497-.373-1.181-.56-1.989-.56H4.792v4.787h4.042Zm11.998-.062c.497.497 1.243.746 2.238.746.684 0 1.306-.187 1.803-.497.497-.373.808-.746.933-1.119h3.046c-.497 1.492-1.243 2.549-2.238 3.233-.995.622-2.176.995-3.606.995a7.324 7.324 0 0 1-2.673-.497 4.953 4.953 0 0 1-1.989-1.368 4.92 4.92 0 0 1-1.243-2.052c-.311-.808-.435-1.679-.435-2.673 0-.933.124-1.803.435-2.611a6.706 6.706 0 0 1 1.306-2.114c.56-.56 1.243-1.057 1.989-1.368a6.971 6.971 0 0 1 2.611-.497c1.057 0 1.989.187 2.798.622.809.435 1.43.933 1.927 1.679.497.684.87 1.492 1.119 2.362.124.87.187 1.741.124 2.735h-9.014c0 .995.373 1.927.87 2.425l-.001-.001Zm3.917-6.528c-.435-.435-1.119-.684-1.927-.684-.56 0-.995.124-1.368.311-.373.187-.622.435-.87.684-.249.249-.373.56-.435.87-.062.31-.124.56-.124.808h5.595c-.124-.933-.436-1.554-.871-1.989Zm-5.471-6.528h6.963v1.679h-6.963V2.384Z" fill="currentColor"></path></svg></a>
      </footer>
    </section>
  </div>
</body>
</html>
body {
  background: #000;
  color: #fff;
  font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
  display: flex;
  min-height: 100vh;
}

h1 {
  font-size: 11vw;
  line-height: .775;
  letter-spacing: -.05em;
}

.text {
  font-size: max(18px, 1.9vw);
  line-height: 1;
}

.layoutContainer {
  padding: 1.75% 2.625% 3.5%;
  flex: 1;
}

.about {
  min-height: 100%;
  display: grid;
}

.about .text {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 10px;
}

.social {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: max-content;
  justify-content: end;
  column-gap: 15px;
}

.social svg {
  max-height: 24px;
  width: auto;
}

@media (width >= 768px) {
  .about {
    grid-template-columns: 77.5fr 22.5fr;
    grid-template-rows: min-content min-content;
    gap: 20px 10px;
    align-content: space-between;
  }

  .about h1 {
    grid-area: 2 / 1;
  }

  .about .photo {
    grid-area: 1 / 2;
  }

  .about .text {
    grid-area: 1 / 1;
    max-width: max(280px, 50%);
    justify-self: end;
  }

  .about .social {
    grid-area: 2 / 2;
    align-self: end;
    justify-self: end;
  }
}


@media (width < 768px) {
  .layoutContainer {
    padding: 20px 20px 30px;
  }

  .about {
    grid-template-columns: 1fr;
    grid-auto-flow: row;
    grid-auto-rows: max-content;
    gap: 20px;
  }

  .about .photo {
    width: 100%;
  }

  .about h1 {
    font-size: 14.5vw;
  }

  .about .text > :last-child {
    order: -1;
  }
}

Роман Жалялов, дизайнер интерфейсов

Учусь на второй ступени Школы дизайнеров Бюро Горбунова.

Проектирую сайты и мобильные приложения, использую ФФФ, «травлю леску».

Вот что, в итоге, у нас получилось:

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Роман Жалялов, дизайнер интерфейсов</title>
  <link rel="stylesheet" href="reset.css">
</head>
<body>
  <div class="layoutContainer">
    <section class="about">
      <img class="photo" src="images/me.jpg">

      <h1>Роман Жалялов, дизайнер интерфейсов</h1>

      <div class="text">
        <p>Учусь на второй ступени Школы дизайнеров Бюро Горбунова.</p>

        <p>Проектирую сайты и мобильные приложения, использую ФФФ, «травлю леску».</p>
      </div>

      <footer class="social">
        <a><svg width="46" height="40" viewBox="0 0 25 22" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2.55 9.598c7.077-3.253 16.236-7.218 17.5-7.767C23.367.395 24.384.67 23.877 3.851c-.365 2.287-1.416 9.857-2.254 14.569-.497 2.794-1.613 3.125-3.367 1.916-.843-.582-5.101-3.523-6.025-4.213-.844-.63-2.007-1.387-.548-2.878.519-.531 3.923-3.926 6.574-6.569.348-.347-.089-.917-.49-.638a3088.93 3088.93 0 0 0-9.16 6.36c-.953.676-1.868.986-3.511.493-1.241-.373-2.453-.817-2.925-.986-1.817-.652-1.386-1.496.379-2.307Z" fill="currentColor"></path></svg></a>
        <a><svg viewBox="1 1.203 28.002 17.595" width="54.465" height="33" xmlns="http://www.w3.org/2000/svg"><path d="M9.144 1.203c.808 0 1.554.062 2.238.249a4.855 4.855 0 0 1 1.741.684c.498.311.87.746 1.119 1.306s.373 1.243.373 1.989c0 .87-.187 1.616-.622 2.176-.373.56-.995 1.057-1.741 1.43 1.057.311 1.865.87 2.362 1.616a4.9 4.9 0 0 1 .808 2.735c0 .87-.187 1.616-.497 2.238a4.123 4.123 0 0 1-1.368 1.554 6.429 6.429 0 0 1-1.989.87c-.746.187-1.492.311-2.238.311H1V1.203h8.144Zm-.497 6.963c.684 0 1.243-.187 1.679-.497.436-.31.622-.87.622-1.554 0-.373-.062-.746-.187-.995s-.311-.435-.56-.622c-.249-.124-.497-.249-.808-.311-.311-.062-.622-.062-.995-.062H4.792v4.041h3.855Zm.187 7.336c.373 0 .746-.062 1.057-.124.311-.062.622-.187.87-.373.249-.187.435-.373.622-.684.124-.311.249-.684.249-1.119 0-.87-.249-1.492-.746-1.927-.497-.373-1.181-.56-1.989-.56H4.792v4.787h4.042Zm11.998-.062c.497.497 1.243.746 2.238.746.684 0 1.306-.187 1.803-.497.497-.373.808-.746.933-1.119h3.046c-.497 1.492-1.243 2.549-2.238 3.233-.995.622-2.176.995-3.606.995a7.324 7.324 0 0 1-2.673-.497 4.953 4.953 0 0 1-1.989-1.368 4.92 4.92 0 0 1-1.243-2.052c-.311-.808-.435-1.679-.435-2.673 0-.933.124-1.803.435-2.611a6.706 6.706 0 0 1 1.306-2.114c.56-.56 1.243-1.057 1.989-1.368a6.971 6.971 0 0 1 2.611-.497c1.057 0 1.989.187 2.798.622.809.435 1.43.933 1.927 1.679.497.684.87 1.492 1.119 2.362.124.87.187 1.741.124 2.735h-9.014c0 .995.373 1.927.87 2.425l-.001-.001Zm3.917-6.528c-.435-.435-1.119-.684-1.927-.684-.56 0-.995.124-1.368.311-.373.187-.622.435-.87.684-.249.249-.373.56-.435.87-.062.31-.124.56-.124.808h5.595c-.124-.933-.436-1.554-.871-1.989Zm-5.471-6.528h6.963v1.679h-6.963V2.384Z" fill="currentColor"></path></svg></a>
      </footer>
    </section>
  </div>
</body>
</html>
body {
  background: #000;
  color: #fff;
  font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
  display: flex;
  min-height: 100vh;
}

h1 {
  font-size: 11vw;
  line-height: .775;
  letter-spacing: -.05em;
}

.text {
  font-size: max(18px, 1.9vw);
  line-height: 1;
}

.layoutContainer {
  padding: 1.75% 2.625% 3.5%;
  flex: 1;
}

.about {
  min-height: 100%;
  display: grid;
}

.about .text {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 10px;
}

.social {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: max-content;
  justify-content: end;
  column-gap: 15px;
}

.social svg {
  max-height: 24px;
  width: auto;
}

@media (width >= 768px) {
  .about {
    grid-template-columns: 77.5fr 22.5fr;
    grid-template-rows: min-content min-content;
    gap: 20px 10px;
    align-content: space-between;
  }

  .about h1 {
    grid-area: 2 / 1;
  }

  .about .photo {
    grid-area: 1 / 2;
  }

  .about .text {
    grid-area: 1 / 1;
    max-width: max(280px, 50%);
    justify-self: end;
  }

  .about .social {
    grid-area: 2 / 2;
    align-self: end;
    justify-self: end;
  }
}


@media (width < 768px) {
  .layoutContainer {
    padding: 20px 20px 30px;
  }

  .about {
    grid-template-columns: 1fr;
    grid-auto-flow: row;
    grid-auto-rows: max-content;
    gap: 20px;
  }

  .about .photo {
    width: 100%;
  }

  .about h1 {
    font-size: 14.5vw;
  }

  .about .text > :last-child {
    order: -1;
  }
}

Портфолио

Дизай­неры, редак­торы, руко­во­ди­тели и про­грам­ми­сты пока­зы­вают в порт­фо­лио то, что сде­лали, в чём участ­во­вали и чего доби­лись. Поэтому боль­шин­ство порт­фо­лио — это набор иллю­стра­ций с подпи­ся­ми и ссыл­ками. Про­дви­ну­тое порт­фо­лио — это вит­рина, где у каж­дого про­екта есть отдель­ная стра­ница с рас­ска­зом о работе над ним.

Чаще всего встре­ча­ются харак­тер­ные виды вёрстки порт­фо­лио: «лента», «плитка» и «рубрикатор».

Лента состоит из типо­вых моду­лей — кар­то­чек про­ек­тов. Чаще всего в хро­но­ло­ги­че­ском порядке, где новое сверху.

Плитка пред­став­ляет собой модуль­ную кладку из пря­мо­уголь­ни­ков, ино­гда раз­ных раз­ме­ров и про­пор­ций. В отли­чие от ленты, модули рас­по­ло­жены не друг под дру­гом, а плотно упа­ко­ваны по рядам — слева направо, сверху вниз.

Руб­ри­ка­тор состав­лен из моду­лей с раз­ными фор­ма­тами по руб­ри­кам: напри­мер послед­ний круп­ный про­ект, плитка, ново­сти или лого­типы клиентов.

Артём Горбунов. Типографика и вёрстка. Главная страница

Портфолио

Дизайнеры, редакторы, руководители и программисты показывают в портфолио то, что сделали, в чём участвовали и чего добились. Поэтому большинство портфолио — это набор иллюстраций с подписями и ссылками. Продвинутое портфолио — это витрина, где у каждого проекта есть отдельная страница с рассказом о работе над ним.

Чаще всего встречаются характерные виды вёрстки портфолио: «лента», «плитка» и «рубрикатор».

Лента состоит из типовых модулей — карточек проектов. Чаще всего в хронологическом порядке, где новое сверху.

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

Рубрикатор составлен из модулей с разными форматами по рубрикам: например последний крупный проект, плитка, новости или логотипы клиентов.

Артём Горбунов. Типографика и вёрстка. Главная страница

Раз­бе­рём вёрстку самой попу­ляр­ной рас­кладки порт­фо­лио — вёрстку плит­кой. Счи­таем, что в нашем порт­фо­лио сетка на 4 колонки с меж­ко­лон­ни­ком в 20 пик­се­лей. Сосре­до­то­чимся только на рас­кладке, опу­стив типо­гра­фику и стили для сброса.

Нач­нём с раз­метки, не забыв об обёртке для всей стра­ницы. Каж­дый про­ект — это див с клас­сом project и моди­фи­ка­то­ром раз­мера: sizeL — на все четыре колонки, sizeM — на две колонки, sizeS — на одну колонку. Собе­рём несколько ком­би­на­ций из них:

<div class="layoutContainer">
  <section class="projects">
    <div class="project sizeL"></div>

    <div class="project sizeS"></div>
    <div class="project sizeM"></div>
    <div class="project sizeS"></div>

    <div class="project sizeM"></div>
    <div class="project sizeM"></div>

    <div class="project sizeS"></div>
    <div class="project sizeS"></div>
    <div class="project sizeM"></div>

    <div class="project sizeS"></div>
    <div class="project sizeM"></div>
    <div class="project sizeS"></div>

    <div class="project sizeM"></div>
    <div class="project sizeS"></div>
    <div class="project sizeS"></div>

    <div class="project sizeM"></div>
    <div class="project sizeM"></div>

    <div class="project sizeS"></div>
    <div class="project sizeS"></div>
    <div class="project sizeS"></div>
    <div class="project sizeS"></div>
  </section>
</div>

Вклю­чим гриды, зада­дим сетку из четы­рёх коло­нок и моди­фи­ка­торы ширины плиток:

.projects {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  grid-auto-rows: max-content;
  column-gap: 20px;
  row-gap: 20px;
}

.project {
  padding: 10px 10px 20px;
  border-radius: 4px;
  background: #f3f5f4;
  min-height: 33vh; /* Мы задаём высоту ради примера, чтобы ячейки не схлопывались. В реальной жизни высота будет определяться пропорциями содержимого ячеек */
  overflow: hidden;
}

.project.sizeS {
  grid-column: auto / span 1;
}

.project.sizeM {
  grid-column: auto / span 2;
}

.project.sizeL {
  grid-column: auto / span 4;
}

Разберём вёрстку самой популярной раскладки портфолио — вёрстку плиткой. Считаем, что в нашем портфолио сетка на 4 колонки с межколонником в 20 пикселей. Сосредоточимся только на раскладке, опустив типографику и стили для сброса.

Начнём с разметки, не забыв об обёртке для всей страницы. Каждый проект — это див с классом project и модификатором размера: sizeL — на все четыре колонки, sizeM — на две колонки, sizeS — на одну колонку. Соберём несколько комбинаций из них:

<div class="layoutContainer">
  <section class="projects">
    <div class="project sizeL"></div>

    <div class="project sizeS"></div>
    <div class="project sizeM"></div>
    <div class="project sizeS"></div>

    <div class="project sizeM"></div>
    <div class="project sizeM"></div>

    <div class="project sizeS"></div>
    <div class="project sizeS"></div>
    <div class="project sizeM"></div>

    <div class="project sizeS"></div>
    <div class="project sizeM"></div>
    <div class="project sizeS"></div>

    <div class="project sizeM"></div>
    <div class="project sizeS"></div>
    <div class="project sizeS"></div>

    <div class="project sizeM"></div>
    <div class="project sizeM"></div>

    <div class="project sizeS"></div>
    <div class="project sizeS"></div>
    <div class="project sizeS"></div>
    <div class="project sizeS"></div>
  </section>
</div>

Включим гриды, зададим сетку из четырёх колонок и модификаторы ширины плиток:

.projects {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  grid-auto-rows: max-content;
  column-gap: 20px;
  row-gap: 20px;
}

.project {
  padding: 10px 10px 20px;
  border-radius: 4px;
  background: #f3f5f4;
  min-height: 33vh; /* Мы задаём высоту ради примера, чтобы ячейки не схлопывались. В реальной жизни высота будет определяться пропорциями содержимого ячеек */
  overflow: hidden;
}

.project.sizeS {
  grid-column: auto / span 1;
}

.project.sizeM {
  grid-column: auto / span 2;
}

.project.sizeL {
  grid-column: auto / span 4;
}

Доба­вим мобиль­ную вер­сию «в лоб» — перей­дём на две колонки:

.projects {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  grid-auto-rows: max-content;
  column-gap: 20px;
  row-gap: 20px;
}

.project {
  padding: 10px 10px 20px;
  border-radius: 4px;
  background: #f3f5f4;
  min-height: 33vh;
  overflow: hidden;
}

.project.sizeS {
  grid-column: auto / span 1;
}

.project.sizeM {
  grid-column: auto / span 2;
}

.project.sizeL {
  grid-column: auto / span 4;
}

@media (width <= 768px) {
  .projects {
    grid-template-columns: 1fr 1fr; /* На мобильных сетка из двух колонок */
    grid-auto-flow: dense; /* Просим гриды расставлять проекты по ячейкам «без дыр», пусть даже для этого придётся поменять порядок ячеек */
  }

  .project.sizeL {
    grid-column: auto / span 2;
  }
}

Добавим мобильную версию «в лоб» — перейдём на две колонки:

.projects {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  grid-auto-rows: max-content;
  column-gap: 20px;
  row-gap: 20px;
}

.project {
  padding: 10px 10px 20px;
  border-radius: 4px;
  background: #f3f5f4;
  min-height: 33vh;
  overflow: hidden;
}

.project.sizeS {
  grid-column: auto / span 1;
}

.project.sizeM {
  grid-column: auto / span 2;
}

.project.sizeL {
  grid-column: auto / span 4;
}

@media (width <= 768px) {
  .projects {
    grid-template-columns: 1fr 1fr; /* На мобильных сетка из двух колонок */
    grid-auto-flow: dense; /* Просим гриды расставлять проекты по ячейкам «без дыр», пусть даже для этого придётся поменять порядок ячеек */
  }

  .project.sizeL {
    grid-column: auto / span 2;
  }
}
Скрыт 31 разворот