| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 | // Copyright 2011 The Closure Library Authors. All Rights Reserved.//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at////      http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS-IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License./** * @fileoverview CSS3 transition base library. * * @author chrishenry@google.com (Chris Henry) */goog.provide('goog.fx.css3.Transition');goog.require('goog.Timer');goog.require('goog.asserts');goog.require('goog.fx.TransitionBase');goog.require('goog.style');goog.require('goog.style.transition');/** * A class to handle targeted CSS3 transition. This class * handles common features required for targeted CSS3 transition. * * Browser that does not support CSS3 transition will still receive all * the events fired by the transition object, but will not have any transition * played. If the browser supports the final state as set in setFinalState * method, the element will ends in the final state. * * Transitioning multiple properties with the same setting is possible * by setting Css3Property's property to 'all'. Performing multiple * transitions can be done via setting multiple initialStyle, * finalStyle and transitions. Css3Property's delay can be used to * delay one of the transition. Here is an example for a transition * that expands on the width and then followed by the height: * * <pre> *   var animation = new goog.fx.css3.Transition( *     element, *     duration, *     {width: 10px, height: 10px}, *     {width: 100px, height: 100px}, *     [ *       {property: width, duration: 1, timing: 'ease-in', delay: 0}, *       {property: height, duration: 1, timing: 'ease-in', delay: 1} *     ] *   ); * </pre> * * @param {Element} element The element to be transitioned. * @param {number} duration The duration of the transition in seconds. *     This should be the longest of all transitions. * @param {Object} initialStyle Initial style properties of the element before *     animating. Set using {@code goog.style.setStyle}. * @param {Object} finalStyle Final style properties of the element after *     animating. Set using {@code goog.style.setStyle}. * @param {goog.style.transition.Css3Property| *     Array<goog.style.transition.Css3Property>} transitions A single CSS3 *     transition property or an array of it. * @extends {goog.fx.TransitionBase} * @constructor * @struct */goog.fx.css3.Transition = function(    element, duration, initialStyle, finalStyle, transitions) {  goog.fx.css3.Transition.base(this, 'constructor');  /**   * Timer id to be used to cancel animation part-way.   * @private {number}   */  this.timerId_;  /**   * @type {Element}   * @private   */  this.element_ = element;  /**   * @type {number}   * @private   */  this.duration_ = duration;  /**   * @type {Object}   * @private   */  this.initialStyle_ = initialStyle;  /**   * @type {Object}   * @private   */  this.finalStyle_ = finalStyle;  /**   * @type {Array<goog.style.transition.Css3Property>}   * @private   */  this.transitions_ = goog.isArray(transitions) ? transitions : [transitions];};goog.inherits(goog.fx.css3.Transition, goog.fx.TransitionBase);/** @override */goog.fx.css3.Transition.prototype.play = function() {  if (this.isPlaying()) {    return false;  }  this.onBegin();  this.onPlay();  this.startTime = goog.now();  this.setStatePlaying();  if (goog.style.transition.isSupported()) {    goog.style.setStyle(this.element_, this.initialStyle_);    // Allow element to get updated to its initial state before installing    // CSS3 transition.    this.timerId_ = goog.Timer.callOnce(this.play_, undefined, this);    return true;  } else {    this.stop_(false);    return false;  }};/** * Helper method for play method. This needs to be executed on a timer. * @private */goog.fx.css3.Transition.prototype.play_ = function() {  // This measurement of the DOM element causes the browser to recalculate its  // initial state before the transition starts.  goog.style.getSize(this.element_);  goog.style.transition.set(this.element_, this.transitions_);  goog.style.setStyle(this.element_, this.finalStyle_);  this.timerId_ = goog.Timer.callOnce(      goog.bind(this.stop_, this, false), this.duration_ * 1000);};/** @override */goog.fx.css3.Transition.prototype.stop = function() {  if (!this.isPlaying()) return;  this.stop_(true);};/** * Helper method for stop method. * @param {boolean} stopped If the transition was stopped. * @private */goog.fx.css3.Transition.prototype.stop_ = function(stopped) {  goog.style.transition.removeAll(this.element_);  // Clear the timer.  goog.Timer.clear(this.timerId_);  // Make sure that we have reached the final style.  goog.style.setStyle(this.element_, this.finalStyle_);  this.endTime = goog.now();  this.setStateStopped();  if (stopped) {    this.onStop();  } else {    this.onFinish();  }  this.onEnd();};/** @override */goog.fx.css3.Transition.prototype.disposeInternal = function() {  this.stop();  goog.fx.css3.Transition.base(this, 'disposeInternal');};/** * Pausing CSS3 Transitions in not supported. * @override */goog.fx.css3.Transition.prototype.pause = function() {  goog.asserts.assert(false, 'Css3 transitions does not support pause action.');};
 |