Skip to content

ability to manually control overlay's z-index #1432

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
fxck opened this issue Oct 5, 2016 · 20 comments
Open

ability to manually control overlay's z-index #1432

fxck opened this issue Oct 5, 2016 · 20 comments
Labels
area: cdk/overlay feature This issue represents a new feature or feature request rather than a bug or bug fix P4 A relatively minor issue that is not relevant to core functions

Comments

@fxck
Copy link
Contributor

fxck commented Oct 5, 2016

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.

@jelbourn jelbourn added the feature This issue represents a new feature or feature request rather than a bug or bug fix label Oct 5, 2016
@jelbourn jelbourn added the P4 A relatively minor issue that is not relevant to core functions label Jun 6, 2017
@meowhunter
Copy link

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

z-index

@am-awais
Copy link

am-awais commented Oct 16, 2019

Any updates?? That's really annoying

@am-awais
Copy link

am-awais commented Oct 17, 2019

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

@aksenovdev
Copy link

@4javier
Copy link

4javier commented Jul 14, 2020

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?

@Harpush
Copy link

Harpush commented Aug 18, 2020

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.

@angular-robot
Copy link
Contributor

angular-robot bot commented Feb 1, 2022

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.

@EliezerB123
Copy link

EliezerB123 commented Feb 17, 2022

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.

@angular-robot
Copy link
Contributor

angular-robot bot commented Feb 21, 2022

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.

@EliezerB123
Copy link

EliezerB123 commented Feb 23, 2022

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.

@DzmVasileusky
Copy link

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.

@Nikita1814
Copy link

This issue is still present

@DavidJournot
Copy link

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.

@ezzabuzaid
Copy link

We need this!

@ezzabuzaid
Copy link

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);
}

@yuanyuanlife
Copy link

yuanyuanlife commented Oct 19, 2023

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

@emondora
Copy link

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

@ParsaArvanehPA
Copy link

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;

@yuriy-bezrukov
Copy link

@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();

@mminor-dev
Copy link

@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();

This is the only thing I could get to work the way I needed.. however vscode does not like that syntax.
identifier expectedscss(css-identifierexpected) error on every variable being set 🤷‍♂️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area: cdk/overlay feature This issue represents a new feature or feature request rather than a bug or bug fix P4 A relatively minor issue that is not relevant to core functions
Projects
None yet
Development

No branches or pull requests