Hey, thanks for your thoughts. I thought this issue over last night and have come up with the following solution:
Absolute Animations: "50px" "-50px" Relative Animations: "+=50px" "-=50px" I'm going to be pushing this live in an update this weekend, so that it's fixed quickly. (In the future, stuff like this should be brought up on the jquery-dev list.) --John On 9/12/07, Wizzud <[EMAIL PROTECTED]> wrote: > > > The code ... > > // If a +/- token was provided, we're doing a relative animation > if ( parts[1] ) > end = ((parts[1] == "-" ? -1 : 1) * end) + start; > > ... is based on the assumption that any value with a leading +/- indicator > is a relative animation. > Unfortunately this means that it can't (currently!) cope with absolute > animation in a negative range. For example, if you want to animate anything > from currentValue TO -y it will translate that into animate from > currentValue BY -y, simply because of the negative sign in front of y. > With positives, in mathematical terms x (unsigned) is equivalent to +x, so > purposefully inserting a plus sign could be interpreted as a relative > movement as opposed to a positive absolute. However, you can only get > relative changes to be recognised by sending a String, ie. {top:+234} will > be taken as absolute, whereas {top:'+234'} will be taken as relative. This > is because (at least in Firefox!) the number loses the plus sign as being > irrelevant, so conversion to String for pattern recognition of the leading > '+' will never have a leading '+'! > > This leaves 2 questions: > 1. How do you get around it until it's fixed? > 2. How do you fix it? > > (1) Work-around. There are 2 ways (I think). > Either: Try sending the change through as a String with a leading space, eg > instead of animate({marginTop:-2492}), try animate({marginTop:' -2492'}). > (This worked for me in a very simple test) > Or: Translate any absolute movement to a negative position into a relative > movement before calling animate, eg. get current marginTop yourself and work > out the relative change required > > (2) Fix. Hmmm. There are undoubtedly lots of possible solutions and I > hesitate to suggest one in favour of any other, but ... seeing as a String > has to be used to get the leading '+' sign recognised, why not make relative > changes be enforced by a double sign. > For example: > animate({top:234}) = absolute change to 234px > animate({top:'+234em'}) = absolute change to 234em > animate({top:-234}) = absolute change to -234px > animate({top:'-234%'}) = absolute change to -234% > animate({top:'++234'}) = relative change by 234px > animate({top:'+-234'}) = relative change by -234px > animate({top:'--234em'}) = relative change by -234em > animate({top:'-+234%'}) = relative change by +234% > > [ NB 'double-signing' numbers: > animate({top:++234}) = javascript error, invalid increment operand > animate({top:--234}) = javascript error, invalid decrement operand > animate({top:+-234}) = absolute change to -234px > animate({top:-+234}) = absolute change to -234px ] > > In the above examples, the direction of the first sign doesn't matter - it > could be a '+' or a '-', all it does is indicate that the change is > relative. For that matter, it could be something else, like an 'r' instead > of a +/-, eg animate({top:'r234'}) or animate({top:'r-234'}), but I'm not > sure whether that might not be more confusing. Allowing either a '+' or a > '-' could allow users to more easily apply the 'relative' directive > depending upon how they work out and construct their values. > > Anyway, to make this 'double-signing' work would require 2 changes (v1.2 > source): > At roughly line 2578... > // var parts = val.toString().match(/^([+-]?)([\d.]+)(.*)$/), > var parts = val.toString().match(/^([+-]*?)([\d.]+)(.*)$/), > And roughly 2592... > // If 'double-signed', we're doing a relative animation > if ( parts[1] ) > // end = ((parts[1] == "-" ? -1 : 1) * end) + start; > end = ((parts[1].substr(parts[1].length-1) == "-" ? -1 : 1) * > end) + > (parts[1].length>1 ? start : 0); > > As I stated at the start, this is only a suggestion and may turn out to be > non-viable in the bigger picture - but it does seem to work (bearing in mind > I'm only testing in Firefox!). > > > bmsterling wrote: > > > > Not sure if this is any more help, but looking at the core around line > > 2593, > > it looks like you check for a minus sign and then add that to the start > > position/style and your comments says: > > > > "// If a +/- token was provided, we're doing a relative animation" > > > > But yet you are not looking, explicitly, for a plus sign. > > > > Well, hope this helps in some way. > > > > On 9/11/07, Benjamin Sterling <[EMAIL PROTECTED]> wrote: > >> > >> Will do, I also just did some testing and it looks like it happens when a > >> minus sign is in play. I will post my findings to the bug report. > >> > >> On 9/11/07, John Resig <[EMAIL PROTECTED]> wrote: > >> > > >> > > >> > Sounds like a true bug. Could you submit a bug report? > >> > http://dev.jquery.com/ > >> > > >> > --John > >> > > >> > On 9/11/07, Benjamin Sterling <[EMAIL PROTECTED]> wrote: > >> > > Url in question: > >> > > http://benjaminsterling.com/experiments/jqGalViewV2/ > >> > > > >> > > At about line 87 and then again at line 91 I have the following: > >> > > > >> > > > >> > $holder.animate({marginTop:-($mainImgContainer.height()*index)},'1000', > >> > > opts.tnease); > >> > > > >> > > Depending on the link at bottom clicked, the marginTop gets set to > >> > what ever > >> > > $mainImgContainer.height()*index adds up to, but with a > >> > > minus infront. So if you click on eight you get -2492. And when you > >> > > clicked 7, you would get -2136. In 1.1.3 this worked fine[1]. But > >> > with 1.2 > >> > > it will just add up the marginTop, so -2492 and -2136 becomes -4628. > >> > > > >> > > In an earlier post, John[2] suggested that the animation method only > >> > took in > >> > > integers, so if I do: > >> > > > >> > > > >> > > >> $holder.animate({marginTop:parseInt(-($mainImgContainer.height()*index))},'1000', > >> > > >> > > opts.tnease); > >> > > > >> > > It should work, but sadly, still adds up. Is this a true bug, or am > >> I > >> > > missing something? > >> > > > >> > > [1] http://benjaminsterling.com/experiments/jqGalView > >> > > [2] > >> > > > >> http://groups.google.com/group/jquery-en/browse_thread/thread/705cd47864c22c49/485702b3f03547c5#485702b3f03547c5 > >> > > >> > > -- > >> > > Benjamin Sterling > >> > > http://www.KenzoMedia.com > >> > > http://www.KenzoHosting.com > >> > > >> > >> > >> > >> -- > >> Benjamin Sterling > >> http://www.KenzoMedia.com > >> http://www.KenzoHosting.com > >> > > > > > > > > -- > > Benjamin Sterling > > http://www.KenzoMedia.com > > http://www.KenzoHosting.com > > > > > > -- > View this message in context: > http://www.nabble.com/Animation-bug-in-1.2-tf4426383s15494.html#a12634375 > Sent from the JQuery mailing list archive at Nabble.com. > >