icloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsapp
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
237 lines
7.0 KiB
9 years ago
|
/**
|
||
|
* 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);
|
||
|
}
|
||
|
}
|
||
|
});
|