macoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangoutsslackgmailskypefacebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-services
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
/** |
|
* 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); |
|
} |
|
} |
|
}); |