-
Notifications
You must be signed in to change notification settings - Fork 6.8k
Open
Labels
P2The issue is important to a large percentage of users, with a workaroundThe issue is important to a large percentage of users, with a workaroundarea: material/sidenavregressionThis issue is related to a regressionThis issue is related to a regression
Description
Is this a regression?
- Yes, this behavior used to work in the previous version
The previous version in which this bug was not present was
v16
Description
Auto-resizing has been broken since Angular Material v17 due to the container-width styling.
MatDrawerContainer#updateContentMargins() checks the width of MatDrawer.
components/src/material/sidenav/drawer.ts
Lines 897 to 941 in 11f9228
| updateContentMargins() { | |
| // 1. For drawers in `over` mode, they don't affect the content. | |
| // 2. For drawers in `side` mode they should shrink the content. We do this by adding to the | |
| // left margin (for left drawer) or right margin (for right the drawer). | |
| // 3. For drawers in `push` mode the should shift the content without resizing it. We do this by | |
| // adding to the left or right margin and simultaneously subtracting the same amount of | |
| // margin from the other side. | |
| let left = 0; | |
| let right = 0; | |
| if (this._left && this._left.opened) { | |
| if (this._left.mode == 'side') { | |
| left += this._left._getWidth(); | |
| } else if (this._left.mode == 'push') { | |
| const width = this._left._getWidth(); | |
| left += width; | |
| right -= width; | |
| } | |
| } | |
| if (this._right && this._right.opened) { | |
| if (this._right.mode == 'side') { | |
| right += this._right._getWidth(); | |
| } else if (this._right.mode == 'push') { | |
| const width = this._right._getWidth(); | |
| right += width; | |
| left -= width; | |
| } | |
| } | |
| // If either `right` or `left` is zero, don't set a style to the element. This | |
| // allows users to specify a custom size via CSS class in SSR scenarios where the | |
| // measured widths will always be zero. Note that we reset to `null` here, rather | |
| // than below, in order to ensure that the types in the `if` below are consistent. | |
| left = left || null!; | |
| right = right || null!; | |
| if (left !== this._contentMargins.left || right !== this._contentMargins.right) { | |
| this._contentMargins = {left, right}; | |
| // Pull back into the NgZone since in some cases we could be outside. We need to be careful | |
| // to do it only when something changed, otherwise we can end up hitting the zone too often. | |
| this._ngZone.run(() => this._contentMarginChanges.next(this._contentMargins)); | |
| } | |
| } |
However, the MatDrawer's width is fixed due to
container-width styling.As a result, the content margins always end up being the same value.
I guess adding width:auto to the host style of MatDrawer when autosize is specified could restore the behavior.
For example:
'[style.width]': '(!_container && _container.autosize) ? "auto" : null', on
components/src/material/sidenav/drawer.ts
Lines 157 to 172 in 11f9228
| host: { | |
| 'class': 'mat-drawer', | |
| // must prevent the browser from aligning text based on value | |
| '[attr.align]': 'null', | |
| '[class.mat-drawer-end]': 'position === "end"', | |
| '[class.mat-drawer-over]': 'mode === "over"', | |
| '[class.mat-drawer-push]': 'mode === "push"', | |
| '[class.mat-drawer-side]': 'mode === "side"', | |
| // The styles that render the sidenav off-screen come from the drawer container. Prior to #30235 | |
| // this was also done by the animations module which some internal tests seem to depend on. | |
| // Simulate it by toggling the `hidden` attribute instead. | |
| '[style.visibility]': '(!_container && !opened) ? "hidden" : null', | |
| // The sidenav container should not be focused on when used in side mode. See b/286459024 for | |
| // reference. Updates tabIndex of drawer/container to default to null if in side mode. | |
| '[attr.tabIndex]': '(mode !== "side") ? "-1" : null', | |
| }, |
Reproduction
Reproduced the Angular Material docs example:
It still works on v16:
Expected Behavior
Auto-resizing should work.
Actual Behavior
Auto-resizing is not work.
Environment
- Angular: v17~v20
- CDK/Material: v17~v20
- Browser(s): Chrome 138.0.7204.169
- Operating System (e.g. Windows, macOS, Ubuntu): Windows
lacolaco
Metadata
Metadata
Assignees
Labels
P2The issue is important to a large percentage of users, with a workaroundThe issue is important to a large percentage of users, with a workaroundarea: material/sidenavregressionThis issue is related to a regressionThis issue is related to a regression