W3C home > Mailing lists > Public > www-style@w3.org > January 2010

Re: CSS3 transition strangeness when using background-color:transparent;

From: Boris Zbarsky <bzbarsky@MIT.EDU>
Date: Fri, 29 Jan 2010 09:25:00 -0500
Message-ID: <4B62EFBC.2070002@mit.edu>
To: w3-style@boblet.net
CC: www-style <www-style@w3.org>
On 1/29/10 3:38 AM, Oli Studholme wrote:
> Here’s a demo page:
> http://oli-studio.com/bugs/browser/transition-transparent.html
>
> I can’t see anything in CSS3 Transitions that addresses transparency
> specifically, just this note under “6. Animation of property types”:
>
> “color: interpolated via red, green, blue and alpha components
> (treating each as a number, see below)”
>
> Is this by design?

The reason you're seeing a different behavior in Gecko (the expected 
matching the observed) is due to this code comment and corresponding code:

624       // FIXME (spec): The CSS transitions spec doesn't say whether
625       // colors are premultiplied, but things work better when they are,
626       // so use premultiplication.  Spec issue is still open per
627       // http://lists.w3.org/Archives/Public/www-style/2009Jul/0050.html

In particular, the first observed behavior example is interpolating 
between rgba(255,255,255,1) and rgba(0,0,0,0).  If you do this on 
non-premultipled colors, then your background color as a function of t 
going from 0 to 1 is:

   rgba(255(1-t), 255(1-t), 255(1-t), (1-t))

Since you are then blending with your rgba(221,221,221,1) background of 
the page, the overall background color ends up as 255(1-t)^2 + 221t in 
each of the non-opacity components (with opacity 1).  This is minimized 
when t = 289/510, at which point the color component value is about 173. 
  Your text color is 170 in each color component, which gives you the 
observed behavior of background pretty much matching text at some point.

If the interpolation is done with premultiplied alpha colors (which I 
will denote as rgbap()), then you're interpolating, in premultiplied 
space, between rgbap(255,255,255,1) and rgbap(0,0,0,0).  Your background 
as a function of t is:

   rgbap(255(t-1), 255(1-5), 255(1-t), 1-t)

which happens to be the same as rgba(255, 255, 255, 1-t).  Blending with 
your page background, that gives 255(1-t) + 221t in each color 
component, with alpha 1, which is exactly a linear fade from white to 
the page background.

-Boris
Received on Friday, 29 January 2010 14:25:36 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:20:23 GMT