mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 15:40:19 +00:00
LibWeb: Align to padding edge only auto positioned abspos grid items
Containing block for abspos grid items depends on their grid placement: - if element has definite grid position, then corresponding grid area should be used as a containing block - if element does not have definite grid position, then padding edge of grid container should be used as a containing block So offset should be adjusted for paddings only for boxes without definite grid position.
This commit is contained in:
parent
32299e74cb
commit
19afc5b11b
Notes:
github-actions[bot]
2024-09-21 18:11:49 +00:00
Author: https://github.com/kalenikaliaksandr Commit: https://github.com/LadybirdBrowser/ladybird/commit/19afc5b11be Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/1475
3 changed files with 61 additions and 3 deletions
|
@ -0,0 +1,21 @@
|
||||||
|
Viewport <#document> at (0,0) content-size 800x600 children: not-inline
|
||||||
|
BlockContainer <html> at (1,1) content-size 798x220 [BFC] children: not-inline
|
||||||
|
BlockContainer <body> at (10,10) content-size 780x202 children: not-inline
|
||||||
|
Box <div.grid> at (11,111) content-size 200x100 positioned [GFC] children: not-inline
|
||||||
|
BlockContainer <div.abspos-item-with-grid-area> at (12,112) content-size 50x50 positioned [BFC] children: inline
|
||||||
|
frag 0 from TextNode start: 0, length: 1, rect: [12,112 14.265625x17] baseline: 13.296875
|
||||||
|
"A"
|
||||||
|
TextNode <#text>
|
||||||
|
BlockContainer <div.abspos-item-with-auto-placement> at (12,12) content-size 50x50 positioned [BFC] children: inline
|
||||||
|
frag 0 from TextNode start: 0, length: 1, rect: [12,12 9.34375x17] baseline: 13.296875
|
||||||
|
"B"
|
||||||
|
TextNode <#text>
|
||||||
|
|
||||||
|
ViewportPaintable (Viewport<#document>) [0,0 800x600]
|
||||||
|
PaintableWithLines (BlockContainer<HTML>) [0,0 800x222]
|
||||||
|
PaintableWithLines (BlockContainer<BODY>) [9,9 782x204]
|
||||||
|
PaintableBox (Box<DIV>.grid) [10,10 202x202]
|
||||||
|
PaintableWithLines (BlockContainer<DIV>.abspos-item-with-grid-area) [11,111 52x52]
|
||||||
|
TextPaintable (TextNode<#text>)
|
||||||
|
PaintableWithLines (BlockContainer<DIV>.abspos-item-with-auto-placement) [11,11 52x52]
|
||||||
|
TextPaintable (TextNode<#text>)
|
32
Tests/LibWeb/Layout/input/grid/abspos-item-with-padding.html
Normal file
32
Tests/LibWeb/Layout/input/grid/abspos-item-with-padding.html
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<!DOCTYPE html><style>
|
||||||
|
* {
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 100px 100px;
|
||||||
|
grid-template-areas: "a b";
|
||||||
|
position: relative;
|
||||||
|
width: 200px;
|
||||||
|
height: 100px;
|
||||||
|
padding-top: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.abspos-item-with-grid-area {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
grid-area: a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.abspos-item-with-auto-placement {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
}
|
||||||
|
</style><div class="grid"><div class="abspos-item-with-grid-area">A</div><div class="abspos-item-with-auto-placement">B</div></div>
|
|
@ -1899,10 +1899,11 @@ void GridFormattingContext::run(AvailableSpace const& available_space)
|
||||||
|
|
||||||
void GridFormattingContext::layout_absolutely_positioned_element(Box const& box)
|
void GridFormattingContext::layout_absolutely_positioned_element(Box const& box)
|
||||||
{
|
{
|
||||||
auto& containing_block_state = m_state.get_mutable(*box.containing_block());
|
|
||||||
auto& box_state = m_state.get_mutable(box);
|
auto& box_state = m_state.get_mutable(box);
|
||||||
auto const& computed_values = box.computed_values();
|
auto const& computed_values = box.computed_values();
|
||||||
|
|
||||||
|
auto is_auto_positioned = is_auto_positioned_track(computed_values.grid_row_start(), computed_values.grid_row_end()) || is_auto_positioned_track(computed_values.grid_column_start(), computed_values.grid_column_end());
|
||||||
|
|
||||||
auto row_placement_position = resolve_grid_position(box, GridDimension::Row);
|
auto row_placement_position = resolve_grid_position(box, GridDimension::Row);
|
||||||
auto column_placement_position = resolve_grid_position(box, GridDimension::Column);
|
auto column_placement_position = resolve_grid_position(box, GridDimension::Column);
|
||||||
|
|
||||||
|
@ -2000,8 +2001,12 @@ void GridFormattingContext::layout_absolutely_positioned_element(Box const& box)
|
||||||
used_offset.set_x(grid_area_rect.x() + box_state.inset_left + box_state.margin_box_left());
|
used_offset.set_x(grid_area_rect.x() + box_state.inset_left + box_state.margin_box_left());
|
||||||
used_offset.set_y(grid_area_rect.y() + box_state.inset_top + box_state.margin_box_top());
|
used_offset.set_y(grid_area_rect.y() + box_state.inset_top + box_state.margin_box_top());
|
||||||
|
|
||||||
// NOTE: Absolutely positioned boxes are relative to the *padding edge* of the containing block.
|
// NOTE: Absolutely positioned boxes with auto-placement are relative to the *padding edge* of the containing block.
|
||||||
used_offset.translate_by(-containing_block_state.padding_left, -containing_block_state.padding_top);
|
if (is_auto_positioned) {
|
||||||
|
auto const& containing_block_state = m_state.get_mutable(*box.containing_block());
|
||||||
|
used_offset.translate_by(-containing_block_state.padding_left, -containing_block_state.padding_top);
|
||||||
|
}
|
||||||
|
|
||||||
box_state.set_content_offset(used_offset);
|
box_state.set_content_offset(used_offset);
|
||||||
|
|
||||||
if (independent_formatting_context)
|
if (independent_formatting_context)
|
||||||
|
|
Loading…
Reference in a new issue