components icon indicating copy to clipboard operation
components copied to clipboard

ability to manually control overlay's z-index

Open fxck opened this issue 9 years ago • 19 comments
trafficstars

This would be handy for both user created overlays, as well as those used by angular components such as md-menu.

Take this for example http://plnkr.co/edit/AqjYdsScCYPlK9w44aHQ?p=preview you have a fixed element(some sort custom toolbar), inside it you have a button which triggers md-menu, it works fine, but the md-menu-click-catcher, which is for some reason inside the actual md-menu element, is actually stacked above md-overlay-container, causing any attempt to click on the menu items to close the menu(which can be extremely confusing).

  1. md-overlay-container should not have z-index at all, as it renders z-indexes of md-overlay-pane useless
  2. you should be able to manually control z-index of md-overlay-pane

I imagine(at least for the user invoked overlay), it could work either by being able to give the overlay my own identificator(class at least), or being able to set it via OverlayState settings.. the former is preferable, as you can then easily switch z-indexes with media queries.

fxck avatar Oct 05 '16 17:10 fxck

Here is a good example why cdk-overlay-container should not have z-index

z-index

meowhunter avatar Jul 18 '19 13:07 meowhunter

Any updates?? That's really annoying

am-awais avatar Oct 16 '19 09:10 am-awais

I sort it out myself by using two stylessheet one Global and other component's stylesheet, In global i set z-index to to lower value(1000) so that it goes behind the header and in popup component styles sheet i set that to high value(2000) with !important so that header goes behind my overlay. That's how i manage to solve it Thank me later

am-awais avatar Oct 17 '19 07:10 am-awais

Maybe it help https://blog.bbogdanov.net/post/angular-material-overlay-hack-overlay-container/

aksenovdev avatar Dec 24 '19 07:12 aksenovdev

Any news? There are some situations where somebody want his overlay to overlap even a fixed header. Think about tooltips. Inside OverlayConfig we already have BackdropClass and PanelClass. Why not ContainerClass too?

4javier avatar Jul 14 '20 15:07 4javier

I am pretty sure the correct approach is something like bringToFront method... That way we can do it only when needed and not absolutely. For example when we open a select it will bring itself to front.

Harpush avatar Aug 18 '20 05:08 Harpush

Just a heads up that we kicked off a community voting process for your feature request. There are 20 days until the voting process ends.

Find more details about Angular's feature request process in our documentation.

angular-robot[bot] avatar Feb 01 '22 17:02 angular-robot[bot]

Maybe it help https://blog.bbogdanov.net/post/angular-material-overlay-hack-overlay-container/

I'm horrified, but this might actually work. Thank you, @aksenovdev .

This would be SO much better if we could actually just do this normally, though. I guess that depends on whether the community votes on it.

Currently, if I have a fixed header, there's no way for me to specify that

Menus will go above the header, but Selects will go below the header, because there's no way to have two different z-indexes.

EliezerB123 avatar Feb 17 '22 16:02 EliezerB123

Thank you for submitting your feature request! Looks like during the polling process it didn't collect a sufficient number of votes to move to the next stage.

We want to keep Angular rich and ergonomic and at the same time be mindful about its scope and learning journey. If you think your request could live outside Angular's scope, we'd encourage you to collaborate with the community on publishing it as an open source package.

You can find more details about the feature request process in our documentation.

angular-robot[bot] avatar Feb 21 '22 15:02 angular-robot[bot]

I sort it out myself by using two stylessheet one Global and other component's stylesheet, In global i set z-index to to lower value(1000) so that it goes behind the header and in popup component styles sheet i set that to high value(2000) with !important so that header goes behind my overlay. That's how i manage to solve it Thank me later

@am-awais If only it were that simple. That doesn't actually work, because Angular won't remove CSS that's been added to a page after the component that called it gets removed. So your 'popup' CSS is still there, and will get removed... never. The global CSS would be permanently overwritten once popup component has been opened even once.

EliezerB123 avatar Feb 23 '22 16:02 EliezerB123

They have decided to just use BlockScrollStrategy to avoid this bug on the website. But what if overlay pane is bigger and you need to scroll? That's so unflexible, I kinda disappointed this problem exists, reported and not going to be fixed.

DzmVasileusky avatar Jul 12 '22 19:07 DzmVasileusky

This issue is still present

Nikita1814 avatar Feb 06 '23 10:02 Nikita1814

I'm using several overlays on one page and I need to programmatically "bring to front" one of them at a specific time. Currently I don't have a solution, it would be nice to be able to control the z-index of individual overlays to chose which one is supposed to be at the top.

DavidJournot avatar Aug 06 '23 20:08 DavidJournot

We need this!

ezzabuzaid avatar Oct 06 '23 15:10 ezzabuzaid

Here is a workaround:

After opening the dialog pass the component instance, it has to have elementRef

setDialogInFront(ref.componentInstance);

Function that will set the dialog in front

export function setDialogInFront(elementHost: {
  elementRef: { nativeElement: HTMLElement };
}): void {
  const element = elementHost.elementRef.nativeElement;
  const mainOverlayWrapper = element.closest(
    '.cdk-global-overlay-wrapper'
  ) as HTMLElement;

  // the backdrop is the element before the main overlay wrapper
  // could be null if the dialog config contains hasBackdrop: false
  const mainOverlayBackDrop =
    mainOverlayWrapper.previousElementSibling as HTMLElement | null;

  // get the max z-index of the other dialogs
  let maxZIndex = 0;
  document
    .querySelectorAll('.cdk-global-overlay-wrapper')
    .forEach((wrapper) => {
      const zIndex = parseInt(
        window.getComputedStyle(wrapper).getPropertyValue('z-index'),
        10
      );
      maxZIndex = Math.max(maxZIndex, zIndex);
    });

  // set the z-index of the main dialog to be one higher than the max
  mainOverlayWrapper.style.zIndex = `${maxZIndex + 1}`;

  if (mainOverlayBackDrop) {
    mainOverlayBackDrop.style.zIndex = `${maxZIndex + 1}`;
  }
}

Example dialog component

export class MyDialogComponent {
  public elementRef: ElementRef<HTMLElement> = inject(ElementRef);
}

ezzabuzaid avatar Oct 13 '23 14:10 ezzabuzaid

Would you please provide with some api to control zindex of overlay?

vvianyy avatar Oct 19 '23 01:10 vvianyy

Any solutions now? That’s big problem. Please provide some api to control zindex.

emondora avatar Jan 25 '24 05:01 emondora

When you create an overlay with this.overlay.create(config), you receive an OverlayRef object. This object has a private _host property that corresponds to the HTML element of the overlay. You can modify its style directly as follows:

(overlayRef['_host'] as HTMLElement).style.zIndex = `${zIndex}`;

You can set the zIndex property either programmatically or by selecting all the elements with the class name 'cdk-global-overlay-wrapper' and increasing their values as needed. For example:

const DEFAULT_ZINDEX = 1000;
const zIndex = DEFAULT_ZINDEX + document.querySelectorAll('.cdk-global-overlay-wrapper').length + 1;

ParsaArvanehPA avatar Jan 27 '24 10:01 ParsaArvanehPA

@use '@angular/cdk' as cdk;

cdk.$overlay-container-z-index: 1056; cdk.$overlay-z-index: 1056; cdk.$overlay-backdrop-z-index: 1056;

@include cdk.overlay();

yuriy-bezrukov avatar Feb 15 '24 09:02 yuriy-bezrukov