Как определить самый высокий Z-индекс в вашем документе?

чтобы установить div, содержащий прозрачное текстовое изображение, как самый высокий Z-индекс в моем документе, я выбрал число 10,000, и это решило мою проблему.

раньше я угадал с номером 3, но это не имело никакого эффекта.

Итак, есть более научный способ выяснить, что Z-индекс выше, чем у всех остальных элементов?

Я попытался найти эту метрику в Firebug, но не смог ее найти.

11 ответов


можно назвать findHighestZIndex для определенного типа элемента, такого как "DIV", например:

findHighestZIndex('div');

предполагая, что findHighestZindex функция, которая определяется следующим образом:

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;
}

Кража некоторого кода с сайта abcoder для ясности:

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

использование ES6 более чистого подхода

function maxZIndex() {

     return Array.from(document.querySelectorAll('body *'))
           .map(a => parseFloat(window.getComputedStyle(a).zIndex))
           .filter(a => !isNaN(a))
           .sort()
           .pop();
}

лучший способ решить эту проблему, на мой взгляд, просто установить себе соглашения для каких видов z-indexes используются для различных видов элементов. Тогда вы найдете правильный z-index использовать, оглядываясь на вашу документацию.


Я считаю, что то, что вы наблюдаете, - это Вуду. Без доступа к вашей полной таблице стилей я, конечно, не могу сказать достоверно; но мне кажется вероятным, что на самом деле здесь произошло то, что вы забыли, что только расположенные элементы затронуты z-index.

кроме того, z-indexes не назначаются автоматически, только в таблицах стилей, что означает, что без других z-indexэлементы ed,z-index:1; будет на вершине все остальное.


Я думаю, что вы должны сделать это сами ...

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;
}

нет свойства по умолчанию или что-то еще, но вы можете написать некоторый javascript для цикла через все элементы и выяснить это. Или если вы используете библиотеку управления DOM, такую как jQuery, вы можете расширить ее методы (или узнать, поддерживает ли она его уже), чтобы она начала отслеживать Z-индексы элемента из загрузки страницы, а затем становится тривиальным получить самый высокий z-индекс.


Я хотел бы добавить мою реализацию ECMAScript 6, которую я использую в одном из моих UserScripts. Я использую это, чтобы определить z-index конкретных элементов, чтобы они всегда казались самыми высокими. Я могу исключить эти элементы с помощью chained :not селектор.

let highestZIndex = 0;

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

нижние пять строк могут работать несколько раз и обновлять переменную highestZIndex неоднократно, выясняя максимум между настоящее highestZIndex значение и все другие вычисленные Z-индексы все элементы. The filter исключает все "auto" значения.


Я должен был сделать это для проекта недавно, и я обнаружил, что я много выиграл от @Philippe Gerberотличный ответ здесь, и @floотличный ответ (принятый ответ).

ключевыми отличиями от ответов, упомянутых выше, являются:

  • оба CSS z-index, и встроенного z-index стиль рассчитываются, и использовать больший из двух Для сравнения и расчета.
  • значения приводятся в целых, и любые строковые значения (auto, static и т. д.) игнорируются.

здесь является CodePen для примера кода, но он также включен здесь.

(() => {
  /**
   * 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>

использование jQuery:

если нет элементов, он проверяет все элементы.

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;
}

рассмотрим этот код, который можно использовать как библиотеку: getMaxZIndex