- From: Tab Atkins Jr. via GitHub <noreply@w3.org>
- Date: Fri, 25 Jul 2025 22:08:13 +0000
- To: public-css-archive@w3.org
@una pointed out in private chat that this defaults issue extends to dialogs in general, not just popovers; I'd missed that, despite looking at the styles for dialogs in general at the same time.
It stems from the same basic issue: it's using margins to center in the inline axis, which mispositions it when you use anchor positioning. See [this basic example](https://software.hixie.ch/utilities/js/live-dom-viewer/saved/13948):
```html
<!DOCTYPE html>
<dialog open id=foo>foo</dialog>
<p id=bar>bar</p>
<style>
body { background: linear-gradient(to right, white 49.5%, black 0 50.5%, white 0);
#bar { width: 100px; height: 50px; border: thick dotted; anchor-name: --bar;}
#foo { position-anchor: --bar; position-area: bottom right; background: lime; /margin: 0;}
</style>
```
The big black bar indicates the center of the page - the dialog is centered in the bottom-right position-area cell, which puts it far away from its anchor and looking oddly off-center as well. It also ends up positioned identically if you instead open it as a modal, and scrolls with its anchor (because that's how anchored fixpos is supposed to work!)
Luckily, the modal dialog behavior is essentially identical to the popover behavior - fixpos, centered in the screen. The non-modal dialog is a bit different - abspos, centered inline, auto-positioned block. This works out nicely! We can just add another behavior for `dialog` when it's abspos rather than fixpos, so it *does not* resolve the block insets to 0 and sticks with `normal` alignment in the block axis; by default, then it'll use the static position, as specified today. That would let us simplify the stylesheets further:
```css
dialog {
position: absolute;
place-self: dialog; /* new */
/* deleted
X inset-inline-start: 0; inset-inline-end: 0;
X width: fit-content;
X height: fit-content;
X margin: auto;
/*
border: solid;
padding: 1em;
background-color: Canvas;
color: CanvasText;
}
dialog:modal {
position: fixed;
overflow: auto;
/* deleted
X inset-block: 0;
*/
max-width: calc(100% - 6px - 2em);
max-height: calc(100% - 6px - 2em);
}
/* ...irrelevant stuff that stays as-is... */
[popover] {
position: fixed;
place-self: dialog; /* new */
/* deleted
X inset: 0;
X width: fit-content;
X height: fit-content;
X margin: auto;
*/
border: solid;
padding: 0.25em;
overflow: auto;
color: CanvasText;
background-color: Canvas;
}
```
leaving us with just:
```css
dialog {
position: absolute;
place-self: dialog;
border: solid;
padding: 1em;
background-color: Canvas;
color: CanvasText;
}
dialog:modal {
position: fixed;
overflow: auto;
max-width: calc(100% - 6px - 2em);
max-height: calc(100% - 6px - 2em);
}
/* ...irrelevant stuff that stays as-is... */
[popover] {
position: fixed;
place-self: dialog;
border: solid;
padding: 0.25em;
overflow: auto;
color: CanvasText;
background-color: Canvas;
}
```
And now, using `position-area` on a dialog will Just Work (once you also set `position-anchor`, since it doesn't get an implicit anchor)
--
GitHub Notification of comment by tabatkins
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/10258#issuecomment-3120522262 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Friday, 25 July 2025 22:08:14 UTC