W3C home > Mailing lists > Public > www-style@w3.org > May 2006

Re: [CSS3] transition effects

From: Jordan OSETE <jordan.osete@laposte.net>
Date: Tue, 09 May 2006 18:05:07 +0200
Message-ID: <4460BDB3.8030201@laposte.net>
To: Martijn <martijn.martijn@gmail.com>, www-style@w3.org

Martijn wrote :
> 
> On 5/8/06, Laurens Holst <lholst@students.cs.uu.nl> wrote:
> 
>> Example:
>>
>> a {
>>    background-color: yellow;
>>    animate-properties: background-color;
>>    animate-duration: 2s;
>>    animate-motion: logarithmic;
>> }
>> a:hover {
>>    background-color: orange;
>> }
>>
>> Thank you for your attention.
>>
> 
> I like the idea. Not sure whether the properties are all a good idea
> (especially I have a problem with animate-motion ), but I haven't
> really thought about it.
> I would also like to have a delay option, something like animate-delay: 2s;
> 
>> From your example, it is not clear when the animation should begin.

Transitions effects are indeed a good idea. But the proposed syntax is 
not really clear (sorry). I would propose something like:
   selector {
     transition-enter: sometransition;
     transition-leave: sometransition;
   }

Now when any element starts to validate the selector, the 
transition-enter transition is used. If later this element doesn't 
validate the selector anymore, the transition-leave is used. Let's take 
or usual css-driven menu example. Instead of:
   li>ul {
     display: none;}
   li:hover>ul{
     display: block;}
We would have:
   li>ul {
     display: none;}
   li:hover>ul{
     transition-enter: slide-in(top-to-bottom, 0.5s);
     display: block;
     transition-leave: slide-out(bottom-to-top, 0.5s);
   }

We could even put more than one transitions at once:
   li>ul{
     display: none;}
   li.opened>ul{
     transition-enter: slide-in(center-to-sides, 0.5s),
       animate(opacity, from(0) to (1), 0.3s);
     transition-leave: slide-out(sides-to-center, 0.5s),
       animate(opacity, from(1) to (0), from(0.2s) to(0.5s));
     display: block;
   }

Obviously, the syntax of the core transition is messy here, but you get 
the important point: the transition-leave and transition-enter. They 
trigger something when the element matches the selector for the first 
time, or stops matching the selector.

Note that the effect for the last example i gave was that, when an li's 
class change to something that contains "opened", it will:
  1-a) set display to block
  1-b) put the object in the state needed for the transition-enter 
animation. That means it will start fully transparent, and the visible 
area of the item will be a rectangle of 0*0px positionned in its 
(computed) center. Note that since it will be done _exactly_ at the same 
time as 1-a, the intended effect will happen, and the element will not 
be displayed even for a blink.
  2) then the transition-enter animation starts and complete. In this 
case, it will make the item's coputed opacity move from 0 to 1 in 0.3 
seconds, and make the visible area of the item will be a growing 
rectangle, from 0*0 at 0s, to 100%*100% at 0.5s (percentage of the 
item's computed width and heigth, respectively).
  3) then, since the transition has ended, the style will continue to apply.

When the class "opened" is deleted from the class attribute of the li, 
it basically goes the reverse way: the visible area of the item 
gradually reduces from a rectangle of 100%*100% to a rectangle of 0*0 in 
its center (in 0.5s), and in the meantime opacity goes from 1 to 0 in 
the last 0.3 seconds of the animation.

I still see some limitations to that:
  -it implies defining a whole new syntax for transitions. Implementing 
it would not be an easy task either.
  -it somehow duplicates some of the smil animation syntax, i believe, 
in a messy way. It would be better if we could specify those animations 
in a smil-compatible way.
  -Then, again, you won't ever be able to create a syntax for every 
effect that people designing websites will want. That is simply not 
possible. So people will still need scripts. Actually, script is needed 
for animation, except the most common cases (like in the example above). 
I know i will be scolded at, but I'm still sticking to scripts. I think 
there should be, at least, a way to specify original transitions in 
script, so that if the proposed transitions are not enough, webdesigners 
can create their own. The syntax I am thinking about right now is just 
some extension of the onevent: syntax i was talking about in the other 
topic: putting some script as the value of the transition-... properties.

The main problem with that is that it (besides putting script in CSS, 
wich is evil) creates a risk of infinite loops:
   .myclass {
     transition-enter: "this.className='';";	//leaves immediately
     transition-leave: "this.className='myclass';";	//re-enters immediately
   }
Now it makes a deadloop if any item ever happens to have 'myclass' in 
its classname. This is the main drawback of scripts as transitions in 
CSS. Besides their power, scripts allow deadloops. Then, it's not worse 
than any deadloop that can occur in a normal script, and if CSS and 
scripts are put together in a separate thread (wich should already be 
the case for scripts anyway, since scripts can create deadloops), the 
worse will be avoided.

Jordan Osete
Received on Tuesday, 9 May 2006 16:05:20 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 27 April 2009 13:54:45 GMT