Z-индекс не работает правильно - PullRequest
6 голосов
/ 01 марта 2011

Страница в вопросе:

http://meyers.ipalaces.org/sitemap/

Первый <LI> должен быть z-index: 2; и должен располагаться поверх любого другого <LI> ниже. (Meyers)

CSS:

.sitemap #primaryNav > ul > li {
    float: none;
    background: #ffffff url('images/L1-left.png') center bottom no-repeat;
    z-index: 2;
    position: relative;
}

Идея состоит в том, что цвет фона #fff должен быть поверх <LI> ниже, поэтому создается эффект, подобный следующему:

http://astuteo.com/slickmap/demo/

если вы используете firebug по вышеуказанной ссылке и отключаете position:relative с #primaryNav #home Вы увидите, что это похоже на мое. Я не уверен, как заставить их быть похожими на них.

Ответы [ 4 ]

8 голосов
/ 10 марта 2011

Первое, что я хотел бы отметить, это то, что в вашем случае «home» не является источником в карте сайта. Хотя это может показаться визуально, семантически это не так. SlickMap понимает это (или, может быть, им просто повезло), поэтому в их html «home» li находится на том же уровне, что и другие основные страницы. Единственное, что находится над остальными страницами, это root, у которого нет страницы (хотя большинство людей перенаправляют root на «домашнюю страницу»).

Во-вторых, как только родительский z-index установлен, если дочерний элемент не установлен на position: absolute, а родительский не установлен на position: relative, все дочерние элементы считаются start один уровень выше родителя в отношении порядка размещения. Это определено в стандарте CSS 2.1 в 9.9.1 Указание уровня стека: свойство 'z-index' as (выделено мной):

Порядок, в котором дерево рендеринга нарисовано на холсте, описывается в терминах стековых контекстов. Контексты стека могут содержать дополнительные контексты стека . Контекст стекирования является атомарным с точки зрения его родительского контекста стекирования; блоки в других контекстах стека могут не находиться между какими-либо из его блоков.

Итак, пока SlickMap смог сказать вам:

Первый <LI> должен быть z-index: 2; и должен быть поверх любого другого <LI> дальше вниз.

В вашем дизайне это не имеет значения, поскольку перемещение первого li вверх перемещает всех его детей. И, поскольку дети в вашем домашнем блоке начинают свой собственный контекст наложения на один уровень выше, чем родительский, ваш «домашний» ли никогда не может быть выше элементов внутри него.

Теперь, когда это не так. Я рассмотрел ваш код с кодом SlickMap , чтобы понять различия. Как вы можете видеть ниже, здесь есть только один разумный вариант, который будет на 100% совместимым.

z-index поддерживает отрицательные числа, но, поскольку контекст суммирования отличается от «дома» и его братьев и сестер, вы не можете использовать это здесь. Однако, если для каждого дочернего элемента «home» было установлено значение position: absolute, а для «home» li было установлено значение position: static (по умолчанию), в некоторых случаях можно использовать z-index: -1 для этих дочерних элементов и сделать они, кажется, позади родителя. Но у вас должны быть доступны и другие переменные (например, прозрачность фона родителя родителя) И , что наиболее важно, вам нужно будет расположить каждого потомка вручную. Очевидно, что это не очень хорошая идея. Не говоря уже о негативах в z-index глючит в IE6 / 7.

Что вам нужно сделать, как и SlickMap , объединить первое ul в li, содержащее "home", с ul.level--0. Это приведет к следующей иерархии:

ul
--Home
--Meyers
    --Another Level
--M....
    --Another Level
--etc

Тогда вы сможете применить z-index: 2 к «дому» li, и вы получите результат, который вы ищете. Очевидно, что изменение структуры, скорее всего, потребует и других изменений ваших стилей.

Вероятно, есть несколько способов, которыми свойства CSS 3 могут помочь вам, но я не хочу вдаваться в подробности, так как не уверен в ваших требованиях.

Надеюсь, что этот урок в CSS strcutres макета был достаточно полезным, чтобы вы могли принять взвешенное решение о том, как двигаться дальше в вашем проекте. Если у вас есть дополнительные вопросы по поводу того, что я сказал, просто дайте мне знать.

6 голосов
/ 08 марта 2011

Позиционирование и z-index бесполезны, если <li>, который вы пытаетесь вывести на верхний слой, фактически переносит с ним всю карту сайта. *

Посмотрите наисточник вашей страницы рядом с кодом Astuteo.Есть пара мест, в которых вы ДЕЙСТВИТЕЛЬНО изменили разметку:

Astuteo:     <ul id="primaryNav"> /* using natural block tags */
Meyers: <div id="primaryNav"><ul class="level--0"> /* wrapping without need */

Astuteo:      <li id="home"><a href....>Home</a></li> /* CLOSED li (immediately) */
*Meyers:  <li><a href...>Home</a>...the entire sitemap...</li> /* you wrapped the entire site map inside your first <li> */

Ваше желаемое решение по существу отражает исходный код.Перезапись или копирование / вставка в этот момент, вероятно, займет меньше времени, чем отслеживание оставшихся ошибок в модификации синтаксиса и / или в стратегии размещения.

РЕДАКТИРОВАТЬ : вы пробовали что-то простоекак ... удаление свойства background для первого ребенка в доме?

<ul class="level--1">
    <li style="background: none">...

Это было бы что-то вроде этого в вашем CSS (чтобы ваш CSS не попал в ваш HTML):

.level--1 li:first-child { background:none; }
1 голос
/ 04 марта 2011

Ну, это заняло некоторое время, но я думаю, что оно у меня есть.Я должен сказать, что мое чувство Spidey было на высоком из-за того, что страница не проверяет .

Это на самом деле не проблема z-index, так как вы используете стороннюю(и самый превосходный!) фреймворк для стиля HTML - SlickMap CSS , который должен работать так, как рекламируется.

Проблема не в недопустимой разметке, хотя ее следует исправить независимо.А именно, что отсутствуют теги </li>, есть недопустимый <br> в атрибутах utilityNav и дубликаты идентификатора в главном primaryNav.

Проблема в том, что вы ввели дополнительный <ul>уровни и правила CSS просто больше не соответствуют правильным элементам.Требуется ли это по какой-либо причине?Я вижу, что это попыталось исправить, добавив дочерние селекторы в ваш CSS, но разметка радикально отличается от того, что ожидает фреймворк, и, следовательно, стекирование z-индекса неверно.

При минимальном<ul> эта демонстрация работает, как и ожидалось, поскольку HTML-код корректен для SlickMap CSS.Поэтому я попытался бы удалить лишние <ul> уровни из вашей разметки и имитировать разметку на демонстрационной странице SlickMap или моей скрипке.

Надеюсь, это поможет:)

0 голосов
/ 01 марта 2011

Родитель должен иметь положение относительно, чтобы получить надлежащий контекст стекирования z-index.Очень непонятно, но, может быть, это подойдет вам?

Попробуйте прочитать эту ссылку, чтобы лучше понять (супер непонятно, нет вашей вины) метод определения приоритета стека элементов DOM:

https://developer.mozilla.org/En/Understanding_CSS_z-index/The_stacking_context

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...