Closed Bug 237770 Opened 21 years ago Closed 17 years ago

Mozilla fails to ignore 'float' property even though 'position: absolute' is set

Categories

(Core :: Layout: Positioned, defect)

x86
Windows 2000
defect
Not set
minor

Tracking

()

RESOLVED FIXED

People

(Reporter: mikko.rantalainen, Assigned: sharparrow1)

References

Details

(Keywords: helpwanted, testcase)

Attachments

(5 files, 1 obsolete file)

User-Agent:       Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6b) Gecko/20031208
Build Identifier: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6b) Gecko/20031208

See the attached test case. Mozilla fails to comply with the CSS 2.1 spec and
render the absolutely positioned element in correct location if the 'float'
property is set. This is despite the fact that
http://www.w3.org/TR/2004/CR-CSS21-20040225/visuren.html#dis-pos-flo clearly
says that "[...] if 'position' has the value 'absolute' or 'fixed', the box is
absolutely positioned, the computed value of 'float' is 'none' [...]".

Reproducible: Always
Steps to Reproduce:
1. Open the attached test case in Mozilla or FireFox

Actual Results:  
Notice how the seconds read underscore drops below the second paragraph. If the
'float' property is explicitly set to 'none', the absolutely positioned
underscore ends up where I'm expecting (the first paragraph). However, the
latter paragraph has underscore rendered to left edge of the viewport and one
line below the expected location.


Expected Results:  
Both paragraphs should look the same, including the position of red underscore.

The results are similar with
Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040210 Firefox/0.8

A workaround is to add rule "float: none" in addition to "position: absolute" in
case the 'float' property might have different value otherwise.

The same bug affects "position: fixed" in the same way.
But you have left:auto and top:auto, which means the actual position of the
positioned box must be the same as it would have been if 'position' had been
'static', in which case 'float' does affect the results.
> But you have left:auto and top:auto, which means the actual position of the
> positioned box must be the same as it would have been if 'position' had been
> 'static', in which case 'float' does affect the results.

Is it defined somewhere if computed value of 'float' should be first set to
'none' and the position of the element should be computed after that, or the
other way around?

In addition, the element should be *right* aligned if the 'float' property does
apply first.
The CSS recommandations mention that left/right and top/bottom need to be
specified. Doing this solves the problem: Mozilla correctly ignores float:
right.

This bug is then INVALID!

(Tested using Mozilla 1.6 final on Linux)
Agreed that it's perhaps invalid, but not because anything *has* to be
specified.  Rather, see
http://www.w3.org/TR/2004/CR-CSS21-20040225/visudet.html#static-position and
http://www.w3.org/TR/2004/CR-CSS21-20040225/visudet.html#abs-non-replaced-height

The CSS spec itself isn't clear, but we do weird things that technically can't
be explained within the CSS processing model for compatibility with IE.
Status: UNCONFIRMED → RESOLVED
Closed: 21 years ago
Resolution: --- → INVALID
> The CSS recommandations mention that left/right and top/bottom need to be
> specified. Doing this solves the problem: Mozilla correctly ignores float:
> right.

top, right, left and bottom default to 'auto'. I wouldn't call that unspecified
and I cannot see why 'auto' isn't just as good value for those as any absolute
or relative length. The location of absolutely positioned block should be where
the flow puts it, if all the values above are 'auto'. Either the "position:
absolute" modifies the "float: right" to "float: none" before laying out the
boxes and the 'float' property gets ignored, *or* the element is floated to
*right* and then *that* location is used because all of top, right, left and
bottom are auto.

Regardless of which way you think is the correct interpretation of the spec, the
floated/positioned element shouldn't be put on the left edge of the containing
box (speaking about test case 1 with "float: right"). It seems to me that MSIE
already works to my interpretation of the spec (at least with a this simple test
case).
Oops, I didn't mean to mark invalid.
Status: RESOLVED → UNCONFIRMED
Resolution: INVALID → ---
So the basic problem is that the "float" forces the display to "block", even if
"position" is set to absolute...  Mikko, what exactly is IE's behavior on this
testcase?  Opera's behavior is to not apply the display fixup in this case,
looks like (Opera 7.23 Linux).  Konqueror (only 3.03, unfortunately) renders
both underscores like Mozilla does the second one, which is clearly wrong (it's
not keeping track of the original display type at all).
> what exactly is IE's behavior on this testcase?

