W3C home > Mailing lists > Public > public-fx@w3.org > April to June 2010

Re: Transitions of CSS images, including transitions of gradients.

From: Tab Atkins Jr. <jackalmage@gmail.com>
Date: Mon, 19 Apr 2010 11:30:59 -0700
Message-ID: <n2xdd0fbad1004191130h30fe148asabed34efc1619b44@mail.gmail.com>
To: Simon Fraser <smfr@me.com>
Cc: public-fx@w3.org
On Mon, Apr 19, 2010 at 10:56 AM, Simon Fraser <smfr@me.com> wrote:
> We should be able to interpolate linear-gradient() and radial-gradient()
> images by interpolating the colors and color-stops, given some rules
> about when the match closely enough to be interpolatable.

The most basic and simple rule, obviously, is that if the start and
end gradients have the same number of color-stops, then you simply
pair the stops up in order and interpolate their positions and colors
in the established manner.

At the moment I can't think of any more complex rule that would work
in general.  If an author wishes to, say, transition from a 2-stop to
a 3-stop gradient, they can currently hack it by manually upgrading
the 2-stop to a 3-stop, by adding an additional stop that matches
whatever the color would be at the point they want.  (That is, if they
are animating linear-gradient(white,black) to linear-gradient(yellow,
green, blue), they can just change the first one to instead be
linear-gradient(white, #808080, black).)

> We could arbitrarily return the source or destination image, based on
> whether the animation is less or more than 50% complete. However, I
> believe that we can get a lot of new, interesting functionality if we
> add a new functional notation for blending images. This would involve
> extending the definition of <image> to allow for image generation
> functions (of which we have one already, which is CSS gradients). Some
> suggested image generation functions are:
>  solid-color(r, g, b, a)
>  cross-fade(<image 1>, <image 2>, 0.4)     // 40% of the way through a cross-fade between image 1 and image 2
>  wipe-right(<image 1>, <image 2>, 0.2)     // 20% of the way through a wipe effect (image 2 moves in from the right)
>  push-top(<image 1>, <image 2>, 50%)       // 50% of the way through a push effect (image 2 pushes image 1 down from the top)
> You could also imagine filter effects:
>  sepia(<image>, 80%)
>  guassian-blur(<image>, 10px)
> These image generation functions could be used wherever an image is used
> in CSS, and could be returned by getComputedStlye() for images that are
> being animated. Note that CSS transitions would not allow you to
> describe the effect used for image transitions (e.g. wipe vs. cross-fade)
> without further extension, so you'd get back a cross-fade() for now.

I think this is a good idea.  Defining and returning a functional
notation for the cross-fade is the cleanest solution to the problem,
and allows other interesting and cool effects.

The idea of more general filter effects is very interesting, and
something that I want to pursue with SVG collaboration.  Exposing
canned filters in an image-generating function, frex, could be an
awesome thing.

> One issue to resolve is what is the intrinsic size of an image which is
> the result of blending two images of different size. Another is how do
> push and wipe-style transitions of tiled backgrounds appear, when the images
> are of different size.

Not sure about either of these right now.  The simple answer would be
"the larger of each dimension", but that would produce bad visual

Received on Monday, 19 April 2010 18:31:53 UTC

This archive was generated by hypermail 2.3.1 : Monday, 22 June 2015 03:33:44 UTC