2009-07-13 30 views
46

Để đặt div chứa hình ảnh văn bản trong suốt làm chỉ mục z cao nhất trong tài liệu của tôi, tôi đã chọn số 10.000 và nó đã giải quyết được sự cố của tôi.Bạn có thể tìm ra chỉ mục z cao nhất trong tài liệu của mình bằng cách nào?

Trước đây tôi đã đoán với số 3 nhưng nó không có hiệu lực.

Vì vậy, có cách nào khoa học hơn để tìm hiểu z-index nào cao hơn so với tất cả các yếu tố khác của bạn không?

Tôi đã thử tìm số liệu này trong Firebug nhưng không thể tìm thấy nó.

+0

Lưu ý rằng việc tìm kiếm các z-index lớn nhất là không chính xác liên quan, nhưng nó sẽ làm việc. Những gì bạn cần là chỉ số z lớn nhất của các yếu tố đó tạo thành một bối cảnh xếp chồng nằm trong cùng một bối cảnh xếp chồng như phần tử bạn đang cố gắng đặt. Nói cách khác, nếu bạn tìm thấy một phần tử là 'vị trí: tương đối; z-index: 10000; 'bên trong một phần tử là' vị trí: tương đối; z-index: 100; ', sau đó số bạn cần đánh bại là 100, không phải là 10.000. –

+0

z-index basic: http://stackoverflow.com/a/32515284/3597276 –

Trả lời

25

Bạn có thể gọi findHighestZIndex cho một loại nguyên tố đặc biệt chẳng hạn như 'DIV' như sau:

findHighestZIndex('div'); 

giả định findHighestZindex chức năng được định nghĩa như thế này:

function findHighestZIndex(elem) 
{ 
    var elems = document.getElementsByTagName(elem); 
    var highest = 0; 
    for (var i = 0; i < elems.length; i++) 
    { 
    var zindex=document.defaultView.getComputedStyle(elems[i],null).getPropertyValue("z-index"); 
    if ((zindex > highest) && (zindex != 'auto')) 
    { 
     highest = zindex; 
    } 
    } 
    return highest; 
} 
+0

Giải quyết vấn đề thiếu IE của getComputedStyle http://erik.eae.net/archives/2007/07/27/18.54.15/ –

+0

Tại sao bạn giới hạn nó thành một loại phần tử? –

+1

@ChristopherJamesCalo, nó là một giải pháp chung. Nếu bạn sử dụng '*' làm đối số của 'findHighestZIndex', nó sẽ nhận được cho tất cả các phần tử. – user2064000

4

Không có thuộc tính mặc định hoặc bất cứ điều gì, nhưng bạn có thể viết một số javascript để lặp qua tất cả các phần tử và tìm ra. Hoặc nếu bạn sử dụng một thư viện quản lý DOM như jQuery, bạn có thể mở rộng các phương thức của nó (hoặc tìm hiểu xem nó có hỗ trợ nó hay không) để nó bắt đầu theo dõi phần tử z-index từ tải trang, và sau đó nó trở nên tầm thường để lấy giá trị z cao nhất mục lục.

4

Cách tốt nhất để giải quyết vấn đề này, theo ý kiến ​​của tôi, chỉ cần đặt ra các quy ước cho các loại z-index es được sử dụng cho các loại yếu tố khác nhau. Sau đó, bạn sẽ tìm thấy đúng z-index để sử dụng bằng cách xem lại tài liệu của mình.

+0

Mặc dù tôi đồng ý đây là phương pháp hay nhất và có thể trợ giúp trong hầu hết các trường hợp, việc này không giúp ích nếu bạn đang tạo plugin hoặc tập lệnh có thể chạy trên trang không xác định nơi tập lệnh của bạn không thuộc về quy ước z-index được sử dụng. (xin lỗi để bình luận về bài viết 9 tuổi của bạn.) – Micah

3

Tôi tin rằng những gì bạn đang quan sát là Voodoo. Nếu không có quyền truy cập vào bảng phong cách hoàn chỉnh của bạn, tôi có thể tất nhiên không nói một cách đáng tin cậy; nhưng nó đánh tôi như khả năng những gì thực sự đã xảy ra ở đây là bạn đã quên rằng chỉ các yếu tố vị trí bị ảnh hưởng bởi z-index.

Ngoài ra, z-index es không được chỉ định tự động, chỉ trong các biểu định kiểu, điều này có nghĩa là không có các yếu tố khác z-index ed, z-index:1; sẽ nằm trên mọi thứ khác.

+0

Tôi sẽ mở rộng đoạn thứ hai của bạn để giải thích rằng chỉ có một giá trị 'z-index' của <> 0 và không phải' tự động', thực sự tạo một xếp mới bối cảnh. –

36

Trộm cắp một số mã từ trang web abcoder vì lợi ích của sự rõ ràng:

var maxZ = Math.max.apply(null, 
    $.map($('body *'), function(e,n) { 
     if ($(e).css('position') != 'static') 
     return parseInt($(e).css('z-index')) || 1; 
    })); 
+0

điều này có vẻ là phương pháp ngắn nhất và hiệu quả nhất để nhận chỉ mục z mà tôi đã thấy cho đến thời điểm này. – ThatGuy

+9

Trang abcoder đề cập rằng '$ ('body> *')' được sử dụng để chỉ lấy các phần tử cấp cao nhất, nhưng đối với câu trả lời này, nó phải là '$ ('body *')' để tất cả các phần tử được chụp . –

+0

Câu trả lời duy nhất tôi đã tìm thấy không giới hạn ở mức tối đa cho một loại phần tử nhất định. Tôi muốn chỉ số z của tôi cao hơn * tất cả * các chỉ mục z khác và đây là một đá quý. – ProfK

4

Tôi đoán bạn phải làm điều này cho mình ...

function findHighestZIndex() 
{ 
    var divs = document.getElementsByTagName('div'); 
    var highest = 0; 
    for (var i = 0; i < divs .length; i++) 
    { 
     var zindex = divs[i].style.zIndex; 
     if (zindex > highest) { 
      highest = zindex; 
     } 
    } 
    return highest; 
} 
+2

Ngoại trừ, tất nhiên, rằng * bất kỳ * yếu tố nào có thể được định vị và lập chỉ mục z, không chỉ các div. –

+4

Vấn đề là 'element.style.zIndex' không tìm thấy chỉ mục z được đặt trong biểu định kiểu ngoài. Google cho 'getComputedStyle' để tìm những cái đó. – Boldewyn

0

Sử dụng jQuery:

nếu không có yếu tố cung cấp, nó sẽ kiểm tra tất cả các yếu tố này.

function maxZIndex(elems) 
{ 
    var maxIndex = 0; 
    elems = typeof elems !== 'undefined' ? elems : $("*"); 

    $(elems).each(function(){ 
         maxIndex = (parseInt(maxIndex) < parseInt($(this).css('z-index'))) ? parseInt($(this).css('z-index')) : maxIndex; 
         }); 

return maxIndex; 
} 
+0

Tại sao không sử dụng Math.max()? –

0

xem xét mã này mà bạn có thể sử dụng như là một thư viện: getMaxZIndex

+1

* Liên kết chỉ * câu trả lời là lame, chúng tôi là lập trình viên, vì vậy hãy cho chúng tôi mã! (Nếu GitHub không hoạt động kinh doanh, bạn ở một mình với sự "cân nhắc" của bạn). ** Và **, "thư viện" được liên kết của bạn chưa hoàn thành ... 'z-index' chỉ hoạt động trên các phần tử có giá trị' vị trí' được đặt thành một thứ khác ngoài 'tĩnh'. – yckart

2

Tôi muốn thêm tôi thực hiện ECMAScript 6 mà tôi sử dụng trong một trong userscripts tôi. Tôi đang sử dụng cái này để xác định chỉ mục z của các phần tử cụ thể để chúng luôn xuất hiện cao nhất. Tôi có thể loại trừ các yếu tố này bằng bộ chọn bị chặn :not.

var highestZIndex=0; 

// later, potentially repeatedly 
highestZIndex=Math.max(highestZIndex,...[...document 
    .querySelectorAll('body *:not([data-highest]):not(.yetHigher)') 
].map(a=>parseFloat(getComputedStyle(a).zIndex)) 
    .filter(a=>!isNaN(a))); 

Bốn dòng thấp hơn có thể chạy nhiều lần và cập nhật các biến highestZIndex lặp đi lặp lại bằng cách tìm hiểu tối đa giữa giá trị hiện tại highestZIndex và tất cả các tính toán z-chỉ số khác của tất cả các yếu tố này. filter không bao gồm tất cả các giá trị "auto".

+1

Bạn có thể dịch điều này sang javascript đơn giản. :) –

+0

Tại sao câu trả lời này được thay đổi thành cú pháp TypeScript ?! Câu hỏi này không phải về TypeScript. Nếu bạn muốn triển khai TypeScript, hãy thêm câu trả lời của riêng bạn. Đây là mã ES6 đang hoạt động. – Xufox

1

Tôi phải làm điều này cho một dự án gần đây, và tôi thấy rằng tôi đã hưởng lợi rất nhiều từ câu trả lời tuyệt vời của @Philippe Gerber ở đây và câu trả lời tuyệt vời của @flo (câu trả lời được chấp nhận).

