Форк Rambox
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

237 lines
7.0 KiB

/**
* Simple class that can provide a shadow effect for any absolutely positioned {@link
* Ext.dom.Element Element}.
*
* Not meant to be used directly. To apply a shadow to an Element use the
* {@link Ext.dom.Element#enableShadow enableShadow} method.
*
* @private
*/
Ext.define('Ext.dom.Shadow', {
extend: 'Ext.dom.Underlay',
alternateClassName: 'Ext.Shadow',
/**
* @cfg {String} mode
* The shadow display mode. Supports the following options:
*
* - sides : Shadow displays on both sides and bottom only
* - frame : Shadow displays equally on all four sides
* - drop : Traditional bottom-right drop shadow
*/
mode: 'drop',
/**
* @cfg {Number} offset
* The number of pixels to offset the shadow from the element
*/
offset: 4,
cls: Ext.baseCSSPrefix + (!Ext.supports.CSS3BoxShadow ? 'ie' : 'css') + '-shadow',
/**
* Creates new Shadow.
* @param {Object} config (optional) Config object.
*/
constructor: function(config) {
var me = this,
outerOffsets, offsets, offset, rad;
me.callParent([config]);
me.elementConfig = {
cls: me.cls,
role: 'presentation'
};
offset = me.offset;
rad = Math.floor(offset / 2);
me.opacity = 50;
switch (me.mode.toLowerCase()) {
case "drop":
outerOffsets = {
x: 0,
y: 0,
w: offset,
h: offset
};
if (Ext.supports.CSS3BoxShadow) {
offsets = {
x: offset,
y: offset,
h: -offset,
w: -offset
};
}
else {
offsets = {
x: -rad,
y: -rad,
h: -rad,
w: -rad
};
}
break;
case "sides":
outerOffsets = {
x: -offset,
y: 0,
w: offset * 2,
h: offset
};
if (Ext.supports.CSS3BoxShadow) {
offsets = {
x: 0,
y: offset,
h: -offset,
w: 0
};
}
else {
offsets = {
x: 1 + rad - 2 * offset,
y: - (1 + rad),
h: -1,
w: rad - 1
};
}
break;
case "frame":
outerOffsets = {
x: -offset,
y: -offset,
w: offset * 2,
h: offset * 2
};
if (Ext.supports.CSS3BoxShadow) {
offsets = {
x: 0,
y: 0,
h: 0,
w: 0
};
}
else {
offsets = {
x: 1 + rad - 2 * offset,
y: 1 + rad - 2 * offset,
h: offset - rad - 1,
w: offset - rad - 1
};
}
break;
case "bottom":
outerOffsets = {
x: -offset,
y: 0,
w: offset * 2,
h: offset
};
if (Ext.supports.CSS3BoxShadow) {
offsets = {
x: 0,
y: offset,
h: -offset,
w: 0
};
}
else {
offsets = {
x: 0,
y: offset,
h: 0,
w: 0
};
}
break;
}
/**
* @property {Object} offsets The offsets used for positioning the shadow element
* relative to its target element
*/
me.offsets = offsets;
/**
* @property {Object} outerOffsets Offsets that represent the union of the areas
* of the target element and the shadow combined. Used by Ext.dom.Element for
* ensuring that the shim (if present) extends under the full area of both elements.
*/
me.outerOffsets = outerOffsets;
},
/**
* @private
* Returns the shadow size on each side of the element in standard CSS order: top, right, bottom, left;
* @return {Number[]} Top, right, bottom and left shadow size.
*/
getShadowSize: function() {
var me = this,
offset = me.el ? me.offset : 0,
result = [offset, offset, offset, offset],
mode = me.mode.toLowerCase();
// There are only offsets if the shadow element is present.
if (me.el && mode !== 'frame') {
result[0] = 0;
if (mode == 'drop') {
result[3] = 0;
}
}
return result;
},
// private - CSS property to use to set the box shadow
boxShadowProperty: (function() {
var property = 'boxShadow',
style = document.documentElement.style;
if (!('boxShadow' in style)) {
if ('WebkitBoxShadow' in style) {
// Safari prior to version 5.1 and Chrome prior to version 10
property = 'WebkitBoxShadow';
}
else if ('MozBoxShadow' in style) {
// FF 3.5 & 3.6
property = 'MozBoxShadow';
}
}
return property;
}()),
beforeShow: function() {
var me = this,
style = me.el.dom.style,
shim = me.shim;
if (Ext.supports.CSS3BoxShadow) {
style[me.boxShadowProperty] = '0 0 ' + (me.offset + 2) + 'px #888';
} else {
style.filter = "progid:DXImageTransform.Microsoft.alpha(opacity=" + me.opacity + ") progid:DXImageTransform.Microsoft.Blur(pixelradius=" + (me.offset) + ")";
}
// if we are showing a shadow, and we already have a visible shim, we need to
// realign the shim to ensure that it includes the size of target and shadow els
if (shim) {
shim.realign();
}
},
/**
* Sets the opacity of the shadow
* @param {Number} opacity The opacity
*/
setOpacity: function(opacity){
var el = this.el;
if (el) {
if (Ext.isIE && !Ext.supports.CSS3BoxShadow) {
opacity = Math.floor(opacity * 100 / 2) / 100;
}
this.opacity = opacity;
el.setOpacity(opacity);
}
}
});