好的伙计们,这里有一个棘手的问题(也许):有没有得到某种元素的“全局z指数”?这是我想做的一个例子:
给出两个元素引用,如何确定z顺序中的哪一个(假设它们可能没有分配z-indices或者在分隔的容器中)
精心制作黑客欢迎!不那么精细的方法更多而非欢迎。
答案 0 :(得分:2)
这是一个有趣的问题。以下代码可能没有错误。我现在就把它放在一起,并没有完全测试它。其目的是展示一种方法。
它比较了两个元素,并根据三个标准对它们进行测试:
查看每个元素的祖先树,如果元素A的第一个祖先具有z-index,则z-index比元素B的第一个祖先具有更大的z-index(如果有总共存在元素B),然后元素A在z顺序中更高。
否则,如果元素B是元素A的后代,则元素B具有更高的z顺序。
否则,查看元素A和元素B共有的最后一个祖先的兄弟姐妹,如果元素A的祖先在该共同祖先的子元素数组中首先出现,则元素B具有更高的z顺序。
可能有一种更简单的描述上述逻辑的方法,可以改进算法。 (例如,上面的第二次检查可以先完成。)但是,这是代码:
<html>
<head>
<script language="javascript">
function getAncestorsAsArray(element){
var arr = new Array();
arr.unshift(element);
while (arr[0].parentNode){
arr.unshift(arr[0].parentNode);
}
return arr;
}
function highestInitialZIndex(elementArr){
for (var i=0; i<elementArr.length; i++){
if (elementArr[i].style == undefined) continue;
var r = elementArr[i].style.zIndex;
if (!isNaN(r) && r!="") {
return r;
}
}
return undefined;
}
function findCommonAncestor(elementArr1, elementArr2){
var commonAncestor;
for (var i=0; i<elementArr1.length; i++){
if (elementArr1[i] == elementArr2[i]) {
commonAncestor = elementArr1[i];
}
}
return commonAncestor;
}
function findHighestAbsoluteIndex(element1, element2){
var arr1 = getAncestorsAsArray(element1);
var arr2 = getAncestorsAsArray(element2);
// Does an ancestor of one elment simply have a higher z-index?
var arr1Z = highestInitialZIndex(arr1);
var arr2Z = highestInitialZIndex(arr2);
if (arr1Z > arr2Z || (!isNaN(arr1Z) && isNaN(arr2Z))) return element1;
if (arr2Z > arr1Z || (!isNaN(arr2Z) && isNaN(arr1Z))) return element2;
// Is one element a descendent of the other?
var commonAncestor = findCommonAncestor(arr1, arr2);
if (commonAncestor == element1) return element2;
if (commonAncestor == element2) return element1;
// OK, which has the oldest common sibling? (Greater index of child node for an element = "older" child)
var indexOfCommonAncestor;
for (var i=0; i<arr1.length; i++){
if (arr1[i] == commonAncestor) {
indexOfCommonAncestor = i;
break;
}
}
for (var j=commonAncestor.childNodes.length; j>=0; j--){
if (arr1[indexOfCommonAncestor+1] == commonAncestor.childNodes[j]) return element1;
if (arr2[indexOfCommonAncestor+1] == commonAncestor.childNodes[j]) return element2;
}
}
function doTest(){
var e1 = document.getElementById("myDiv1");
var e2 = document.getElementById("myDiv2");
highest = findHighestAbsoluteIndex(e1, e2);
alert(highest.id);
}
</script>
</head>
<body onload="javascript:doTest();">
<div>
<div>
<div style="position:absolute; z-index:20;" id="myDiv1">
</div>
</div>
</div>
<div>
</div>
<div style="position:absolute; z-index:10;" id="myDiv2">
</div>
</body>
</html>
使用体内嵌套的div
来测试它是否有效。