`
代昊鑫
  • 浏览: 19803 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IE 9渲染overflow-x的bug及解决

阅读更多

  在最近的项目中,解决了一些浏览器兼容方面的bug,这篇主要描述在IE 9在渲染值为auto的overflow-x属性时,所产生的专属bug及解决办法。

 

1、问题描述

 

  在做一个收货地址管理静态页面的时候,需要在众多地址中标示当前鼠标移动了那一个地址上面,所以我给地址的行加上了:hover伪类,然后,我在IE 9下发现了一个有趣的现象(见附件first.html)。
  为什么我设置的max-height属性没有能够起作用?这种情况是怎么产生的,又该怎么解决呢?

2、问题分析

  该问题是一个IE 9独有的bug,地址为http://www.jackness.org/?p=615#more-615的文章中对该bug出现的前置条件作了如下陈述:

bug 触发条件:
经测试发现,这个bug的出现有2个条件:
1)父级设置overflow:auto(准确来说应该是overflow-x:auto),并且里面的元素宽度超出父级导致横向滚动条出现;
2) 父级元素的任意子元素设有:hover伪类并且里面有属性设置(与原有的属性不一样即可);
满足这2个条件,当你触发父级里面的:hover 伪类的时候,bug就会出现。

 

  对比我的页面样式和文档结构,发现完全符合这两个条件。

 

.address .address-list .ls{
	max-height:130px;
	margin-top: 10px;
	border: 1px solid rgb(226,226,226);
	overflow: auto;
	background-color: rgb(255, 255, 255);
}
.address .ls .address-element{
	margin-top: 6px;
	float: left; 
	white-space: nowrap;
}
.address .ls .address-element:hover{
	background-color:yellow;
}

 

<div class="ls" id="addressList">
<div class="address-element">
代昊鑫上海市上海市徐汇区北四环中关四桥太平洋大厦503 100000 13598660548
</div>
	…………
</div>

 

 

  那么这两个条件是否完全归纳了呢?有没有其他的可能情况呢?为此我在此文件的基础之上,进行了如下测试:

 

  1)  测试目的:overflow-x的值不为auto时,该bug是否会出现;

    条件:保持其他条件不变,重新设置overflow-x的值为hidden/scroll;

    结果:所有浏览器上正常,IE9 没有出现上述问题

    示例(见附件):测试1-hidden.html    测试2-scroll.html

 

  2)  测试目的:父元素不产生横向滚动条时,该bug是否会出现;

    条件:保持其他条件不变,修改数据内容,使父元素不产生横向滚动条;

    结果:所有浏览器上正常,IE 9 没有出现上述问题

    示例(见附件):测试3-删除文字.html。

 

  3)  测试目的:通过父元素触发JS事件动态修改子元素样式,,该bug是否会出现;

    条件:保持其他条件不变,删除:hover伪类,通过id为addressList的父元素的  hover/mouseover事件修改子元素       的样式;

    结果:所有浏览器上正常,IE 9 没有出现上述问题

    示例(见附件):测试4-父元素的hover事件改变子元素的样式.html

               测试5-父元素的mouseover事件改变子元素的样式.html。

 

  4) 测试目的:通过子元素触发JS事件动态修改自身样式,,该bug是否会出现;

    条件:保持其他条件不变,删除:hover伪类,通过子元素的hover/mouseover事件修改自身的样式;

    结果:所有浏览器上正常,IE 9 没有出现上述问题

    示例(见附件):测试10-子元素的mouseover事件改变自身的样式.html

                  测试11-子元素的hover事件改变自身的样式.html。

 

  5) 测试目的:通过父元素触发JS事件动态修改子元素的class值,,该bug是否会出现;

    条件:保持其他条件不变,删除:hover伪类,通过id为addressList的父元素的hover/mouseover事件修改子元素的       class值;

    结果:其它浏览器上正常,IE 9复现上述问题

    示例(见附件):测试6-父元素的hover事件增加子元素的class.html

              测试6-2-父元素的hover事件删除子元素的class.html

             测试7-父元素的mouseover事件增加子元素的class.html

             测试7-2-父元素的mouseover事件删除子元素的class.html。

 

  6)测试目的:通过子元素触发JS事件动态修改自身得class值,该bug是否会出现;

        条件:保持其他条件不变,删除:hover伪类,通过子元素的hover/mouseover事件修改自身的class值;

       结果:其它浏览器上正常,IE 9复现上述问题 

      示例(见附件):测试12-子元素的hover事件为自己增加class.html

         测试13-子元素的mouseover事件为自己增加class.html

         测试14-子元素的hover事件删除自身的class.html

         测试15-子元素的mouseover事件删除自身的class.html。

 

  7) 测试目的:通过外部元素的JS事件来动态改变子元素样式,该bug是否会出现;

    条件:保持其他条件不变,删除:hover伪类,创建一个button按钮,通过该按钮的click事件,修改id为addressList的元       素的子元素样式;

    结果:所有浏览器上正常,IE 9 没有出现上述问题

    示例(见附件):测试8-click事件改变子元素的样式.html。

 

  8)测试目的:通过外部元素的JS事件来动态改变子元素class值,该bug是否会出现;

    条件:保持其他条件不变,删除:hover伪类,创建一个button按钮,通过该按钮的click事件,修改id为 addressList的元       素的子元素的class值;

    结果:其它浏览器上正常,IE 9复现上述问题

    示例(见附件):测试9-click事件增加子元素的class.html

          测试9-2-click事件删除子元素的class.html。

 

  通过上述测试可以看出,修改子元素style值是无法触发IE 9这个bug的,只有修改(无论是通过父元素、自身还是外部操作)子元素的class属性的值才能触发该bug

  由此得出该bug出现的两个前置条件为:

 

       1)父级设置overflow:auto(准确来说应该是overflow-x:auto),并且里面的元素宽度超出父级导致横向滚动条出现,并且父级元素不设置height属性的值。

 

       2)子元素设有:hover伪类或者通过动态修改(增加或者删除)子元素的class属性值;

 

       满足这2个条件,并且触发子元素的:hover伪类或者执行了修改子元素class属性值得代码时,bug就会出现。

 

3、解决方案

 通过以上分析我们知道了触发条件,根据触发条件得到如下解决方案:

  1)   给父级别的overflow-x设置非auto值;

  2)   保证这个父级里面的元素内容不超出父级的宽度;

  3)   保证子元素没有:hover伪类或者保证不动态修改子元素的class属性值;

  但是以上解决方案都可能对我们的功能造成影响,既然造成的结果都是父元素的高度被改变,那么我们就可以设置父元素的height属性来解决问题。

  1) 通过对父元素的height属性直接设置高度值【见附件:解决方案1.html】;

 

.address .address-list .ls{
	max-height:130px;
	height:130px;
	margin-top: 10px;
	border: 1px solid rgb(226,226,226);
	overflow: auto;
	background-color: rgb(255, 255, 255);
}

 

 

  2) 在父元素外层设置添加一个空的元素,设置父元素height占外层元素高度的100%,【见附件:解决方案2.html】;

 

.address .address-list .ls{
	max-height:130px;
	height:100%;
	margin-top: 10px;
	border: 1px solid rgb(226,226,226);
	overflow: auto;
	background-color: rgb(255, 255, 255);
}

 

4、总结

  在进行web开发中会遇到很多关于浏览器兼容的问题,通过一些测试来了解问题产生的原因和前置条件,在后续的开发中可以避免出现重复的错误。

  在工作中多注意总结和积累解决问题办法,才能不断的提高自己。

分享到:
评论

相关推荐

    iebug总结jar包

    "iebug总结jar包"是一个专门针对这些问题的资源集合,它包含了处理IE bug的相关资料,特别是针对IE6的解决方案。以下是基于这个主题的详细知识点: 1. **IE6的渲染引擎**:IE6使用的是Trident渲染引擎,它与现代...

    如何兼容IE7和IE8-Div+CSS教程.txt

    #### 常见问题及解决方案 1. **垂直居中问题**: - 在IE7和IE8中,如果想让一个元素垂直居中,可以直接设置`vertical-align: middle;`,但对于其他浏览器,可能需要使用其他方法如Flexbox或Grid布局。 2. **Margin...

    css样式BUG大全

    本文将针对常见的CSS样式BUG进行详细解析,并提出相应的解决方案。 #### 二、垂直居中问题 **问题描述:** 在某些情况下,尝试使一个元素在其父容器内垂直居中时,如果使用`vertical-align: middle;`或设置`line-...

    常见 CSS BUG 的处理

    可以通过设置 `zoom: 1` 来触发 hasLayout,或者使用 `overflow: hidden` 来解决相关问题。 - **Chrome/Safari/Firefox 等现代浏览器**:这些问题通常涉及 CSS3 特性,如 Flexbox、Grid 等。可以使用前缀(如 `-...

    select选项过长无法显示设置overflow:hidden在IE9中不起作用

    这个问题主要是由于IE9的CSS渲染引擎对某些CSS属性的实现不完整或存在bug。在这个案例中,尽管“overflow”属性被设置为了“hidden”,IE9可能没有正确地处理它,导致无法隐藏内容。 解决这个问题的一种方法是通过...

    IE6常见bug附解决方法

    ### IE6常见bug及其解决方法 #### 一、IE6怪异解析之padding与border算入宽高 **问题描述**: 在没有指定文档类型声明的情况下,IE6会使用其特有的“怪异模式”(Quirks Mode)来解析页面布局。在这种模式下,元素...

    CSS浏览器兼容问题整理(IE6.0、IE7.0_与_FireFox)

    标题和描述均指向了一个核心议题——CSS在不同浏览器(尤其是IE6.0、IE7.0与Firefox)之间的兼容性问题。这个问题对于Web开发者来说至关重要,因为不同的浏览器可能对CSS的解析和渲染方式存在差异,导致网页在不同...

    ie兼容问题

    在IE6中,当一个元素被设置为`display: block`后,即使再将其`display`属性设为`none`,该元素依然会被渲染出来。解决这个问题的一个办法是在`display: none`之前先将其`height`和`width`属性设置为`0`: ```css #...

    最全前端面试题-2.2(浏览器兼容问题篇-上百篇题集整理1个月).doc

    - **奇数宽度和高度BUG**:IE6中,宽度和高度为奇数时,边框可能会导致元素尺寸不对,使用偶数宽度和高度可以避免。 - **PNG透明问题**:IE6不支持PNG24位透明,可以使用CSS滤镜`filter`解决。 - **a标签下方间隙...

    hasLayout引发的CSS Bug表

    本文将详细探讨由IE浏览器特有的hasLayout属性引发的CSS Bug表,涉及的知识点包括hasLayout的定义、特点、触发条件以及具体的Bug案例和解决方案。为了便于理解,我们将分几个部分阐述这些知识点。 首先,hasLayout...

    IE7与web标准设计(3)

    其中,"‘overflow:visible’IE6渲染bug"是导致许多页面在IE6和IE7中显示不一致的重要原因。在Web布局中,`overflow`属性用于控制元素内容溢出其边界的行为。在IE6中,当设置为`overflow:visible`时,可能会出现意料...

    浏览器兼容性汇总

    **解决方案**: 使用 `text-overflow:ellipsis` 和 `overflow:hidden` 来确保省略号显示。 ##### 20. 为什么web标准中IE无法设置滚动条颜色了 - **IE**: 不支持通过CSS设置滚动条的颜色。 - **Firefox等其他浏览器*...

    浏览器兼容性问题

    - **问题描述**:在IE6及以下版本中,有时会出现`margin`加倍的现象。 - **解决方法**:使用CSS Hack(如`*margin-bottom: 0;`)来解决IE6中的`margin`加倍问题。 ##### 11. IE与宽度和高度的问题 - **问题描述**...

    IE6浮动换行bug比较实用简单解决方法

    4. 最后,我们通过overflow:hidden来隐藏溢出的内容,这样可以解决IE6对于浮动元素渲染不正确的问题。 针对左侧、中间、右侧的三个部分,我们分别为它们设置了.main_l、.main_c、.main_r三个类。这三个类分别对应...

    ie6 select无法被div遮盖的bug解决方法

    在早期的Internet Explorer 6(简称IE6)浏览器中,存在一个著名的布局bug,这...随着IE6的使用率逐渐降低,这种特定的bug解决方法也变得越来越不常见,但在维护旧项目或支持旧浏览器时,了解这样的技巧仍然是必要的。

Global site tag (gtag.js) - Google Analytics