CSS为我们提供了z-index属性来控制DOM元素在浏览器中的层级关系,理论上,我们可以随意设置元素的覆盖关系,但在IE6下,无论我们怎么设置z-index,都无法使用DIV遮挡住select元素,这一Bug困扰了很多前端开发人员。例如之前我做弹出层的时候,在IE6下我不得不将可能出现"冲突"的select元素做额外的隐藏/显示工作,虽然不会影响程序的使用,但细心的用户肯定会觉得这一处理很怪异。
除了我上面提到的程序主动隐藏"冲突"的select元素的解决方式,我们还可以将显示内容装入到一个iframe中,iframe是可以遮挡住select的。但我个人觉得这样处理比较麻烦,所以多数时候我还是宁愿选择第一种解决方式。但现在有个好消息是,我找到了一种更优雅的方式。首先你可以查看示例(解决IE6下select遮盖问题)。
上面示例中有两个显示按钮,点击"非JS处理显示"的按钮,我们可以看到我上面描述的IE6下的Bug,DIV被select遮挡了。而点击"JS处理下显示"的按钮,我们可以看到没有被遮挡。
此解决方式的原理是,在页面创建一个大小、位置和蓝色边框容器一致的空的iframe,并让此iframe的z-idnex位于蓝色边框容器之下。我猜测这可能跟IE6下元素渲染有关系,你可以尝试下将创建的iframe的位置和蓝色容器的位置形成一定的偏差,你会发现只有iframe和蓝色边框容器相交的地方才不会被select遮挡,区域之外的依然被遮挡(你会看到select有一半遮挡,一半不遮挡的奇妙现象)。
下面提供一个JQ的plugin来完成此操作,如果你不使用JQ,根据上面的原理,自己动手也很容易。
- ;(function($){
- $.fn.extend({
- fixZindex : function(options){
- return $(this).each(function(){
- var $this = $(this);
- var _this = this;
- //ie6
- if($.browser.version=="6.0"&&$.browser.msie){
- //hide
- if(options == "hide"){
- $this.prev("iframe").remove();
- $this.hide();
- return;
- }
- //show
- $this.fixZindex("hide");
- var $iframe = $("<iframe src='about:blank'></iframe>").insertBefore($this);
- $this.show();
- var _pos = $this.offset();
- $iframe.css({
- width:$this.outerWidth(),
- height:$this.outerHeight(),
- position:"absolute",
- left:_pos.left,
- top:_pos.top,
- opacity:0
- });
- }
- //not ie6
- else {
- //hide
- if(options == "hide"){
- $this.hide();
- return;
- }
- //show
- $this.show();
- }
- });
- }
- });
- })(jQuery);
PS:flash遮挡DIV的问题并非此bug,可以通过设置flash的wmode属性(opaque或者tansparent),然后就可以通过z-index来控制覆盖关系了。