Разрешить строке сетки увеличивать высоту от одного столбца, но не от другого

Моя цель — сделать так, чтобы images имел такую ​​же высоту, что и description. В настоящее время images может быть намного больше, если источник изображения очень высокий по вертикали:

article {
  display: grid;
  grid-template-areas: "title title" "images description";
  resize: both;
  overflow: hidden;
}

.title {
  grid-area: title;
  padding: 8px;
}

.images {
  grid-area: images;
}

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

.description {
  grid-area: description;
  padding: 8px;
}
<article>
  <div class = "title">There are many other articles like this one on the page</div>
  <div class = "images">
    <img alt = "random image" src = "https://i.sstatic.net/MB9ui48p.png">
    <img alt = "random image" src = "https://i.sstatic.net/MB9ui48p.png">
  </div>
  <div class = "description">The description of the thing. The description of the thing. The description of the thing. The description of the thing. The description of the thing. The description of the thing.</div>
</article>

Установка CSS для img {max-width: 100%;} дает мне именно то, что я хочу, при условии, что изображение не слишком велико по вертикали. Если изображение большое по вертикали, то div .images расширяется слишком сильно, чтобы покрыть все изображение шириной 100%, а затем затмевает div .description справа от него.

Большинство ответов, которые я видел здесь, в настройках SO, упоминают max-height: 100%, но в моем случае это не имеет значения. Другие предлагали использовать img в качестве фона для div, но это похоже на хак.

Я попробовал сделать контейнер .images флексбоксом, но ограничение по вертикали также не повлияло.

На данный момент лучше всего работала установка img {max-height: 50vh}, но это не совсем то же самое, что сделать .images такой же высоты, как .description.

Имеет ли родительский контейнер (например, статья или ее родительский элемент) определенную высоту? В противном случае вы можете не увидеть предполагаемого поведения. И есть ли в статьях столбцы и строки сетки с заданной высотой? Я понимаю, что текст может быть разного размера, но если вы можете управлять этими элементами, у вас будут изображения и описание одинакового размера: .images, .description { height: 100%; }

Marc Inglis 20.08.2024 04:59

@MarcInglis Хорошо замечено! Нет, родительский элемент и контейнер не имеют заданной высоты. Проблема в том, что description может различаться по длине/высоте, поэтому я не знаю, что туда можно поместить. Я попытался изменить их сейчас на {height: 100%}, но это не имело никакого значения.

flen 20.08.2024 05:04

Я просто подумал, что теперь могу вместо сетки поставить <div display:flex>images description</div>, но столкнулся с той же проблемой, когда невозможно заставить изображения иметь высоту описания в этом флексбоксе.

flen 20.08.2024 05:06

Хммм, но я думаю, что вы правы, мне нужно сделать <div>images description</div> и установить для этого div-обертки заданную высоту. Тем не менее, возможно, просто невозможно заставить .description расти настолько, насколько он хочет, но не .images?

flen 20.08.2024 05:11

Вы хотите, чтобы папка изображений была такой же ширины, как и изображение, или составляла 50 % ширины макета?

ralph.m 20.08.2024 05:31

@ralph.m ширина работает хорошо, и да, я хотел, чтобы она составляла ~ 50% макета (по какой-то причине в этом макете сетки она никогда не составляет ровно 50%, но достаточно близко для моих целей)

flen 20.08.2024 05:36

То есть, если текста описания не так много, между ним и изображением может быть много места?

ralph.m 20.08.2024 05:43

@ralph.m извини, ты прав! это будет варьироваться... Я не могу иметь ширину и высоту одновременно 50%. Но что для меня действительно важно, так это только высота, ничего страшного, если ширина сильно варьируется, пока изображение не растягивается.

flen 20.08.2024 05:45
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в 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. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
8
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

article {
  display: grid;
  grid-template-areas: "title title" "images description";
  grid-template-columns: 1fr 1fr;
  resize: both;
  overflow: hidden;
}