Sự khác biệt chìa khóa dẫn đến câu trả lời nêu trên là:

  • Cả CSS z-index, và bất kỳ inline z-index phong cách được tính toán và sử dụng lớn hơn của hai để so sánh và tính toán.
  • Giá trị bị ép buộc thành số nguyên và bất kỳ giá trị chuỗi nào (auto, static, v.v ...) đều bị bỏ qua.

Here là một CodePen cho ví dụ mã, nhưng nó cũng được bao gồm ở đây.

(() => { 
 
    /** 
 
    * Determines is the value is numeric or not. 
 
    * See: https://stackoverflow.com/a/9716488/1058612. 
 
    * @param {*} val The value to test for numeric type. 
 
    * @return {boolean} Whether the value is numeric or not. 
 
    */ 
 
    function isNumeric(val) { 
 
    return !isNaN(parseFloat(val)) && isFinite(val); 
 
    } 
 

 
    
 
    /** 
 
    * Finds the highest index in the current document. 
 
    * Derived from the following great examples: 
 
    * [1] https://stackoverflow.com/a/1118216/1058612 
 
    * [2] https://stackoverflow.com/a/1118217/1058612 
 
    * @return {number} An integer representing the value of the highest z-index. 
 
    */ 
 
    function findHighestZIndex() { 
 
    let queryObject = document.querySelectorAll('*'); 
 
    let childNodes = Object.keys(queryObject).map(key => queryObject[key]); 
 
    let highest = 0; 
 
    
 
    childNodes.forEach((node) => { 
 
     // Get the calculated CSS z-index value. 
 
     let cssStyles = document.defaultView.getComputedStyle(node); 
 
     let cssZIndex = cssStyles.getPropertyValue('z-index'); 
 
     
 
     // Get any inline z-index value. 
 
     let inlineZIndex = node.style.zIndex; 
 

 
     // Coerce the values as integers for comparison. 
 
     cssZIndex = isNumeric(cssZIndex) ? parseInt(cssZIndex, 10) : 0; 
 
     inlineZIndex = isNumeric(inlineZIndex) ? parseInt(inlineZIndex, 10) : 0; 
 
     
 
     // Take the highest z-index for this element, whether inline or from CSS. 
 
     let currentZIndex = cssZIndex > inlineZIndex ? cssZIndex : inlineZIndex; 
 
     
 
     if ((currentZIndex > highest)) { 
 
     highest = currentZIndex; 
 
     } 
 
    }); 
 

 
    return highest; 
 
    } 
 

 
    console.log('Highest Z', findHighestZIndex()); 
 
})();
#root { 
 
    background-color: #333; 
 
} 
 

 
.first-child { 
 
    background-color: #fff; 
 
    display: inline-block; 
 
    height: 100px; 
 
    width: 100px; 
 
} 
 

 
.second-child { 
 
    background-color: #00ff00; 
 
    display: block; 
 
    height: 90%; 
 
    width: 90%; 
 
    padding: 0; 
 
    margin: 5%; 
 
} 
 

 
.third-child { 
 
    background-color: #0000ff; 
 
    display: block; 
 
    height: 90%; 
 
    width: 90%; 
 
    padding: 0; 
 
    margin: 5%; 
 
} 
 

 
.nested-high-z-index { 
 
    position: absolute; 
 
    z-index: 9999; 
 
}
<div id="root" style="z-index: 10"> 
 
    <div class="first-child" style="z-index: 11"> 
 
    <div class="second-child" style="z-index: 12"></div> 
 
    </div> 
 
    <div class="first-child" style="z-index: 13"> 
 
    <div class="second-child" style="z-index: 14"></div> 
 
    </div> 
 
    <div class="first-child" style="z-index: 15"> 
 
    <div class="second-child" style="z-index: 16"></div> 
 
    </div> 
 
    <div class="first-child" style="z-index: 17"> 
 
    <div class="second-child" style="z-index: 18"> 
 
     <div class="third-child" style="z-index: 19"> 
 
     <div class="nested-high-z-index">Hello!!! </div> 
 
     </div> 
 
    </div> 
 
    </div> 
 
    <div class="first-child"> 
 
    <div class="second-child"></div> 
 
    </div> 
 
    <div class="first-child"> 
 
    <div class="second-child"></div> 
 
    </div> 
 
    <div class="first-child"> 
 
    <div class="second-child"></div> 
 
    </div> 
 
</div>

2

Sử dụng ES6 một cách tiếp cận sạch

function maxZIndex() { 

    return Array.from(document.querySelectorAll('body *')) 
      .map(a => parseFloat(window.getComputedStyle(a).zIndex)) 
      .filter(a => !isNaN(a)) 
      .sort() 
      .pop(); 
} 
Các vấn đề liên quan