RE: Negative margins
You're misreading the specification. The space at a junction is
the sum of the largest of all positive values and the largest (largest
absolute value, that is) negative value. This has the effect of being
like your examples 1.2 and 2.2.
I fought very hard for this behaviour during the final cleanup of the
specification, for precisely the reasons you stated.
> -----Original Message-----
> From: Sho Kuwamoto [SMTP:firstname.lastname@example.org]
> Sent: Monday, July 21, 1997 2:46 PM
> To: email@example.com
> Subject: Negative margins
> I'm having trouble figuring out how negative margins
> on block-level elements should work. According to
> section 4.1 of the spec, the top and bottom margins
> between two block-level elements should work as follows:
> XX element A XX
> the space here is the max of
> <-- the bottom margin of A and the
> top margin of B.
> XX element B XX
> This is fine for positive values, but it gets hard to know
> what to do for negative values. Let's say that the bottom
> margin of A is 50px, and that the top margin of B is -10px.
> Here are some possibilities:
> 1.1) Follow the spec literally.
> 50px > -10px, thus the space between is 50px.
> 1.2) Add the two.
> 50px-10px = 40px, so the space between is 40px.
> Solution (1.2) is attractive because it seems to capture the
> web author's intentions. By specifying a space-before of
> -10px, he or she is probably saying "I want 10 pixels less
> space than I would otherwise get." Now, consider the
> situation when both are negative. Say the space after A is
> -10px, and that the space before B is -20.
> 2.1) Follow the spec literally.
> -10px > -20px, thus the space between is -10px.
> 2.2) Instead of using max(a,b), -max(-a,-b).
> 20px > 10px, thus the space between is -20px.
> 2.3) Add the two.
> (-10px) + (-20px) = -30px, thus the space between is -30px.
> Of these, I like (2.2) the best. It goes along with the spirit
> of using max(a,b) for positive values.
> So, combining (1.2) and (2.2), the algorithm to compute the
> space between block-level elements would be:
> if (a >= 0 && b>= 0)
> space = max(a,b);
> else if ( (a >= 0 && b < 0) || (a < 0 && b >= 0) )
> space = a+b;
> else // a < 0 && b < 0
> space = -max(-a,-b);
> Any thoughts?