.title {
  grid-area: title;
  padding: 8px;
}

.images {
  grid-area: images;
  container-type: size;
  overflow-y: auto;
}

img {
  display: block;
  width: calc(100cqw - 15px);
}

.description {
  grid-area: description;
  padding: 8px;
}
<article>
  <div class = "title">There are many other articles like this one on the page</div>
  <div class = "images">
    <img alt = "random image" src = "https://i.sstatic.net/MB9ui48p.png">
    <img alt = "random image" src = "https://i.sstatic.net/MB9ui48p.png">
  </div>
  <div class = "description">The description of the thing. The description of the thing. The description of the thing. The description of the thing. The description of the thing. The description of the thing.</div>
</article>

width: calc(100cqw - 15px); на ваших изображениях их размер должен быть равен ширине их контейнера за вычетом ширины любой полосы прокрутки (вам может потребоваться отрегулировать 15 пикселей, если при тестировании они переполняются)

Это решение идеально!! Это именно то, что я хотел, за исключением одного: можно ли изменить размер img по размеру контейнера вместо переполнения прокрутки?

flen 20.08.2024 06:07

@flen Да. Доступны следующие варианты: прокрутка изображений, растягивание изображений, крошечные изображения.

Zach Jensz 20.08.2024 06:12

Спасибо! Как сделать изображение маленьким? Извините, я, кажется, немного запутал, но вместо того, чтобы ширина идеально соответствовала 50% страницы, я бы предпочел, чтобы ширина менялась, но изменял размер изображения (и сохранял его масштаб). , вместо того, чтобы растягивать его), поэтому высота будет ограничена высотой описания (т. е. изображение будет крошечным).

flen 20.08.2024 06:13

Похоже, Ральф уже решил это за тебя.

Zach Jensz 20.08.2024 06:18

Это правда, но только для 1 изображения (или 2, если они склеены в другом месте, а затем добавлены как 1 img)

flen 20.08.2024 06:19
Ответ принят как подходящий

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

article {
  display: grid;
  grid-template-areas: "title title" "images description";
  grid-template-columns: 1fr 1fr;
  resize: both;
  overflow: hidden;
}

.title {
  grid-area: title;
  background: #e7e7e7;
}

.images {
  grid-area: images;
  position: relative;
  height: 100%;
  background: #f49c9c;
}

.description {
  grid-area: description;
  background: #f7f7f7;
}

.images>img {
  position: absolute;
  height: 100%;
  max-width: 100%;
  object-fit: contain;
  object-position: 0 0;
}
<article>
  <div class = "title">There are many other articles like this one on the page</div>
  <div class = "images">
    <img src = "https://unsplash.it/200/300">
    <img src = "https://unsplash.it/200/300">
  </div>
  <div class = "description">The description of the thing</div>
</article>

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

Обновлено: одно ограничение здесь заключается в том, что вы можете иметь только одно изображение. Я поставил два, но они сидят друг на друге. Если вам нужно несколько изображений, это не сработает!

Описание кажется обрезанным при больших размерах

Zach Jensz 20.08.2024 05:55

У меня иногда бывает 2 изображения...! Это может быть 1 или 2 изображения. Но это очень разумное решение для 1 img, я попробовал его на своей странице, и оно отлично сработало, за исключением ширины некоторых изображений, которая превышала позицию: абсолютную, но это, вероятно, тоже можно настроить.

flen 20.08.2024 06:01

Ах, хорошие замечания по поводу длинного текста. Я обновил его, чтобы иметь дело с более длинным текстом. Один из хаков для двух изображений — объединить два изображения в одно…

ralph.m 20.08.2024 06:02

Ой, это было больно, но я придумал пару других способов сделать 2 изображения с помощью этого кода. Самый простой — добавить правила CSS: img {height: 50%;} img:nth-child(2) {top: 50%;}

flen 20.08.2024 07:08

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