问题在于jQuery-UI 对话框创建了一个新的堆叠上下文,因此z-index
对#content
元素的更改只会相对于它当前的堆叠上下文显示。
为了证明,添加以下 css,您仍然会 在对话框上方#content
看到div 显示,它有一个of . --> 即Z 索引不是绝对的!... jsFiddlez-index
100
#content { z-index: 0 !important; }
从没有人告诉你关于 Z-Index 的内容:
每个堆叠上下文都有一个 HTML 元素作为其根元素。当在元素上形成新的堆叠上下文时,该堆叠上下文将其所有子元素限制在堆叠顺序中的特定位置。这意味着如果一个元素包含在堆叠顺序底部的堆叠上下文中,则无法让它出现在堆叠顺序更高的不同堆叠上下文中的另一个元素之前,即使使用z-index 十亿!
可以通过以下三种方式之一在元素上形成新的堆叠上下文:
- 当一个元素是文档的根元素时(元素)
- 当一个元素的位置值不是 static 并且 z-index 值不是 auto 时
- 当元素的不透明度值小于 1 时
问题是Bootstrap Tour并没有很好的方法来识别这一点。当他们开始对某个元素进行游览时,他们会应用:
- 全屏黑色
tour-backdrop
,z-index 为1009
,
tour-step-background
对象后面的白色,z-index 为1010
- 并将 z-index 应用于的当前游览元素
1011
...但最后一个z-index
没有效果,因为我们的对象已经在堆栈上下文中。它只是位于该堆栈中的任何其他元素(它已经是)的上方。顺便说一句,这就是为什么删除z-index
fromui-front
会产生正确的外观,因为它会将元素从当前堆栈中释放出来。
这是 Bootstrap Tours应该做的,我们将手动操作 DOM。
问题是他们试图使用 z-indexes 相对于彼此定位元素,但是只要游览对象处于与 and 不同的堆叠上下文中.tour-step-background
,.tour-backdrop
这就会失败。
解决方案?将您生成的元素放在同一个堆叠上下文中!
这是一个简化的标记树
为了覆盖它,我们将插入到 toursonShown
方法并自己移动背景:
在JavaScript中,创建游览时,我们将执行以下操作:
var t = new Tour({
backdrop: true,
onShown: function(tour) {
var stepElement = getTourElement(tour);
$(stepElement).after($('.tour-step-background'));
$(stepElement).after($('.tour-backdrop'));
}
});
function getTourElement(tour){
return tour._steps[tour._current].element
}
这使用 jQuery 的.after()
DOM 操作将背景移动到与我们的游览对象相同的堆叠上下文中。
此外,我们需要将两个游览背景元素定位为fixed
而不是absolute
,这样它们就不会试图挤进我们的对话框中。我们可以使用以下CSS来做到这一点:
.tour-step-background,
.tour-backdrop {
position: fixed;
}
应该是这样的: