- From: Andrew Fedoniouk <news@terrainformatica.com>
- Date: Fri, 06 Feb 2009 11:39:34 -0800
- To: "www-style@w3.org List" <www-style@w3.org>
As we know[1] rendering of static children of elements happens in
following order:
for all static children:
step #1: draw backgrounds of these elements;
step #2: draw content of these elements (text in particular);
This algorithm (strange, imo) works in most cases but plays
badly with negative margins.
Here is an example of very strange (non-intuitive if you wish) effect
that can
be observed when negative margins are used:
<html>
<head>
<style>
div.red { width:100px; height:100px;
background-color:red; margin-bottom:-100px; }
div.green { width:90px; height:90px;
background-color:green; }
div.red:hover { background-color:orange; }
div.green:hover { background-color:lime; }
</style>
</head>
<body>
<div class="red">This text has red background.</div>
<div class="green"></div>
</body>
</html>
Problem here is that due to [1] these two elements have non-trivial
overlaying structure.
Each point inside div.green participate in following layers:
1) background of div.red
2) background of div.green
3) content(text) of div.red
4) content(text) of div.green
This clearly produces logical errors in detection of div.red:hover and
div.green:hover
conditions. Try to move mouse over and near the text.
That appears as a bug of the specification. Non-intuitive, non-logical,
etc.
Possible resolutions of the problem:
A) To change [1] so drawing of the element background and its content is
atomic:
For each static child draw its background and content(text) on top
of it.
(That is how it is made in all UI systems I know)
If this change is not desirable at this point then plan "B":
B) Treat all elements having negative margins as a separate layer laying
over
normal static children of the element thus rendering will happen
this way:
step #1, for all static children *without* negative margins do:
step #1.1: draw backgrounds of elements;
step #1.2: draw content of elements (text in particular);
step #2, for all static children *with* negative margins do:
step #2.1: draw backgrounds of elements;
step #2.2: draw content of elements (text in particular);
Mouse hover detection algorithms have to be updated accordingly. In both
cases.
[1] http://www.w3.org/TR/CSS21/zindex.html
--
Andrew Fedoniouk.
http://terrainformatica.com
Received on Friday, 6 February 2009 19:40:21 UTC