mirror of
https://gitee.com/ShopeX/OMS
synced 2026-04-04 22:36:52 +08:00
187 lines
4.2 KiB
JavaScript
187 lines
4.2 KiB
JavaScript
/**
|
|
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
/*
|
|
---
|
|
|
|
script: Fx.Slide.js
|
|
|
|
name: Fx.Slide
|
|
|
|
description: Effect to slide an element in and out of view.
|
|
|
|
license: MIT-style license
|
|
|
|
authors:
|
|
- Valerio Proietti
|
|
|
|
requires:
|
|
- Core/Fx
|
|
- Core/Element.Style
|
|
- MooTools.More
|
|
|
|
provides: [Fx.Slide]
|
|
|
|
...
|
|
*/
|
|
|
|
Fx.Slide = new Class({
|
|
|
|
Extends: Fx,
|
|
|
|
options: {
|
|
mode: 'vertical',
|
|
wrapper: false,
|
|
hideOverflow: true,
|
|
resetHeight: false
|
|
},
|
|
|
|
initialize: function(element, options){
|
|
element = this.element = this.subject = document.id(element);
|
|
this.parent(options);
|
|
options = this.options;
|
|
|
|
var wrapper = element.retrieve('wrapper'),
|
|
styles = element.getStyles('margin', 'position', 'overflow');
|
|
|
|
if (options.hideOverflow) styles = Object.append(styles, {overflow: 'hidden'});
|
|
if (options.wrapper) wrapper = document.id(options.wrapper).setStyles(styles);
|
|
|
|
if (!wrapper) wrapper = new Element('div', {
|
|
styles: styles
|
|
}).wraps(element);
|
|
|
|
element.store('wrapper', wrapper).setStyle('margin', 0);
|
|
if (element.getStyle('overflow') == 'visible') element.setStyle('overflow', 'hidden');
|
|
|
|
this.now = [];
|
|
this.open = true;
|
|
this.wrapper = wrapper;
|
|
|
|
this.addEvent('complete', function(){
|
|
this.open = (wrapper['offset' + this.layout.capitalize()] != 0);
|
|
if (this.open && this.options.resetHeight) wrapper.setStyle('height', '');
|
|
}, true);
|
|
},
|
|
|
|
vertical: function(){
|
|
this.margin = 'margin-top';
|
|
this.layout = 'height';
|
|
this.offset = this.element.offsetHeight;
|
|
},
|
|
|
|
horizontal: function(){
|
|
this.margin = 'margin-left';
|
|
this.layout = 'width';
|
|
this.offset = this.element.offsetWidth;
|
|
},
|
|
|
|
set: function(now){
|
|
this.element.setStyle(this.margin, now[0]);
|
|
this.wrapper.setStyle(this.layout, now[1]);
|
|
return this;
|
|
},
|
|
|
|
compute: function(from, to, delta){
|
|
return [0, 1].map(function(i){
|
|
return Fx.compute(from[i], to[i], delta);
|
|
});
|
|
},
|
|
|
|
start: function(how, mode){
|
|
if (!this.check(how, mode)) return this;
|
|
this[mode || this.options.mode]();
|
|
|
|
var margin = this.element.getStyle(this.margin).toInt(),
|
|
layout = this.wrapper.getStyle(this.layout).toInt(),
|
|
caseIn = [[margin, layout], [0, this.offset]],
|
|
caseOut = [[margin, layout], [-this.offset, 0]],
|
|
start;
|
|
|
|
switch (how){
|
|
case 'in': start = caseIn; break;
|
|
case 'out': start = caseOut; break;
|
|
case 'toggle': start = (layout == 0) ? caseIn : caseOut;
|
|
}
|
|
return this.parent(start[0], start[1]);
|
|
},
|
|
|
|
slideIn: function(mode){
|
|
return this.start('in', mode);
|
|
},
|
|
|
|
slideOut: function(mode){
|
|
return this.start('out', mode);
|
|
},
|
|
|
|
hide: function(mode){
|
|
this[mode || this.options.mode]();
|
|
this.open = false;
|
|
return this.set([-this.offset, 0]);
|
|
},
|
|
|
|
show: function(mode){
|
|
this[mode || this.options.mode]();
|
|
this.open = true;
|
|
return this.set([0, this.offset]);
|
|
},
|
|
|
|
toggle: function(mode){
|
|
return this.start('toggle', mode);
|
|
}
|
|
|
|
});
|
|
|
|
Element.Properties.slide = {
|
|
|
|
set: function(options){
|
|
this.get('slide').cancel().setOptions(options);
|
|
return this;
|
|
},
|
|
|
|
get: function(){
|
|
var slide = this.retrieve('slide');
|
|
if (!slide){
|
|
slide = new Fx.Slide(this, {link: 'cancel'});
|
|
this.store('slide', slide);
|
|
}
|
|
return slide;
|
|
}
|
|
|
|
};
|
|
|
|
Element.implement({
|
|
|
|
slide: function(how, mode){
|
|
how = how || 'toggle';
|
|
var slide = this.get('slide'), toggle;
|
|
switch (how){
|
|
case 'hide': slide.hide(mode); break;
|
|
case 'show': slide.show(mode); break;
|
|
case 'toggle':
|
|
var flag = this.retrieve('slide:flag', slide.open);
|
|
slide[flag ? 'slideOut' : 'slideIn'](mode);
|
|
this.store('slide:flag', !flag);
|
|
toggle = true;
|
|
break;
|
|
default: slide.start(how, mode);
|
|
}
|
|
if (!toggle) this.eliminate('slide:flag');
|
|
return this;
|
|
}
|
|
|
|
});
|