Масштабирование изображений внутри div с текстом

Для личного проекта с Angular, Angular Material и Flex-Layout я пытаюсь добиться аналогичного макета, используемого приложением Приносить!: Масштабирование изображений внутри div с текстом

Имея изображения разного размера (не все в квадрате), я хотел бы пропорционально центрировать их и допустить некоторый текст под ними. У меня есть следующие шаблоны и стили scss:

<div fxLayout = "row" fxLayoutGap = "5px" class = "cards-container">
 <div class = "item-card">
   <div class = "image">
     <img src = "../../../../assets/icons/apple.png" alt = "Mela" />
   </div>
   <span class = "item-name">Mela</span>
   <span class = "description">12</span>
 </div>
 <div class = "item-card">
  <div class = "image">
     <img src = "../../../../assets/icons/milk.png" alt = "Latte" />
  </div>
  <span class = "item-name">Latte</span>
  <span class = "description">1 description comes here, must be hidden if long text</span>
 </div>
</div>

//---------------------------------------------------

.cards-container {
  flex-wrap: wrap;

  .item-card {
    display: flex;
    flex-direction: column;
    justify-items: end;
    color: white;
    width: 7em;
    height: 7em;
    text-align: center;
    background-color: darkslategray;
    margin: 5px 0;
    img {
        width: 40%; // TODO: how to scale?
        height: 40%;
    }

    .text-container {
        display: flex;
        flex-direction: column;

        .item-name {
            display: inline-block;
            font-size: 1.1em;
        }

        .description {
            width: 99%;
            font-size: 0.8em;
            text-align: center;
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
            display: inline-block;
        }
    }
  }
}

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

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

user4676340 07.01.2019 15:26

Это побочное примечание, но вы хотите изменить свой путь img на это: src = "assets/icons/apple.png", иначе они не будут найдены в сборке prod

mchl18 07.01.2019 15:44

Совершенно верно mchl18, я все еще тестирую локально, но исправлю как можно скорее.

Francesco 07.01.2019 16:30
Приемы 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
3
366
3

Ответы 3

Ты пытался:

   img {
        width: 40%; 
        height: auto;
    }

При этом пропорции изображения должны оставаться неизменными.

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

Francesco 07.01.2019 16:27

Кажется, все выглядит нормально, но похоже, что в вашем HTML-коде отсутствуют div и класс .text-container.

<div class = "item-card">
   <div class = "image">
     <img src = "../../../../assets/icons/apple.png" alt = "Mela" />
   </div>
   <span class = "item-name">Mela</span>
   <span class = "description">12</span>
 </div>

должно быть

<div class = "item-card">
   <div class = "image">
     <img src = "../../../../assets/icons/apple.png" alt = "Mela" />
   </div>
   <div class = "text-container">
     <span class = "item-name">Mela</span>
     <span class = "description">12</span>
   </div>
 </div>

Теперь для text-overflow: ellipsis; это не работает в многострочном режиме, если вы не реализуете какой-либо JavaScript или что-то в этом роде.

Если есть какие-либо изменения в вашем коде, я бы вместо этого сделал изображения background-image. Без этого могут быть другие способы, но я использую его, чтобы убедиться, что контейнер реагирует, а изображение всегда реагирует и центрируется.

Например: https://codepen.io/StudioKonKon/pen/wRjOzr (включает SCSS)

.image {
  background-position: center center;
  background-size: contain;
  background-repeat: no-repeat;
  font-size: 0;
}
.image-mela {
  background-image: url("https://via.placeholder.com/150x175");
}
.image-latte {
  background-image: url("https://via.placeholder.com/200x50");
}
.image-long {
  background-image: url("https://via.placeholder.com/50x100");
}

.cards-container {
  width: 100%;
  margin: auto;
  display: flex;
  flex-wrap: wrap;
}
.cards-container .item-card {
  display: flex;
  flex-direction: column;
  justify-items: end;
  color: white;
  width: 7em;
  height: 7em;
  text-align: center;
  background-color: darkslategray;
  margin: 5px;
  padding: 0.5em;
  box-sizing: border-box;
  overflow: hidden;
}
.cards-container .item-card .image {
  display: block;
  margin: auto;
  width: 40%;
  height: 40%;
}
.cards-container .item-card .text-container {
  display: flex;
  flex-direction: column;
}
.cards-container .item-card .text-container .item-name {
  display: inline-block;
  font-size: 1.1em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.cards-container .item-card .text-container .description {
  font-size: 0.8em;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  display: inline-block;
}
<div fxLayout = "row" fxLayoutGap = "5px" class = "cards-container">
  <div class = "item-card">
    <div class = "image image-mela">Mela</div>
    <div class = "text-container">
      <span class = "item-name">Mela</span>
      <span class = "description">12</span>
    </div>
  </div>
  <div class = "item-card">
    <div class = "image image-latte">Latte</div>
    <div class = "text-container">
      <span class = "item-name">Latte</span>
      <span class = "description">1 description comes here, must be hidden if long text</span>
    </div>
  </div>
  <div class = "item-card">
    <div class = "image image-long">Long Image</div>
    <div class = "text-container">
      <span class = "item-name">Long Image Text</span>
      <span class = "description">must be hidden if long text</span>
    </div>
  </div>
</div>

Это просто. Думаю, это решит проблему. :)

<!DOCTYPE html>
<html>
<head>
    <meta charset = "utf-8">
    <meta http-equiv = "X-UA-Compatible" content = "IE=edge">
    <title>item</title>
    <style type = "text/css" media = "screen">
    .item-single{
        width: 100px;
        background-color: #e7e7e7;
        height: 100px;
        text-align: center;
    }
    .item-single span{
        display: block;
    border: 1px solid #000; /* just to show the alignment  */
    }
    .item-single img{
        width: 50%; /*  you can scale it down using width */
    border:1px solid #000; /* just to show the alignment */
        display: block;
        margin: auto;
    }
</style>
</head>
<body>
    <div class = "item-single">
        <img src = "http://sugamparajuli.com.np/wp-content/uploads/2019/01/banana.png">
        <span class = "item-name">Mela</span>
        <span class = "description">12</span>
    </div>
</body>
</html>

Вот результат. элемент-изображение

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