- From: Shane Stephens <shans@google.com>
- Date: Tue, 20 Aug 2013 07:14:43 +1000
- To: "Tab Atkins Jr." <jackalmage@gmail.com>
- Cc: Dirk Schulze <dschulze@adobe.com>, www-style list <www-style@w3.org>
- Message-ID: <CAGTfzwSdyEVU4geUDreKU2B0GTKsA8sczRqx=MJNkt=zJOViNA@mail.gmail.com>
> > Since CSS gradients support <length> and <percentage> values for color
> stops, interpolation between color stops gets more complicated. While there
> isn't necessarily a problem with interpolation between two <length> values
> or two <percentage> values, interpolation between <length> and <percentage>
> does require layout information to calculate the gradient length. Some
> implementations might not be able to provide the layout information
> (especially the gradient size) at the time of the interpolation. This seems
> at least to be the case for WebKit and Blink. The layout information are
> available on drawing the gradient. Until then, the values must be generic
> and independent of the gradient size.
>
> No it doesn't. Interpolating between <length> and
> <percentage-based-on-length> should be done with calc().
Note that this doesn't solve interpolation of gradient stops without
explicit positions, due to the order of Section 4.5 steps 2 and 3.
A concrete example:
linear-gradient(red 50%, green, blue 50px)
linear-gradient(red 40px, green 50px, blue 80px)
At 50% interpolation between these gradients:
* the red color stop is at calc(25% + 20px)
* the blue is at 60px.
By the spec, however, the green stop is halfway between the layout-specific
position it gets in the first gradient and 50px. In particular, this is
_not_ 50% between calc(25% + 25px) and 50px because Section 4.5 step 2
moves the blue stop around before resolving the position of the green stop
when 50% > 50px.
So a container that is 200px wide resolves the first gradient's stops to
red 100px, green 100px , blue 100px, and the second's to red 40px, green
50px, blue 80px. At 50% interpolation, we'd get stops at red 70px, green
75px, blue 90px. Note that 75px != 0.5x(25%x200 + 25) + 0.5x50 = 0.5x(75 +
50) = 62.5px.
Back in 2011 I proposed switching steps 2 and 3 of Section 4.5. I still
think this is probably the cleanest option.
Cheers,
-Shane
Received on Monday, 19 August 2013 21:15:11 UTC