Angular CDK понимает систему позиционирования наложения

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

Что означает следующий код?

const positions = [
  new ConnectionPositionPair({ originX: 'start', originY: 'bottom' }, { overlayX: 'start', overlayY: 'top' }),
  new ConnectionPositionPair({ originX: 'start', originY: 'top' }, { overlayX: 'start', overlayY: 'bottom' })
];
this.positionStrategy = this._overlay.position()
.flexibleConnectedTo(this.getConnectedElement())
.withPositions(positions)
.withFlexibleDimensions(false)
.withPush(false);

person undefined    schedule 20.09.2018    source источник


Ответы (2)


Документации по Angular Overlay CDK по-прежнему не так много. Большая часть того, что я узнал, взята из их репозитория Github.

Стратегия глобальной позиции

Это будет глобальная стратегия позиционирования. Создаваемый вами оверлей будет располагаться непосредственно на экране, а не по отношению к элементу. Это хорошо для всплывающего диалогового окна или модального окна.

  overlayConfig = this.overlay.position().global()
    .centerHorizontally().centerVertically();

Гибкость, связанная со стратегией

Это то, что вы хотите использовать для панелей инструментов, меню, вещей, которые выдвигаются из кнопки. Вам нужно будет передать ссылку на кнопку, к которой вы хотите подключить оверлей:

<button id="toolbar-icons" cdkOverlayOrigin mat-button class="toolbar-button" (click)="this.showAppContext()">

и в вашем Component.ts

showAppContext() {
  const appOverlayRef: AppOverlayRef = 
    this.appOverlayService.open(this.origin);
}

ConnectionPositionPair – это список предпочтительных позиций, от наиболее до наименее желаемых. Таким образом, он сначала попытается использовать первую позицию, которую вы передали.

originX: это будет «начало», «конец» или «центр». Это точка крепления вашей накладки. Если вы передали кнопку в функцию .flexibleConnectedTo, это относится к началу, концу и центру этого элемента.

originY: это будет «верх», «низ» или «центр». Это относится к верхней, нижней или центральной части передаваемого элемента.

Таким образом, { originX: 'start', originY: 'bottom' } будет левым нижним углом кнопки.

overlayX и overlayY имеют одинаковые параметры, но относятся к тому, к чему будет прикреплено наложение. { overlayX: 'start', overlayY: 'top' } прикрепляет верхний левый угол наложения к указанной нами исходной точке.

Затем, как вы можете видеть в массиве, мы можем передать несколько позиций. Если оверлей не подходит к первой позиции, он попытается перейти к следующей позиции в массиве. Таким образом, если оверлей не помещается на экране в первом случае, он автоматически сместится во вторую позицию, которая здесь определяется как соединение верхней левой стороны нижней части с нижней левой рукой оверлея.

const positions = [
  new ConnectionPositionPair(
   { originX: 'start', originY: 'bottom' },
   { overlayX: 'start', overlayY: 'top' }),
  new ConnectionPositionPair(
  { originX: 'start', originY: 'top' },
  { overlayX: 'start', overlayY: 'bottom' })];
];

с помощью Push

Вы можете установить для withPush значение true, что приведет к перемещению оверлея на экран, если ни одна из предоставленных позиций не подходит.

Код по-прежнему является лучшим местом для просмотра документации: https://github.com/angular/material2/blob/master/src/cdk/overlay/position/connected-position.ts

person David Rinck    schedule 17.10.2018
comment
Не могли бы вы объяснить {originX: 'начало', originY: 'верх'}, {overlayX: 'начало', overlayY: 'нижний'}, пожалуйста? - person undefined; 17.10.2018
comment
Добавил объяснение. Дайте мне знать, если это поможет, или если что-то нуждается в разъяснении. - person David Rinck; 18.10.2018
comment
По состоянию на 2019 год могут быть полезны документы Angular CDK: material.angular.io/cdk/overlay/overview. - person Rilcon42; 06.09.2019
comment
Это кажется такой мощной системой позиционирования, но я не могу понять, как выровнять правый край моего наложения по левому краю связанного элемента. Я пытаюсь воспроизвести всплывающее окно начальной загрузки position=left - person Josh; 02.06.2020

Ответ Дэвида Ринка на этот вопрос помог мне после многих дней проб и ошибок, поэтому я решил опубликовать шпаргалку, которую составил на основе этого, в надежде, что это может помочь кому-то в будущем.

Это может не сработать для всех, но мне помогло:

// top-left
originX: 'start', // left corner of the button
originY: 'bottom', // bottom corner of the button
overlayX: 'start', // left corner of the overlay to the origin
overlayY: 'top', // top corner of the overlay to the origin

// top-right
originX: 'end', // right corner of the button
originY: 'bottom', // bottom corner of the button
overlayX: 'end', // right corner of the overlay to the origin
overlayY: 'top', // top corner of the overlay to the origin

// bottom-left
originX: 'start', // left corner of the button
originY: 'top', // top corner of the button
overlayX: 'start', // left corner of the overlay to the origin
overlayY: 'bottom', // top corner of the overlay to the origin

// bottom-right
originX: 'end', // right corner of the button
originY: 'top', // top corner of the button
overlayX: 'end', // right corner of the overlay to the origin
overlayY: 'bottom', // top corner of the overlay to the origin
person Lizinka    schedule 03.11.2020