MSIE 6.0.2600.0000 (with "Update Versions: Q316059, q319182, Q323759, Q328970,
Q324929, Q330994") on Windows 2000 renders the first test case (after saving it
to harddrive to workaround the missing support for the application/xhtml+xml
content type) for both paragraphs like the "float: none" were specified. I guess
the MSIE applies the "position: absolute" -> "float: none" logic before
computing the flow position for the element. MSIE doesn't support "position:
fixed" which should work in a similar way.

Opera 6.0/win32 renders both paragraphs of the first test case like Mozilla does
the second (which is incorrect behavior). Opera 7.0/win32 build 2349 has
interesting behavior: it renders both underscores in correct horizontal position
but one line below the correct position (the same "top", relative to paragraph,
as Mozilla's second paragraph's rendering for both underscores and the same
"left" for both underscores as the Mozilla has for the first underscore).

The second test case seems to work with all the browsers, so the problem is with
the value 'auto' for 'top', 'left', 'right' and 'bottom'. According to the spec
the element is supposed to use "static position" with shrink-to-fit in that
case. The question is whether the 'float' property is set to 'none' before or
after computing the "static position". MSIE seems to set it to 'none' first.
I think David Baron found something interesting in chap. 10.3.7 and 10.6.4:

If all three of 'left', 'width', and 'right' are 'auto' [which is the case in
the first test case]: First set any 'auto' values for 'margin-left' and
'margin-right' to 0. Then, if 'direction' is 'ltr' set 'left' to the static
position and apply rule number three below.

And rule #3 is:

3. 'width' and 'right' are 'auto' and 'left' is not 'auto', then the width is
shrink-to-fit . Then solve for 'right'.


The same description applies for the top/height/bottom attributes. In other
words: Mikko would be right! ;-)

-------  BUT --------

I discovered something more annoying:

Replace #y {float: right} in the first test case by #y {float: none}. What do
you see??? Something very bad, isn't it? No matter what float is, Mozilla is
working wrong with it!

I will put a 3rd test case with the new valur for float.
Mozilla behaves incorrectly when float is declared twice!!
There is definitively some problem here:

If you write #y {float: none} as in case test #3, the test fails.
But if you write either #x {float: none} or #x, #y {float: none} instead of the
previous command, everything is running fine!

Has someone an explanation?
That's a totally separate bug.  I've filed bug 237891 on it.
Does this bug depends on bug #237891 ?
Attached file 4th testcase
Although, amusingly enough, it seems that fixing bug 237891 may "fix" this bug.
 I'll attach an updated testcase for this bug that won't get fixed by fixing
that one, hopefully.
Depends on: 237891
Boris, this is a duplicate of bug 168971?
Very possible.... Marking dependent for now, but they could well be dups.
Depends on: 168971
Keywords: testcase
1st and 4th test still don't work with Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a1) Gecko/20060404 Firefox/1.6a1 ID:2006040404. Konqueror 3.5.0 and Opera 9.0 both render test cases correctly.
Keywords: helpwanted
Attached patch Patch (obsolete) — Splinter Review
The issue here is that the mOriginalDisplay wasn't getting set to the correct value when both position and float were set.
Assignee: nobody → sharparrow1
Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true
Attachment #265645 - Flags: review?(dbaron)
Comment on attachment 265645 [details] [diff] [review]
Patch

What happened to the code for ::first-letter?

(bzbarsky should probably review as well.)
Attachment #265645 - Flags: review?(dbaron) → review-
(In reply to comment #20)
> (From update of attachment 265645 [details] [diff] [review])
> What happened to the code for ::first-letter?
> 
> (bzbarsky should probably review as well.)

From reading bug 103189, I was kind of under the impression it was fixed.  Am I wrong?
Attached patch Patch v2Splinter Review
Okay, then; this version should work.
Attachment #265645 - Attachment is obsolete: true
Attachment #265744 - Flags: superreview?(bzbarsky)
Attachment #265744 - Flags: review?(dbaron)
Comment on attachment 265744 [details] [diff] [review]
Patch v2

Looks good.
Attachment #265744 - Flags: superreview?(bzbarsky) → superreview+
Checked in.
Status: ASSIGNED → RESOLVED
Closed: 21 years ago17 years ago
Flags: in-testsuite?
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: