The question couldn't be easier. The z-index values are assigned by style=...
or className
, with Javascript or not. I don't think it matters. How do I find (with Javascript) the highest z-index? (The element it's used in would be nice, but not necessary.)
You can't use the (new) querySelector, because it doesn't query CSS values. Is there someway to query CSS? (Not the stylesheets, but the actual used values.)
Grazi
Get top 5 elements + z-indexes:
Array.from(document.querySelectorAll('*')).map(el => [el, getComputedStyle(el).zIndex]).filter(v => !isNaN(parseInt(v[1]))).sort((a, b) => b[1] - a[1]).slice(0, 5)
The maximum range is ±2147483647. In CSS code bases, you'll often see z-index values of 999, 9999 or 99999.
z-index defines which positioned element appears on top (Sort of like layers). So z-index: 1000 would appear on top of a z-index 999 . Doing z-index: 1001 is an an attempt to appear "on top" of a item with z-index: 1000.
The z-index property can be specified with an integer value (positive, zero, or negative), which represents the position of the element along the z-axis. If you are not familiar with the z-axis, imagine the page as a stack of layers, each one having a number.
The z-index property determines the stack level of an HTML element. The “stack level” refers to the element's position on the Z axis (as opposed to the X axis or Y axis). A higher value means the element will be closer to the top of the stacking order. This stacking order runs perpendicular to the display, or viewport.
It's not as simple as finding the element with the highest z-index. Stacking order also depends on tree relationship, so if a static positioned element with the most z-index explicitly set, and if your code retrieved that, it would be useless since z-index is useless on static positioned elements.
In addition, IE's stacking order rules are completely broken so you would have to account for that as well. And you may have to account for iframe/select elements in IE pre 8/9 since they have more stacking order priority than any other nodes.
This would probably be useful: http://www.w3.org/TR/CSS21/zindex.html
You'd have to follow all of those and account for IE bugs in order to have a consistent method of getting the element with the most stacking order priority.
This is a modified version of kennebec's/Pravens code which finds the highest z-index within a stacking context. This version also takes opacity into account.
If all you're looking for is to position an element on top of everything else in the page, simply call highZ(document.body) or just highZ(). It finds the highest z-index of the root stacking context which will do exactly that.
elements with an opacity value less than 1 start a new stacking context. If an element with opacity less than 1 is not positioned, implementations must paint the layer it creates, within its parent stacking context, at the same stacking order that would be used if it were a positioned element with ‘z-index: 0’ and ‘opacity: 1’. If an element with opacity less than 1 is positioned, the ‘z-index’ property applies as described in [CSS21], except that ‘auto’ is treated as ‘0’ since a new stacking context is always created.
function highZ(parent, limit){
limit = limit || Infinity;
parent = parent || document.body;
var who, temp, max= 1, opacity, i= 0;
var children = parent.childNodes, length = children.length;
while(i<length){
who = children[i++];
if (who.nodeType != 1) continue; // element nodes only
opacity = deepCss(who,"opacity");
if (deepCss(who,"position") !== "static") {
temp = deepCss(who,"z-index");
if (temp == "auto") { // positioned and z-index is auto, a new stacking context for opacity < 0. Further When zindex is auto ,it shall be treated as zindex = 0 within stacking context.
(opacity < 1)? temp=0:temp = highZ(who);
} else {
temp = parseInt(temp, 10) || 0;
}
} else { // non-positioned element, a new stacking context for opacity < 1 and zindex shall be treated as if 0
(opacity < 1)? temp=0:temp = highZ(who);
}
if (temp > max && temp <= limit) max = temp;
}
return max;
}
function deepCss(who, css) {
var sty, val, dv= document.defaultView || window;
if (who.nodeType == 1) {
sty = css.replace(/\-([a-z])/g, function(a, b){
return b.toUpperCase();
});
val = who.style[sty];
if (!val) {
if(who.currentStyle) val= who.currentStyle[sty];
else if (dv.getComputedStyle) {
val= dv.getComputedStyle(who,"").getPropertyValue(css);
}
}
}
return val || "";
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With