Вопрос
Как настроить стратегию положения наложения материала cdk, которая отлично работает на больших и маленьких экранах?
Цель
МойЦель состоит в том, чтобы создать наложение с помощью Углового наложения CDK , которое следует этим правилам:
- Никогда не размещайте наложение вне области просмотра
- Максимальная высота 300 пикселей
- Положение наложения y с приоритетом сверху, по центру снизу.
- На экранах с высотой ниже 300 используйте доступную высоту.
- Другими словами, минимальная высота отсутствует.
Что работает ?
Я выполнил некоторые из вышеуказанных требований, как вы можете видеть здесь, позиционирование отлично работает на устройствах с достаточным вертикальным пространством (вв этом случае 512px):
сломанная часть ?
Однако, как вы можете видеть из следующего рисунка, это не работает на небольших устройствах с недостаточным вертикальным пространством (в этомcase 255px). На самом деле, как вы можете сказать из GIF, в 2 случаях это было очень близко. Положение было правильным, была отключена только высота.
Здесь цель состоит в том, чтобы использовать доступное пространство, как показано красным:
Код ?
У меня есть стек блиц, где вы можете экспериментировать здесь .
компонент
openPopup(element: any) {
const overlayRef = this.overlay.create({
hasBackdrop: true,
positionStrategy: this.overlay.position()
.flexibleConnectedTo(element)
.withLockedPosition()
.withPositions([
{
panelClass: 'custom-panel1',
originX: 'center',
originY: 'center',
overlayX: 'start',
overlayY: 'top',
},
{
panelClass: 'custom-panel2',
originX: 'center',
originY: 'center',
overlayX: 'start',
overlayY: 'center',
},
{
panelClass: 'custom-panel3',
originX: 'center',
originY: 'center',
overlayX: 'start',
overlayY: 'bottom',
},
])
,
width: '200px',
maxHeight: 300,
});
const popupComponentPortal = new ComponentPortal(PopupComponent);
overlayRef.attach(popupComponentPortal);
overlayRef.backdropClick().subscribe(() => {
overlayRef.dispose();
});
}
глобальные стили
.cdk-overlay-pane {
max-height: 300px;
}
Примечания
Я думал об использовании глобального позиционированиястратегия, когда высота области просмотра становится маленькой. Однако я предпочел бы избежать этого сценария, так как мне бы понравилось решение, которое могло бы охватить любую высоту оверлея (с учетом максимальной высоты вне курса).
Я рекомендую использовать «Открыть в новом окне LIVE»"особенность stackbllitz, при тестировании stackblitz. Ссылка здесь снова .
Я был бы НАСТОЛЬКО благодарен, если бы вы могли помочь решить эту проблему или указать мне правильное направление ??♂️