📄 fx.js
字号:
/*
* Ext JS Library 2.1
* Copyright(c) 2006-2008, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
//Notifies Element that fx methods are availableExt.enableFx = true;/** * @class Ext.Fx * <p>A class to provide basic animation and visual effects support. <b>Note:</b> This class is automatically applied * to the {@link Ext.Element} interface when included, so all effects calls should be performed via Element. * Conversely, since the effects are not actually defined in Element, Ext.Fx <b>must</b> be included in order for the * Element effects to work.</p><br/> * * <p>It is important to note that although the Fx methods and many non-Fx Element methods support "method chaining" in that * they return the Element object itself as the method return value, it is not always possible to mix the two in a single * method chain. The Fx methods use an internal effects queue so that each effect can be properly timed and sequenced. * Non-Fx methods, on the other hand, have no such internal queueing and will always execute immediately. For this reason, * while it may be possible to mix certain Fx and non-Fx method calls in a single chain, it may not always provide the * expected results and should be done with care.</p><br/> * * <p>Motion effects support 8-way anchoring, meaning that you can choose one of 8 different anchor points on the Element * that will serve as either the start or end point of the animation. Following are all of the supported anchor positions:</p><pre>Value Description----- -----------------------------tl The top left cornert The center of the top edgetr The top right cornerl The center of the left edger The center of the right edgebl The bottom left cornerb The center of the bottom edgebr The bottom right corner</pre> * <b>Although some Fx methods accept specific custom config parameters, the ones shown in the Config Options section * below are common options that can be passed to any Fx method.</b> * * @cfg {Function} callback A function called when the effect is finished. Note that effects are queued internally by the * Fx class, so do not need to use the callback parameter to specify another effect -- effects can simply be chained together * and called in sequence (e.g., el.slideIn().highlight();). The callback is intended for any additional code that should * run once a particular effect has completed. * @cfg {Object} scope The scope of the effect function * @cfg {String} easing A valid Easing value for the effect * @cfg {String} afterCls A css class to apply after the effect * @cfg {Number} duration The length of time (in seconds) that the effect should last * @cfg {Boolean} remove Whether the Element should be removed from the DOM and destroyed after the effect finishes * @cfg {Boolean} useDisplay Whether to use the <i>display</i> CSS property instead of <i>visibility</i> when hiding Elements (only applies to * effects that end with the element being visually hidden, ignored otherwise) * @cfg {String/Object/Function} afterStyle A style specification string, e.g. "width:100px", or an object in the form {width:"100px"}, or * a function which returns such a specification that will be applied to the Element after the effect finishes * @cfg {Boolean} block Whether the effect should block other effects from queueing while it runs * @cfg {Boolean} concurrent Whether to allow subsequently-queued effects to run at the same time as the current effect, or to ensure that they run in sequence * @cfg {Boolean} stopFx Whether subsequent effects should be stopped and removed after the current effect finishes */Ext.Fx = { /** * Slides the element into view. An anchor point can be optionally passed to set the point of * origin for the slide effect. This function automatically handles wrapping the element with * a fixed-size container if needed. See the Fx class overview for valid anchor point options. * Usage: *<pre><code>// default: slide the element in from the topel.slideIn();// custom: slide the element in from the right with a 2-second durationel.slideIn('r', { duration: 2 });// common config options shown with default valuesel.slideIn('t', { easing: 'easeOut', duration: .5});</code></pre> * @param {String} anchor (optional) One of the valid Fx anchor positions (defaults to top: 't') * @param {Object} options (optional) Object literal with any of the Fx config options * @return {Ext.Element} The Element */ slideIn : function(anchor, o){ var el = this.getFxEl(); o = o || {}; el.queueFx(o, function(){ anchor = anchor || "t"; // fix display to visibility this.fixDisplay(); // restore values after effect var r = this.getFxRestore(); var b = this.getBox(); // fixed size for slide this.setSize(b); // wrap if needed var wrap = this.fxWrap(r.pos, o, "hidden"); var st = this.dom.style; st.visibility = "visible"; st.position = "absolute"; // clear out temp styles after slide and unwrap var after = function(){ el.fxUnwrap(wrap, r.pos, o); st.width = r.width; st.height = r.height; el.afterFx(o); }; // time to calc the positions var a, pt = {to: [b.x, b.y]}, bw = {to: b.width}, bh = {to: b.height}; switch(anchor.toLowerCase()){ case "t": wrap.setSize(b.width, 0); st.left = st.bottom = "0"; a = {height: bh}; break; case "l": wrap.setSize(0, b.height); st.right = st.top = "0"; a = {width: bw}; break; case "r": wrap.setSize(0, b.height); wrap.setX(b.right); st.left = st.top = "0"; a = {width: bw, points: pt}; break; case "b": wrap.setSize(b.width, 0); wrap.setY(b.bottom); st.left = st.top = "0"; a = {height: bh, points: pt}; break; case "tl": wrap.setSize(0, 0); st.right = st.bottom = "0"; a = {width: bw, height: bh}; break; case "bl": wrap.setSize(0, 0); wrap.setY(b.y+b.height); st.right = st.top = "0"; a = {width: bw, height: bh, points: pt}; break; case "br": wrap.setSize(0, 0); wrap.setXY([b.right, b.bottom]); st.left = st.top = "0"; a = {width: bw, height: bh, points: pt}; break; case "tr": wrap.setSize(0, 0); wrap.setX(b.x+b.width); st.left = st.bottom = "0"; a = {width: bw, height: bh, points: pt}; break; } this.dom.style.visibility = "visible"; wrap.show(); arguments.callee.anim = wrap.fxanim(a, o, 'motion', .5, 'easeOut', after); }); return this; }, /** * Slides the element out of view. An anchor point can be optionally passed to set the end point * for the slide effect. When the effect is completed, the element will be hidden (visibility = * 'hidden') but block elements will still take up space in the document. The element must be removed * from the DOM using the 'remove' config option if desired. This function automatically handles * wrapping the element with a fixed-size container if needed. See the Fx class overview for valid anchor point options. * Usage: *<pre><code>// default: slide the element out to the topel.slideOut();// custom: slide the element out to the right with a 2-second durationel.slideOut('r', { duration: 2 });// common config options shown with default valuesel.slideOut('t', { easing: 'easeOut', duration: .5, remove: false, useDisplay: false});</code></pre> * @param {String} anchor (optional) One of the valid Fx anchor positions (defaults to top: 't') * @param {Object} options (optional) Object literal with any of the Fx config options * @return {Ext.Element} The Element */ slideOut : function(anchor, o){ var el = this.getFxEl(); o = o || {}; el.queueFx(o, function(){ anchor = anchor || "t"; // restore values after effect var r = this.getFxRestore(); var b = this.getBox(); // fixed size for slide this.setSize(b); // wrap if needed var wrap = this.fxWrap(r.pos, o, "visible"); var st = this.dom.style; st.visibility = "visible"; st.position = "absolute"; wrap.setSize(b); var after = function(){ if(o.useDisplay){ el.setDisplayed(false); }else{ el.hide(); } el.fxUnwrap(wrap, r.pos, o); st.width = r.width; st.height = r.height; el.afterFx(o); }; var a, zero = {to: 0}; switch(anchor.toLowerCase()){ case "t": st.left = st.bottom = "0"; a = {height: zero}; break; case "l": st.right = st.top = "0"; a = {width: zero}; break; case "r": st.left = st.top = "0"; a = {width: zero, points: {to:[b.right, b.y]}}; break; case "b": st.left = st.top = "0"; a = {height: zero, points: {to:[b.x, b.bottom]}}; break; case "tl": st.right = st.bottom = "0"; a = {width: zero, height: zero}; break; case "bl": st.right = st.top = "0"; a = {width: zero, height: zero, points: {to:[b.x, b.bottom]}}; break; case "br": st.left = st.top = "0"; a = {width: zero, height: zero, points: {to:[b.x+b.width, b.bottom]}}; break; case "tr": st.left = st.bottom = "0"; a = {width: zero, height: zero, points: {to:[b.right, b.y]}}; break; } arguments.callee.anim = wrap.fxanim(a, o, 'motion', .5, "easeOut", after); }); return this; }, /** * Fades the element out while slowly expanding it in all directions. When the effect is completed, the * element will be hidden (visibility = 'hidden') but block elements will still take up space in the document. * The element must be removed from the DOM using the 'remove' config option if desired. * Usage: *<pre><code>// defaultel.puff();// common config options shown with default valuesel.puff({ easing: 'easeOut', duration: .5, remove: false, useDisplay: false});</code></pre> * @param {Object} options (optional) Object literal with any of the Fx config options * @return {Ext.Element} The Element */ puff : function(o){ var el = this.getFxEl(); o = o || {}; el.queueFx(o, function(){ this.clearOpacity(); this.show(); // restore values after effect var r = this.getFxRestore(); var st = this.dom.style; var after = function(){ if(o.useDisplay){ el.setDisplayed(false); }else{ el.hide(); } el.clearOpacity(); el.setPositioning(r.pos); st.width = r.width; st.height = r.height; st.fontSize = ''; el.afterFx(o); }; var width = this.getWidth(); var height = this.getHeight(); arguments.callee.anim = this.fxanim({ width : {to: this.adjustWidth(width * 2)}, height : {to: this.adjustHeight(height * 2)},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -