Фильтр SVG в Firefox ломает z-индекс

Я создаю меню с вкладками с изображениями SVG в качестве фона. Мне нужно, чтобы вкладки перекрывали друг друга в обратном порядке - первая над второй, вторая над третьей. И мне нужна тень svg, чтобы работать в Firefox.

Однако, когда я применяю тень, z-индекс элемента .after нарушается, что нарушает перекрытие. Есть ли способ изменить порядок укладки/исправить это? Вот пример источника:

div{
    background-color: grey;
    padding-top:20px;
    padding-bottom: 20px;
}
ul.tabs-nav{
	margin: 0px;
	padding: 0px;
	list-style-type: none;
	margin-left: 10px;
	height: 40px;
	overflow: hidden;
}
ul.tabs-nav li{
	margin: 0px -38px 0px 0px;
	padding: 0px;
	display: block;
	float: left;
	text-decoration: none;
	filter: url("#drop-shadow");
}
ul.tabs-nav li a{
	background-color: #5d6c7a;
	text-decoration: none;
	height:40px;
	line-height: 40px;
	float:left;
	color: white;
	font-size: 14px;
	vertical-align: baseline;
	padding-left: 10px;
	padding-right: 10px;
}

ul.tabs-nav span.before{
	background-image: url("https://dl.dropboxusercontent.com/u/10056766/fiddle/tab_grey.svg");
    background-position: left top;
	display: block;
	float: left;
	height: 40px;
	width: 40px;
	position: relative;		
}

ul.tabs-nav span.after{
	background-image: url("https://dl.dropboxusercontent.com/u/10056766/fiddle/tab_grey.svg");
    background-position: right top;
	display: block;
	float: left;
	height: 40px;
	width: 40px;
	position: relative;
	z-index:1;
}

ul.tabs-nav li:first-child span.before{
	background-image: url("https://dl.dropboxusercontent.com/u/10056766/fiddle/tab_white.svg");
    background-position: left top;
	display: block;
	float: left;
	height: 40px;
	width: 40px;
	position: relative;		
}

ul.tabs-nav li:first-child span.after{
	background-image: url("https://dl.dropboxusercontent.com/u/10056766/fiddle/tab_white.svg");
    background-position: right top;
	display: block;
	float: left;
	height: 40px;
	width: 40px;
	position: relative;
	z-index:1;
}

ul.tabs-nav li:first-child a{
    background-color: white;
    color: black;
}
<div>
<ul class="tabs-nav" style="padding: 0;">

	<li style="z-index: 10;" class="tab
	tabs-active
	"><span class="before"></span><a href="/foo.jsp" class="">User</a><span class="after"></span></li>
	<li style="z-index: 8;" class="tab
	"><span class="before"></span><a href="/foo.jsp" class="">Developer</a><span class="after"></span></li>
	<li class="tab
	"><span class="before"></span><a href="/foo.jsp" class="">Users</a><span class="after"></span></li>
	<li class="tab
	"><span class="before"></span><a href="/foo.jsp" class="">Roles</a><span class="after"></span></li>
	<li class="tab
	"><span class="before"></span><a href="/foo.jsp" class="">Attributes</a><span class="after"></span></li>
	<li class="tab
	"><span class="before"></span><a href="/foo.jsp" class="">Screens</a><span class="after"></span></li>
	<li class="tab
	"><span class="before"></span><a href="/foo.jsp" class="">Locales</a><span class="after"></span></li>
	<li class="tab
	"><span class="before"></span><a href="/foo.jsp" class="">Providers</a><span class="after"></span></li>
	</ul>
    
</div>

<svg height="0" xmlns="http://www.w3.org/2000/svg">

<filter id="drop-shadow">

<feGaussianBlur in="SourceAlpha" stdDeviation="2.2"/>

<feOffset dx="12" dy="2" result="offsetblur"/>

<feFlood flood-color="rgba(0,0,0,0.2)"/>

<feComposite in2="offsetblur" operator="in"/>

<feMerge>

<feMergeNode/>

<feMergeNode in="SourceGraphic"/>

</feMerge>

</filter>

</svg>

http://jsfiddle.net/mark_bacon/5vnefef5/3/

Отключите фильтр элемента li, и вы увидите, как это должно выглядеть.


person kvgr    schedule 22.12.2014    source источник


Ответы (1)


Свойство filter создает контекст стека CSS. Это означает, что свойство z-index любых дочерних элементов будет контролировать только то, как дочерний контент укладывается друг с другом, а не то, как они укладываются относительно других элементов на странице.

Вы применяете filter к своим li элементам, но вы применяете z-index к дочерним промежуткам. Это поднимет эти промежутки над другим содержимым в li, но все содержимое в элементе списка будет сведено в один слой перед тем, как будет объединено с остальной частью страницы. И поскольку вы не устанавливаете значение z-index для самого li, применяется порядок стека по умолчанию. Другими словами, элементы, расположенные позже в документе, рисуются поверх.

В этом примере происходит много всего, но я почти уверен, что вы можете получить желаемый эффект, просто установив z-index:1 на самом li:first-child.

person AmeliaBR    schedule 22.12.2014
comment
Спасибо за объяснение. Я заблудился в порядке укладки. Но я добавил position:relative для каждого элемента li и уменьшил значения z-index для вкладок от первого до последнего. Теперь все работает отлично. - person kvgr; 23.12.2014
comment
Здравствуйте Амелия. Я читал этот ответ несколько раз, я знал все это до того, как прочитал его, но все же я НЕ ПОНИМАЮ, почему элемент на моем сайте не работает. Мне очень жаль, что я спрашиваю все это в комментариях, но вы моя последняя надежда :) suez/pen/3d49b2d6681dac2d87984aa57e55d503 - вот ручка, и на первой странице у меня есть .scroll-down белый круг с фиксированной позицией и его родительский элемент с фильтром SVG (клейкий эффект). В Chrome/IE все отлично работает, но в FF этот элемент невидим. Я пробовал все, все возможные комбинации z-index. Можно ли это исправить в ФФ? :( - person Nikolay Talanov; 27.04.2015
comment
Получается, что: 1) Если SVG с определением фильтра внутри имеет display: none в FF, то потомок элемента с примененным фильтром не будет виден ни при каких условиях. Но вы сможете щелкнуть по нему, как будто его z-индекс в порядке. 2) И как бы вы ни старались, вы не сможете увидеть и взаимодействовать с элементом, который имеет position: fixed внутри элемента с фильтром svg, примененным в Firefox :( - person Nikolay Talanov; 27.04.2015
comment
@NikolayTalanov В прошлом у Firefox были проблемы, когда display:none мешал повторному использованию контента. Возможно, с фильтрами все еще проблемы. Может быть, попробовать абсолютное позиционирование CSS, чтобы скрыть ваше определение SVG, чтобы увидеть, была ли проблема в этом? В общем, в любом браузере, если есть ошибка в фильтре, фигура заменяется прозрачной областью, что вы и видите. Однако фильтры или маски не влияют на область щелчка события указателя, поэтому по нему все еще можно щелкнуть. - person AmeliaBR; 29.04.2015