По похожему случаю я уже писал в саппорт мозиллки, и там мне сказали, что это не баг, а очень даже по спецификации.
В случае, если у элемента opacity меньше 1, браузер обязан создавать для него rendering context, таким образом, элемент оказывается как бы «над» остальными в новом слое. Это не те слои, в которые выносятся элементы с position: relative, а, скорее, те, которые представляет из себя элементы с float.
Решается все это достаточно тривально.
- можно задать второму элементу opacity=.99999999999999;
- можно задать второму элементу position: relative, а первому не задавать;
- можно задать обоим элементам position: relative (если этого не хватит, не помню точно, второму — z-index больше).