1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 16:07:47 +00:00

LibWeb: Resolve grid item vertical margin/padding against CB width

Percentage vertical margin and padding values are relative to the
containing block *width*, not *height*. This has to be one of the most
commonly recurring mistakes we make :^)
This commit is contained in:
Andreas Kling 2024-01-06 18:35:31 +01:00 committed by Alexander Kalenik
parent a84778f6ee
commit cc88a2657d
3 changed files with 37 additions and 8 deletions

View file

@ -0,0 +1,13 @@
Viewport <#document> at (0,0) content-size 800x600 children: not-inline
BlockContainer <html> at (0,0) content-size 800x466 [BFC] children: not-inline
Box <body> at (8,8) content-size 500x450 [GFC] children: not-inline
BlockContainer <div.a> at (8,183) content-size 500x0 [BFC] children: not-inline
BlockContainer <div.b> at (8,183) content-size 500x0 [BFC] children: not-inline
BlockContainer <(anonymous)> (not painted) [BFC] children: inline
TextNode <#text>
ViewportPaintable (Viewport<#document>) [0,0 800x600]
PaintableWithLines (BlockContainer<HTML>) [0,0 800x466]
PaintableBox (Box<BODY>) [8,8 500x450]
PaintableWithLines (BlockContainer<DIV>.a) [8,58 500x125]
PaintableWithLines (BlockContainer<DIV>.b) [8,183 500x175]

View file

@ -0,0 +1,19 @@
<!doctype html><style>
* {
outline: 1px solid black;
}
body {
display: grid;
width: 500px;
}
div.a {
padding-top: 25%;
margin-top: 10%;
background: pink;
}
div.b {
padding-bottom: 35%;
margin-bottom: 20%;
background: orange;
}
</style><body><div class="a"></div><div class="b"></div>

View file

@ -1823,9 +1823,8 @@ void GridFormattingContext::resolve_items_box_metrics(GridDimension const dimens
auto& box_state = m_state.get_mutable(item.box);
auto& computed_values = item.box->computed_values();
CSSPixels containing_block_width = containing_block_size_for_item(item, GridDimension::Column);
if (dimension == GridDimension::Column) {
CSSPixels containing_block_width = containing_block_size_for_item(item, GridDimension::Column);
box_state.padding_right = computed_values.padding().right().to_px(grid_container(), containing_block_width);
box_state.padding_left = computed_values.padding().left().to_px(grid_container(), containing_block_width);
@ -1835,13 +1834,11 @@ void GridFormattingContext::resolve_items_box_metrics(GridDimension const dimens
box_state.border_right = computed_values.border_right().width;
box_state.border_left = computed_values.border_left().width;
} else {
CSSPixels containing_block_height = containing_block_size_for_item(item, GridDimension::Row);
box_state.padding_top = computed_values.padding().top().to_px(grid_container(), containing_block_width);
box_state.padding_bottom = computed_values.padding().bottom().to_px(grid_container(), containing_block_width);
box_state.padding_top = computed_values.padding().top().to_px(grid_container(), containing_block_height);
box_state.padding_bottom = computed_values.padding().bottom().to_px(grid_container(), containing_block_height);
box_state.margin_top = computed_values.margin().top().to_px(grid_container(), containing_block_height);
box_state.margin_bottom = computed_values.margin().bottom().to_px(grid_container(), containing_block_height);
box_state.margin_top = computed_values.margin().top().to_px(grid_container(), containing_block_width);
box_state.margin_bottom = computed_values.margin().bottom().to_px(grid_container(), containing_block_width);
box_state.border_top = computed_values.border_top().width;
box_state.border_bottom = computed_values.border_bottom().width;