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

Имея изображения разного размера (не все в квадрате), я хотел бы пропорционально центрировать их и допустить некоторый текст под ними. У меня есть следующие шаблоны и стили 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;
}
}
}
}
Однако изображения не масштабируются, чтобы сохранить пропорции с другими изображениями, особенно если они узкие и длинные.
Это побочное примечание, но вы хотите изменить свой путь img на это: src = "assets/icons/apple.png", иначе они не будут найдены в сборке prod
Совершенно верно mchl18, я все еще тестирую локально, но исправлю как можно скорее.






Ты пытался:
img {
width: 40%;
height: auto;
}
При этом пропорции изображения должны оставаться неизменными.
Я пробовал, но оставил высоту: авто неправильно масштабирует длинные изображения (например, бутылка) по сравнению с квадратными (например, яблоко)
Кажется, все выглядит нормально, но похоже, что в вашем 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>
Вот результат. элемент-изображение
Пожалуйста, предоставьте минимальный воспроизводимый пример, проблемы css решаются быстрее, когда мы действительно можем попробовать код.