Масштабирование изображений внутри div с текстом - PullRequest
0 голосов
/ 07 января 2019

Для персонального проекта с Angular, Angular Material и Flex-Layout я пытаюсь добиться аналогичного макета, используемого Bring! App: enter image description here

Имея изображения разного размера (не все в квадрате), я бы хотел расположить их по центру и разрешить под ними текст. У меня есть следующие шаблоны и стили 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;
        }
    }
  }
}

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

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Все выглядит хорошо, но в вашем HTML-коде отсутствует .text-container div и класс.

<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>
0 голосов
/ 07 января 2019

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

<!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>

Это результат. Пункт-изображение

0 голосов
/ 07 января 2019

Вы пробовали:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...