#html #css #angular #padding
Вопрос:
У меня есть некоторый угловой html-код, который отображает список изображений (некоторые из которых могут быть повторениями других изображений) примерно так:
<div *ngFor="let content of contentList>
<img class="image" src="{{ content.image }}"/>
</div>
css для изображения:
.image {
height: 100%;
max-height: 72px;
}
Я хотел бы установить отступ внизу для каждого изображения в зависимости от высоты изображения. Заполнение снизу должно быть 72px - height of image
-в основном, заполнение должно охватывать любые оставшиеся пиксели максимальной высоты 72 пикселей.
Что-то вроде:
.image {
height: 100%;
max-height: 72px;
padding-bottom: (72 - the image's height)px;
}
Как этого можно добиться?
Ответ №1:
Вы могли бы сохранить всю логику в шаблоне, чтобы он работал в ngFor:
<div *ngFor="let content of contentList">
<img
class="image"
(load)="image.style.paddingBottom = 72 - image.height 'px'"
[src]="content.image"
#image
/>
</div>
Ответ №2:
Вы можете создать компонент с помощью шаблона, подобного следующему:
<img
[src]="path"
(load)="onLoad()"
[style.paddingBottom.px]="paddingBottom"
#image
/>
где path
представляет ссылку на источник изображения и paddingBottom
определяет заполнение нижней части изображения. Изображение помечается #image
идентификатором для доступа к элементу ( ElementRef
). Как только изображение будет загружено (в onLoad()
функции), вы сможете получить доступ к высоте изображения и рассчитать отступ внизу. Настоящим в ImageComponent
:
export class ImageComponent implements OnInit {
@Input() paddingBottom = 72;
@Input() maxPaddingBottom = 72;
@Input() path = '';
@ViewChild('image') image?: ElementRef;
...
onLoad(): void {
if (this.image) {
const h = (this.image?.nativeElement as HTMLImageElement).height;
this.paddingBottom = this.maxPaddingBottom - h;
}
}
}
Конечно, вы можете вызвать этот компонент несколько раз внутри контейнера компонентов.
<ng-container *ngFor="let p of paths">
<app-image [path]='p'></app-image>
</ng-container>
Комментарии:
1. Это может сработать, если у меня есть только одно изображение, но, похоже, не работает в случае рендеринга нескольких изображений в цикле
2. Быстрое решение: Переместите описанное выше в пользовательский компонент (со свойством path) и вызовите компонент в своем цикле
Ответ №3:
Если эффект, который вы хотите, составляет максимальную высоту изображения 72 пикселей, не могли бы вы попробовать обернуть img в div и установить высоту на этом div? Даст ли это вам тот визуальный эффект, который вы ищете? Для этого не потребуется варьировать заполнение, «заполнением» будет пространство, оставшееся внутри div imgHolder.
.imgHolder {
height: 72px;
}
.image {
max-height: 100%;
max-width: 100%;
}
<div *ngFor="let content of contentList>
<div class="imgWrapper"
<img class="image" src="{{ content.image }}"/>
</div>
</div>