Картинки выезжают из грид сетки, как решить?

Рейтинг: 0Ответов: 2Опубликовано: 16.01.2023

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

введите сюда описание изображения

Вот так оно выглядит нормально. Стоит растянуть экран, ширину блока и картинки начинают выезжать и скрывать .intro__info, вот так:

введите сюда описание изображения

Сейчас у меня написано grid-template-rows: 1fr auto
Я планировал такое поведение: Блок с .intro__info будет занимать какое-то место, а .intro__images будет занимать всё оставшееся. Но она так не работает. Подскажите, как добиться того поведения, которое я хочу

@import url('https://fonts.googleapis.com/css2?family=Bevan&family=JetBrains+Mono:wght@400;700&family=Poppins:wght@400;500;600;700&family=Roboto:wght@300;400&display=swap');
*,
*::before,
*::after {
  box-sizing: inherit;
}

html {
  box-sizing: border-box;
}

body {
  font-size: 17px;
  font-family: 'Poppins', sans-serif;
  margin: 0;
  /*  
    font-family: 'Poppins', sans-serif; 
    font-family: 'JetBrains Mono', monospace; 
    font-family: 'Bevan', cursive; 
    font-family: 'Roboto', sans-serif; 
    */
}

img {
  display: block;
  max-width: 100%;
  max-height: 100%;
}

.container {
  width: 100%;
  max-width: 1340px;
  margin: 0 auto;
  padding: 0 15px;
  display: block;
}


/* .intro */

.intro {
  height: 100vh;
}

.intro-section {
  height: 100%;
  display: grid;
  grid-template-areas: "intro__description intro__images" "intro__description intro__info";
  grid-template-rows: 1fr auto;
  grid-template-columns: 1fr 1fr;
  overflow-y: hidden;
}

.intro__images {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-area: intro__images;
}

.intro__description {
  grid-area: intro__description;
  background-color: grey;
}

.intro__img {
  object-fit: cover;
  width: 100%;
  height: 100%;
}

.intro__info {
  padding: 20px 0;
  background-color: black;
  grid-area: intro__info;
  color: white;
}

.intro-section_test-1 {
  height: 400px;
}


/* .intro */
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./style.css">
</head>

<body>

  <div class="intro">

    <header class="header">
      <div class="container">
        <div class="header__wrapper"></div>
      </div>
    </header>

    <div class="intro-section intro-section_test-1">
      <div class="intro__description"></div>
      <div class="intro__images">
        <div class="intro__img-wrapper">
          <img src="https://i.sstatic.net/ideko.png" alt="" class="intro__img">
        </div>
        <div class="intro__img-wrapper">
          <img src="https://i.sstatic.net/dOzMG.png" alt="" class="intro__img">
        </div>
        <div class="intro__img-wrapper">
          <img src="https://i.sstatic.net/rx0Cv.png" alt="" class="intro__img">
        </div>
      </div>
      <div class="intro__info">
        Описание
      </div>
    </div>

  </div>

</body>

</html>

Ответы

▲ 1Принят

Единственное, что мне приходит в голову: grid-template-rows: 80% 20% руками задать. Но это не то поведение, которое я хочу. Я бы хотел, чтобы второй блок занимал места столько, сколько ему нужно, а первый блок занимал всё оставшееся место в линии. 80% 20% указывать имеет минус, потому что второй блок может обрезаться, если в нём будет больше контента, чем 20%

@import url('https://fonts.googleapis.com/css2?family=Bevan&family=JetBrains+Mono:wght@400;700&family=Poppins:wght@400;500;600;700&family=Roboto:wght@300;400&display=swap');
*,
*::before,
*::after {
  box-sizing: inherit;
}

html {
  box-sizing: border-box;
}

body {
  font-size: 17px;
  font-family: 'Poppins', sans-serif;
  margin: 0;
  /*  
    font-family: 'Poppins', sans-serif; 
    font-family: 'JetBrains Mono', monospace; 
    font-family: 'Bevan', cursive; 
    font-family: 'Roboto', sans-serif; 
    */
}

img {
  display: block;
  max-width: 100%;
  max-height: 100%;
}

.container {
  width: 100%;
  max-width: 1340px;
  margin: 0 auto;
  padding: 0 15px;
  display: block;
}


/* .intro */

.intro {
  height: 100vh;
}

.intro-section {
  height: 100%;
  display: grid;
  grid-template-areas: "intro__description intro__images" "intro__description intro__info";
  grid-template-rows: 80% 20%;
  grid-template-columns: 1fr 1fr;
  overflow-y: hidden;
}

.intro__images {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-area: intro__images;
}

.intro__description {
  grid-area: intro__description;
  background-color: grey;
}

.intro__img {
  object-fit: cover;
  width: 100%;
  height: 100%;
}

.intro__info {
  padding: 20px 0;
  background-color: black;
  grid-area: intro__info;
  color: white;
  display: flex;
  justify-content: center;
  align-items: center;
}


/* .intro */
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./style.css">
</head>

<body>

  <div class="intro">

    <header class="header">
      <div class="container">
        <div class="header__wrapper"></div>
      </div>
    </header>

    <div class="intro-section">
      <div class="intro__description"></div>
      <div class="intro__images">
        <div class="intro__img-wrapper">
          <img src="https://i.sstatic.net/ideko.png" alt="" class="intro__img">
        </div>
        <div class="intro__img-wrapper">
          <img src="https://i.sstatic.net/dOzMG.png" alt="" class="intro__img">
        </div>
        <div class="intro__img-wrapper">
          <img src="https://i.sstatic.net/rx0Cv.png" alt="" class="intro__img">
        </div>
      </div>
      <div class="intro__info">
        Описание
      </div>
    </div>

  </div>

</body>

</html>

▲ 0

.intro-section_test-1 задана фиксированная высота в 400px. Она не даёт блокам пропорционально расширяться. Если этот вариант не подходит - можно задать max-height для .intro__img

P.S. Думаю, это из-за того, что картинкам задан object-fit: cover и они пытаются заполнить всё пространство. Разумеется, когда блоки расширились, картинки тоже пытаются заполнить всё пространство. Как вариант - дать фиксированную высоту обёртке.