diff --git a/Base/home/anon/www/margin-collapse-2.html b/Base/home/anon/www/margin-collapse-2.html
new file mode 100644
index 0000000000..f1d92ded30
--- /dev/null
+++ b/Base/home/anon/www/margin-collapse-2.html
@@ -0,0 +1,23 @@
+
+
foo
+bar
+baz
diff --git a/Base/home/anon/www/welcome.html b/Base/home/anon/www/welcome.html
index ed0c2e14b1..42e2e6865f 100644
--- a/Base/home/anon/www/welcome.html
+++ b/Base/home/anon/www/welcome.html
@@ -28,6 +28,7 @@ span#ua {
Your user agent is:
Some small test pages:
+ - margin collapsing 2
- margin collapsing 1
- position: absolute, offset from edges
- iframe
diff --git a/Libraries/LibWeb/Layout/LayoutBlock.cpp b/Libraries/LibWeb/Layout/LayoutBlock.cpp
index 114a4df77d..abcd63da9e 100644
--- a/Libraries/LibWeb/Layout/LayoutBlock.cpp
+++ b/Libraries/LibWeb/Layout/LayoutBlock.cpp
@@ -481,7 +481,14 @@ void LayoutBlock::compute_position()
// Collapse top margin with bottom margin of previous sibling if necessary
float previous_sibling_margin_bottom = previous_sibling_style.margin().bottom.to_px(*relevant_sibling);
float my_margin_top = box_model().margin().top.to_px(*this);
- if (previous_sibling_margin_bottom > my_margin_top) {
+
+ if (my_margin_top < 0 || previous_sibling_margin_bottom < 0) {
+ // Negative margins present.
+ float largest_negative_margin = -min(my_margin_top, previous_sibling_margin_bottom);
+ float largest_positive_margin = (my_margin_top < 0 && previous_sibling_margin_bottom < 0) ? 0 : max(my_margin_top, previous_sibling_margin_bottom);
+ float final_margin = largest_positive_margin - largest_negative_margin;
+ position_y += final_margin - my_margin_top;
+ } else if (previous_sibling_margin_bottom > my_margin_top) {
// Sibling's margin is larger than mine, adjust so we use sibling's.
position_y += previous_sibling_margin_bottom - my_margin_top;
}