Changeset 169 for ruby/branches/0.5/public/javascripts/effects.js
- Timestamp:
- Aug 6, 2009, 11:21:29 PM (15 years ago)
- Location:
- ruby/branches/0.5
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
ruby/branches/0.5/public/javascripts/effects.js
r164 r169 4 4 // Mark Pilgrim (http://diveintomark.org/) 5 5 // Martin Bialasinki 6 // 6 // 7 7 // script.aculo.us is freely distributable under the terms of an MIT-style license. 8 // For details, see the script.aculo.us web site: http://script.aculo.us/ 9 10 // converts rgb() and #xxx to #xxxxxx format, 11 // returns self (or first argument) if not convertable 12 String.prototype.parseColor = function() { 8 // For details, see the script.aculo.us web site: http://script.aculo.us/ 9 10 // converts rgb() and #xxx to #xxxxxx format, 11 // returns self (or first argument) if not convertable 12 String.prototype.parseColor = function() { 13 13 var color = '#'; 14 if (this.slice(0,4) == 'rgb(') { 15 var cols = this.slice(4,this.length-1).split(','); 16 var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); 17 } else { 18 if (this.slice(0,1) == '#') { 19 if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); 20 if (this.length==7) color = this.toLowerCase(); 21 } 22 } 23 return (color.length==7 ? color : (arguments[0] || this)); 14 if (this.slice(0,4) == 'rgb(') { 15 var cols = this.slice(4,this.length-1).split(','); 16 var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); 17 } else { 18 if (this.slice(0,1) == '#') { 19 if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); 20 if (this.length==7) color = this.toLowerCase(); 21 } 22 } 23 return (color.length==7 ? color : (arguments[0] || this)); 24 24 }; 25 25 26 26 /*--------------------------------------------------------------------------*/ 27 27 28 Element.collectTextNodes = function(element) { 28 Element.collectTextNodes = function(element) { 29 29 return $A($(element).childNodes).collect( function(node) { 30 return (node.nodeType==3 ? node.nodeValue : 30 return (node.nodeType==3 ? node.nodeValue : 31 31 (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); 32 32 }).flatten().join(''); 33 33 }; 34 34 35 Element.collectTextNodesIgnoreClass = function(element, className) { 35 Element.collectTextNodesIgnoreClass = function(element, className) { 36 36 return $A($(element).childNodes).collect( function(node) { 37 return (node.nodeType==3 ? node.nodeValue : 38 ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 37 return (node.nodeType==3 ? node.nodeValue : 38 ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 39 39 Element.collectTextNodesIgnoreClass(node, className) : '')); 40 40 }).flatten().join(''); … … 42 42 43 43 Element.setContentZoom = function(element, percent) { 44 element = $(element); 45 element.setStyle({fontSize: (percent/100) + 'em'}); 44 element = $(element); 45 element.setStyle({fontSize: (percent/100) + 'em'}); 46 46 if (Prototype.Browser.WebKit) window.scrollBy(0,0); 47 47 return element; … … 71 71 linear: Prototype.K, 72 72 sinoidal: function(pos) { 73 return (-Math.cos(pos*Math.PI)/2) + 0.5;73 return (-Math.cos(pos*Math.PI)/2) + .5; 74 74 }, 75 75 reverse: function(pos) { … … 77 77 }, 78 78 flicker: function(pos) { 79 var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;79 var pos = ((-Math.cos(pos*Math.PI)/4) + .75) + Math.random()/4; 80 80 return pos > 1 ? 1 : pos; 81 81 }, 82 82 wobble: function(pos) { 83 return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; 84 }, 85 pulse: function(pos, pulses) { 86 pulses = pulses || 5; 87 return ( 88 ((pos % (1/pulses)) * pulses).round() == 0 ? 89 ((pos * pulses * 2) - (pos * pulses * 2).floor()) : 90 1 - ((pos * pulses * 2) - (pos * pulses * 2).floor()) 91 ); 92 }, 93 spring: function(pos) { 94 return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); 83 return (-Math.cos(pos*Math.PI*(9*pos))/2) + .5; 84 }, 85 pulse: function(pos, pulses) { 86 return (-Math.cos((pos*((pulses||5)-.5)*2)*Math.PI)/2) + .5; 87 }, 88 spring: function(pos) { 89 return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); 95 90 }, 96 91 none: function(pos) { … … 113 108 var tagifyStyle = 'position:relative'; 114 109 if (Prototype.Browser.IE) tagifyStyle += ';zoom:1'; 115 110 116 111 element = $(element); 117 112 $A(element.childNodes).each( function(child) { … … 120 115 element.insertBefore( 121 116 new Element('span', {style: tagifyStyle}).update( 122 character == ' ' ? String.fromCharCode(160) : character), 117 character == ' ' ? String.fromCharCode(160) : character), 123 118 child); 124 119 }); … … 129 124 multiple: function(element, effect) { 130 125 var elements; 131 if (((typeof element == 'object') || 132 Object.isFunction(element)) && 126 if (((typeof element == 'object') || 127 Object.isFunction(element)) && 133 128 (element.length)) 134 129 elements = element; 135 130 else 136 131 elements = $(element).childNodes; 137 132 138 133 var options = Object.extend({ 139 134 speed: 0.1, … … 157 152 queue: { position:'end', scope:(element.id || 'global'), limit: 1 } 158 153 }, arguments[2] || { }); 159 Effect[element.visible() ? 154 Effect[element.visible() ? 160 155 Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); 161 156 } … … 169 164 initialize: function() { 170 165 this.effects = []; 171 this.interval = null; 166 this.interval = null; 172 167 }, 173 168 _each: function(iterator) { … … 176 171 add: function(effect) { 177 172 var timestamp = new Date().getTime(); 178 179 var position = Object.isString(effect.options.queue) ? 173 174 var position = Object.isString(effect.options.queue) ? 180 175 effect.options.queue : effect.options.queue.position; 181 176 182 177 switch(position) { 183 178 case 'front': 184 // move unstarted effects after this effect 179 // move unstarted effects after this effect 185 180 this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { 186 181 e.startOn += effect.finishOn; … … 196 191 break; 197 192 } 198 193 199 194 effect.startOn += timestamp; 200 195 effect.finishOn += timestamp; … … 202 197 if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit)) 203 198 this.effects.push(effect); 204 199 205 200 if (!this.interval) 206 201 this.interval = setInterval(this.loop.bind(this), 15); … … 215 210 loop: function() { 216 211 var timePos = new Date().getTime(); 217 for(var i=0, len=this.effects.length;i<len;i++) 212 for(var i=0, len=this.effects.length;i<len;i++) 218 213 this.effects[i] && this.effects[i].loop(timePos); 219 214 } … … 224 219 get: function(queueName) { 225 220 if (!Object.isString(queueName)) return queueName; 226 221 227 222 return this.instances.get(queueName) || 228 223 this.instances.set(queueName, new Effect.ScopedQueue()); … … 249 244 this.totalTime = this.finishOn-this.startOn; 250 245 this.totalFrames = this.options.fps*this.options.duration; 251 252 eval('this.render = function(pos){ '+ 253 'if (this.state=="idle"){this.state="running";'+ 254 codeForEvent(this.options,'beforeSetup')+ 255 (this.setup ? 'this.setup();':'')+ 256 codeForEvent(this.options,'afterSetup')+ 257 '};if (this.state=="running"){'+ 258 'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+ 259 'this.position=pos;'+ 260 codeForEvent(this.options,'beforeUpdate')+ 261 (this.update ? 'this.update(pos);':'')+ 262 codeForEvent(this.options,'afterUpdate')+ 263 '}}'); 264 246 247 this.render = (function() { 248 function dispatch(effect, eventName) { 249 if (effect.options[eventName + 'Internal']) 250 effect.options[eventName + 'Internal'](effect); 251 if (effect.options[eventName]) 252 effect.options[eventName](effect); 253 } 254 255 return function(pos) { 256 if (this.state === "idle") { 257 this.state = "running"; 258 dispatch(this, 'beforeSetup'); 259 if (this.setup) this.setup(); 260 dispatch(this, 'afterSetup'); 261 } 262 if (this.state === "running") { 263 pos = (this.options.transition(pos) * this.fromToDelta) + this.options.from; 264 this.position = pos; 265 dispatch(this, 'beforeUpdate'); 266 if (this.update) this.update(pos); 267 dispatch(this, 'afterUpdate'); 268 } 269 }; 270 })(); 271 265 272 this.event('beforeStart'); 266 273 if (!this.options.sync) 267 Effect.Queues.get(Object.isString(this.options.queue) ? 274 Effect.Queues.get(Object.isString(this.options.queue) ? 268 275 'global' : this.options.queue.scope).add(this); 269 276 }, … … 274 281 this.cancel(); 275 282 this.event('beforeFinish'); 276 if (this.finish) this.finish(); 283 if (this.finish) this.finish(); 277 284 this.event('afterFinish'); 278 return; 285 return; 279 286 } 280 287 var pos = (timePos - this.startOn) / this.totalTime, … … 288 295 cancel: function() { 289 296 if (!this.options.sync) 290 Effect.Queues.get(Object.isString(this.options.queue) ? 297 Effect.Queues.get(Object.isString(this.options.queue) ? 291 298 'global' : this.options.queue.scope).remove(this); 292 299 this.state = 'finished'; … … 326 333 initialize: function(object, from, to) { 327 334 object = Object.isString(object) ? $(object) : object; 328 var args = $A(arguments), method = args.last(), 335 var args = $A(arguments), method = args.last(), 329 336 options = args.length == 5 ? args[3] : null; 330 337 this.method = Object.isFunction(method) ? method.bind(object) : 331 Object.isFunction(object[method]) ? object[method].bind(object) : 338 Object.isFunction(object[method]) ? object[method].bind(object) : 332 339 function(value) { object[method] = value }; 333 340 this.start(Object.extend({ from: from, to: to }, options || { })); … … 393 400 // for backwards compatibility 394 401 Effect.MoveBy = function(element, toTop, toLeft) { 395 return new Effect.Move(element, 402 return new Effect.Move(element, 396 403 Object.extend({ x: toLeft, y: toTop }, arguments[3] || { })); 397 404 }; … … 415 422 this.restoreAfterFinish = this.options.restoreAfterFinish || false; 416 423 this.elementPositioning = this.element.getStyle('position'); 417 424 418 425 this.originalStyle = { }; 419 426 ['top','left','width','height','fontSize'].each( function(k) { 420 427 this.originalStyle[k] = this.element.style[k]; 421 428 }.bind(this)); 422 429 423 430 this.originalTop = this.element.offsetTop; 424 431 this.originalLeft = this.element.offsetLeft; 425 432 426 433 var fontSize = this.element.getStyle('font-size') || '100%'; 427 434 ['em','px','%','pt'].each( function(fontSizeType) { … … 431 438 } 432 439 }.bind(this)); 433 440 434 441 this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; 435 442 436 443 this.dims = null; 437 444 if (this.options.scaleMode=='box') … … 508 515 Effect.ScrollTo = function(element) { 509 516 var options = arguments[1] || { }, 510 scrollOffsets = document.viewport.getScrollOffsets(), 511 elementOffsets = $(element).cumulativeOffset(), 512 max = (window.height || document.body.scrollHeight) - document.viewport.getHeight(); 517 scrollOffsets = document.viewport.getScrollOffsets(), 518 elementOffsets = $(element).cumulativeOffset(); 513 519 514 520 if (options.offset) elementOffsets[1] += options.offset; … … 516 522 return new Effect.Tween(null, 517 523 scrollOffsets.top, 518 elementOffsets[1] > max ? max : elementOffsets[1],524 elementOffsets[1], 519 525 options, 520 function(p){ scrollTo(scrollOffsets.left, p.round()) }526 function(p){ scrollTo(scrollOffsets.left, p.round()); } 521 527 ); 522 528 }; … … 530 536 from: element.getOpacity() || 1.0, 531 537 to: 0.0, 532 afterFinishInternal: function(effect) { 538 afterFinishInternal: function(effect) { 533 539 if (effect.options.to!=0) return; 534 effect.element.hide().setStyle({opacity: oldOpacity}); 540 effect.element.hide().setStyle({opacity: oldOpacity}); 535 541 } 536 542 }, arguments[1] || { }); … … 548 554 }, 549 555 beforeSetup: function(effect) { 550 effect.element.setOpacity(effect.options.from).show(); 556 effect.element.setOpacity(effect.options.from).show(); 551 557 }}, arguments[1] || { }); 552 558 return new Effect.Opacity(element,options); … … 555 561 Effect.Puff = function(element) { 556 562 element = $(element); 557 var oldStyle = { 558 opacity: element.getInlineOpacity(), 563 var oldStyle = { 564 opacity: element.getInlineOpacity(), 559 565 position: element.getStyle('position'), 560 566 top: element.style.top, … … 564 570 }; 565 571 return new Effect.Parallel( 566 [ new Effect.Scale(element, 200, 567 { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 568 new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 569 Object.extend({ duration: 1.0, 572 [ new Effect.Scale(element, 200, 573 { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 574 new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 575 Object.extend({ duration: 1.0, 570 576 beforeSetupInternal: function(effect) { 571 Position.absolutize(effect.effects[0].element) 577 Position.absolutize(effect.effects[0].element); 572 578 }, 573 579 afterFinishInternal: function(effect) { … … 581 587 element.makeClipping(); 582 588 return new Effect.Scale(element, 0, 583 Object.extend({ scaleContent: false, 584 scaleX: false, 589 Object.extend({ scaleContent: false, 590 scaleX: false, 585 591 restoreAfterFinish: true, 586 592 afterFinishInternal: function(effect) { 587 593 effect.element.hide().undoClipping(); 588 } 594 } 589 595 }, arguments[1] || { }) 590 596 ); … … 594 600 element = $(element); 595 601 var elementDimensions = element.getDimensions(); 596 return new Effect.Scale(element, 100, Object.extend({ 597 scaleContent: false, 602 return new Effect.Scale(element, 100, Object.extend({ 603 scaleContent: false, 598 604 scaleX: false, 599 605 scaleFrom: 0, … … 601 607 restoreAfterFinish: true, 602 608 afterSetup: function(effect) { 603 effect.element.makeClipping().setStyle({height: '0px'}).show(); 604 }, 609 effect.element.makeClipping().setStyle({height: '0px'}).show(); 610 }, 605 611 afterFinishInternal: function(effect) { 606 612 effect.element.undoClipping(); … … 617 623 transition: Effect.Transitions.flicker, 618 624 afterFinishInternal: function(effect) { 619 new Effect.Scale(effect.element, 1, { 625 new Effect.Scale(effect.element, 1, { 620 626 duration: 0.3, scaleFromCenter: true, 621 627 scaleX: false, scaleContent: false, restoreAfterFinish: true, 622 beforeSetup: function(effect) { 628 beforeSetup: function(effect) { 623 629 effect.element.makePositioned().makeClipping(); 624 630 }, … … 626 632 effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity}); 627 633 } 628 }) 634 }); 629 635 } 630 636 }, arguments[1] || { })); … … 638 644 opacity: element.getInlineOpacity() }; 639 645 return new Effect.Parallel( 640 [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 646 [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 641 647 new Effect.Opacity(element, { sync: true, to: 0.0 }) ], 642 648 Object.extend( 643 649 { duration: 0.5, 644 650 beforeSetup: function(effect) { 645 effect.effects[0].element.makePositioned(); 651 effect.effects[0].element.makePositioned(); 646 652 }, 647 653 afterFinishInternal: function(effect) { 648 654 effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle); 649 } 655 } 650 656 }, arguments[1] || { })); 651 657 }; … … 675 681 { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) { 676 682 effect.element.undoPositioned().setStyle(oldStyle); 677 }}) }}) }}) }}) }})}});683 }}); }}); }}); }}); }}); }}); 678 684 }; 679 685 … … 683 689 var oldInnerBottom = element.down().getStyle('bottom'); 684 690 var elementDimensions = element.getDimensions(); 685 return new Effect.Scale(element, 100, Object.extend({ 686 scaleContent: false, 687 scaleX: false, 691 return new Effect.Scale(element, 100, Object.extend({ 692 scaleContent: false, 693 scaleX: false, 688 694 scaleFrom: window.opera ? 0 : 1, 689 695 scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, … … 693 699 effect.element.down().makePositioned(); 694 700 if (window.opera) effect.element.setStyle({top: ''}); 695 effect.element.makeClipping().setStyle({height: '0px'}).show(); 701 effect.element.makeClipping().setStyle({height: '0px'}).show(); 696 702 }, 697 703 afterUpdateInternal: function(effect) { 698 704 effect.element.down().setStyle({bottom: 699 (effect.dims[0] - effect.element.clientHeight) + 'px' }); 705 (effect.dims[0] - effect.element.clientHeight) + 'px' }); 700 706 }, 701 707 afterFinishInternal: function(effect) { … … 711 717 var elementDimensions = element.getDimensions(); 712 718 return new Effect.Scale(element, window.opera ? 0 : 1, 713 Object.extend({ scaleContent: false, 714 scaleX: false, 719 Object.extend({ scaleContent: false, 720 scaleX: false, 715 721 scaleMode: 'box', 716 722 scaleFrom: 100, … … 722 728 if (window.opera) effect.element.setStyle({top: ''}); 723 729 effect.element.makeClipping().show(); 724 }, 730 }, 725 731 afterUpdateInternal: function(effect) { 726 732 effect.element.down().setStyle({bottom: … … 735 741 }; 736 742 737 // Bug in opera makes the TD containing this element expand for a instance after finish 743 // Bug in opera makes the TD containing this element expand for a instance after finish 738 744 Effect.Squish = function(element) { 739 return new Effect.Scale(element, window.opera ? 1 : 0, { 745 return new Effect.Scale(element, window.opera ? 1 : 0, { 740 746 restoreAfterFinish: true, 741 747 beforeSetup: function(effect) { 742 effect.element.makeClipping(); 743 }, 748 effect.element.makeClipping(); 749 }, 744 750 afterFinishInternal: function(effect) { 745 effect.element.hide().undoClipping(); 751 effect.element.hide().undoClipping(); 746 752 } 747 753 }); … … 763 769 opacity: element.getInlineOpacity() }; 764 770 765 var dims = element.getDimensions(); 771 var dims = element.getDimensions(); 766 772 var initialMoveX, initialMoveY; 767 773 var moveX, moveY; 768 774 769 775 switch (options.direction) { 770 776 case 'top-left': 771 initialMoveX = initialMoveY = moveX = moveY = 0; 777 initialMoveX = initialMoveY = moveX = moveY = 0; 772 778 break; 773 779 case 'top-right': … … 794 800 break; 795 801 } 796 802 797 803 return new Effect.Move(element, { 798 804 x: initialMoveX, 799 805 y: initialMoveY, 800 duration: 0.01, 806 duration: 0.01, 801 807 beforeSetup: function(effect) { 802 808 effect.element.hide().makeClipping().makePositioned(); … … 807 813 new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), 808 814 new Effect.Scale(effect.element, 100, { 809 scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 815 scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 810 816 sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) 811 817 ], Object.extend({ 812 818 beforeSetup: function(effect) { 813 effect.effects[0].element.setStyle({height: '0px'}).show(); 819 effect.effects[0].element.setStyle({height: '0px'}).show(); 814 820 }, 815 821 afterFinishInternal: function(effect) { 816 effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 822 effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 817 823 } 818 824 }, options) 819 ) 825 ); 820 826 } 821 827 }); … … 839 845 var dims = element.getDimensions(); 840 846 var moveX, moveY; 841 847 842 848 switch (options.direction) { 843 849 case 'top-left': … … 856 862 moveY = dims.height; 857 863 break; 858 case 'center': 864 case 'center': 859 865 moveX = dims.width / 2; 860 866 moveY = dims.height / 2; 861 867 break; 862 868 } 863 869 864 870 return new Effect.Parallel( 865 871 [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), 866 872 new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), 867 873 new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) 868 ], Object.extend({ 874 ], Object.extend({ 869 875 beforeStartInternal: function(effect) { 870 effect.effects[0].element.makePositioned().makeClipping(); 876 effect.effects[0].element.makePositioned().makeClipping(); 871 877 }, 872 878 afterFinishInternal: function(effect) { … … 878 884 Effect.Pulsate = function(element) { 879 885 element = $(element); 880 var options = arguments[1] || { }; 881 var oldOpacity = element.getInlineOpacity(); 882 var transition = options.transition || Effect.Transitions.sinoidal; 883 var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) }; 884 reverser.bind(transition); 885 return new Effect.Opacity(element, 886 var options = arguments[1] || { }, 887 oldOpacity = element.getInlineOpacity(), 888 transition = options.transition || Effect.Transitions.linear, 889 reverser = function(pos){ 890 return 1 - transition((-Math.cos((pos*(options.pulses||5)*2)*Math.PI)/2) + .5); 891 }; 892 893 return new Effect.Opacity(element, 886 894 Object.extend(Object.extend({ duration: 2.0, from: 0, 887 895 afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); } … … 897 905 height: element.style.height }; 898 906 element.makeClipping(); 899 return new Effect.Scale(element, 5, Object.extend({ 907 return new Effect.Scale(element, 5, Object.extend({ 900 908 scaleContent: false, 901 909 scaleX: false, 902 910 afterFinishInternal: function(effect) { 903 new Effect.Scale(element, 1, { 904 scaleContent: false, 911 new Effect.Scale(element, 1, { 912 scaleContent: false, 905 913 scaleY: false, 906 914 afterFinishInternal: function(effect) { … … 917 925 style: { } 918 926 }, arguments[1] || { }); 919 927 920 928 if (!Object.isString(options.style)) this.style = $H(options.style); 921 929 else { … … 935 943 effect.element.style[transform.style] = ''; 936 944 }); 937 } 945 }; 938 946 } 939 947 } 940 948 this.start(options); 941 949 }, 942 950 943 951 setup: function(){ 944 952 function parseColor(color){ … … 946 954 color = color.parseColor(); 947 955 return $R(0,2).map(function(i){ 948 return parseInt( color.slice(i*2+1,i*2+3), 16 ) 956 return parseInt( color.slice(i*2+1,i*2+3), 16 ); 949 957 }); 950 958 } … … 966 974 967 975 var originalValue = this.element.getStyle(property); 968 return { 969 style: property.camelize(), 970 originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 976 return { 977 style: property.camelize(), 978 originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 971 979 targetValue: unit=='color' ? parseColor(value) : value, 972 980 unit: unit … … 979 987 (isNaN(transform.originalValue) || isNaN(transform.targetValue)) 980 988 ) 981 ) 989 ); 982 990 }); 983 991 }, … … 985 993 var style = { }, transform, i = this.transforms.length; 986 994 while(i--) 987 style[(transform = this.transforms[i]).style] = 995 style[(transform = this.transforms[i]).style] = 988 996 transform.unit=='color' ? '#'+ 989 997 (Math.round(transform.originalValue[0]+ … … 994 1002 (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() : 995 1003 (transform.originalValue + 996 (transform.targetValue - transform.originalValue) * position).toFixed(3) + 1004 (transform.targetValue - transform.originalValue) * position).toFixed(3) + 997 1005 (transform.unit === null ? '' : transform.unit); 998 1006 this.element.setStyle(style, true); … … 1031 1039 1032 1040 Element.CSS_PROPERTIES = $w( 1033 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 1041 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 1034 1042 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + 1035 1043 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + … … 1040 1048 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + 1041 1049 'right textIndent top width wordSpacing zIndex'); 1042 1050 1043 1051 Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; 1044 1052 … … 1052 1060 style = String.__parseStyleElement.childNodes[0].style; 1053 1061 } 1054 1062 1055 1063 Element.CSS_PROPERTIES.each(function(property){ 1056 if (style[property]) styleRules.set(property, style[property]); 1064 if (style[property]) styleRules.set(property, style[property]); 1057 1065 }); 1058 1066 1059 1067 if (Prototype.Browser.IE && this.include('opacity')) 1060 1068 styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]); … … 1075 1083 element = $(element); 1076 1084 var css = element.currentStyle, styles; 1077 styles = Element.CSS_PROPERTIES.inject({ }, function( hash, property) {1078 hash.set(property, css[property]);1079 return hash;1085 styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) { 1086 results[property] = css[property]; 1087 return results; 1080 1088 }); 1081 if (!styles.opacity) styles. set('opacity', element.getOpacity());1089 if (!styles.opacity) styles.opacity = element.getOpacity(); 1082 1090 return styles; 1083 1091 }; 1084 } ;1092 } 1085 1093 1086 1094 Effect.Methods = { … … 1091 1099 }, 1092 1100 visualEffect: function(element, effect, options) { 1093 element = $(element) 1101 element = $(element); 1094 1102 var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1); 1095 1103 new Effect[klass](element, options); … … 1105 1113 $w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+ 1106 1114 'pulsate shake puff squish switchOff dropOut').each( 1107 function(effect) { 1115 function(effect) { 1108 1116 Effect.Methods[effect] = function(element, options){ 1109 1117 element = $(element); 1110 1118 Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options); 1111 1119 return element; 1112 } 1120 }; 1113 1121 } 1114 1122 ); 1115 1123 1116 $w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( 1124 $w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( 1117 1125 function(f) { Effect.Methods[f] = Element[f]; } 1118 1126 );
Note:
See TracChangeset
for help on using the changeset viewer.