浏览器bug和修复2

  拥有布局

  Window IE上的bug要比其他浏览器多,原因之一是,IE的显示引擎使用一个称为布局(layout)的内部概念。因为布局是专门针对显示引擎内部工作方式的概念,所以一般情况下不需要了解它,但是,布局问题是许多IE/Win显示bug的根源,所以理解这个概念以及它如何影响CSS是有帮助的。

 什么是布局

  Windows上的IE使用布局概念来控制元素的尺寸和定位。那些称为拥有布局(have layout)的元素负责本身及其子元素的尺寸和定位。如果一个元素没有拥有布局,那么它的尺寸和位置由最近的拥有布局的祖先元素来控制。

  IE显示引擎利用布局概念减少它的处理开销,在理想情况下,所有元素都控制自己的尺寸和定位。但是,这会在IE中导致很大的性能问题。因此,IE/Win开发团队决定只将布局应用于那些实际需要它的元素,这样就可以充分的减少布局开销。



 在默认情况下拥有布局的元素:

  • body
  • 标准模式的html
  • table
  • tr、td
  • img
  • hr
  • input、select、textarea、button
  • iframe、embed、object、applet
  • marquee


  布局概念是IE上特有的,而且它不是CSS属性。尽管某些CSS属性会使元素拥有布局,但是在CSS中无法显示的设置布局。可以使用Javascript函数hasLayout查看一个元素是否拥有布局。如果拥有布局,这个函数就返回true,否则返回false。hasLayout是一个只读属性,所以无法使用Javascript进行设置。



  设置以下CSS属性会自动的使元素拥有布局:

  • position: absolute
  • float:left或right
  • display: inline-block
  • width: 任何值
  • height: 任何值
  • zoom: 任何值(Microsoft属性----不能通过检查)
  • writing-mode: tb-r1 (Microsoft属性----不能通过检查)


 布局有什么效果

  布局时许多IE/Win显示bug的根源。例如,一个文本段落靠着一个浮动元素,那么期望这个文本环绕这个元素。但是在IE6和更低版本中,如果给段落设置了高度,那么这个段落就拥有了布局,于是它就被限制为矩形,阻止了文本环绕浮动元素,这会导致浮动布局的各种问题。

  另一个问题涉及拥有布局元素如何确定自己的尺寸。如果元素的内容变得比元素本身大,那么期望内流到元素外,但是,在IE6和更低版本中,拥有布局的元素会扩展自身的尺寸以适应内容。所以,在IE中width更像min-width,尤其是当浮动框的内容迫使框的宽度增加时,框的宽度对于可用宽度来说太大了,这个框就会下降到其他框的下面。



  其他问题还包括:

  • 拥有布局的元素不进行收缩
  • 布局元素对浮动进行自动清理
  • 相对定位元素不获得布局
  • 在拥有布局的元素之间空白边不叠加
  • 在不拥有布局的块级链接上,单击区域只覆盖文本


  常见的bug和修复方法 

  CSS开发人员最重要的技能之一是发现常见浏览器bug的能力。通过了解导致这些bug的各种元素,可以在它们造成问题之前发现并且修复它们。

 双空白边浮动bug

  最常见且最容易发现的bug之一是IE6和更低版本中的双空白边浮动bug。顾名思义,这个Windows bug使任何浮动元素上的空白边加倍。

  这个bug很容易修复,将元素的display属性设置为inline就可以了。因为元素是浮动的,所以将display设置为inline实际上不会影响显示方式。但是,这似乎会阻止IE 6和更低版本将所有的空白边加倍。这是一个非常容易发现和修复的bug:每当对具有对平空白边的元素进行浮动时,都应该很自然的将display属性设置为inline。

 3像素文本偏移bug

  另一个非常常见的IE5-6/Win bug是3像素文本偏移bug:当文本与一个浮动元素相邻时,这个bug就会表现出来。例如,假设将一个元素向左浮动,并且不希望相邻的段落文本围绕浮动元素,你可能会在段落应用左空白边,其宽度等于浮动元素的宽度:

.myFloat {
float: left;
width: 200px;
}

p {
margin-left: 200px;
}

  如果这么做,在文本和浮动元素之间就会出现一个莫名其妙的3像素间隙:

  修复这个bug要双管齐下,首先,给包含文本的元素设置任意的高度,这会迫使元素拥有布局,因为在IE6和更低版本上height的效果等同于min-height,所以设置一个小的高度不会影响元素在这些浏览器里的实际尺寸,但是,会影响其他浏览器,所以要针对Windows上的IE6和更低版本才使用这个规则:

/* Hide from IE5-mac, only IE-Win see this \*/
* html p {
height: 1%;
}
/*End hide from IE5-mac */

  不幸的是,这么做会导致另外一个问题,拥有布局的元素会被限制为矩形,并且出现在浮动元素的旁边而不是下面,添加200像素的空白边实际上会在IE5/6中使浮动元素和段落之间产生200像素的间隙。为了避免这个间隙,需要重新把空白边设置为零:

/* Hide from IE5-mac, only IE-Win see this \*/
* html p {
height: 1%;
margin-left: 0;
}
/*End hide from IE5-mac */

  这样,文本偏移被修复了,但是现在另外一个3像素的间隙出现了,这一次是在浮动元素上。为了去掉这个间隙,需要在浮动元素上设置一个负值的3像素右空白边:

/* Hide from IE5-mac, only IE-Win see this \*/
* html p {
height: 1%;
margin-left: 0;
}

* html .myFloat {
margin-right: -3px;
}
/*End hide from IE5-mac */

  如果浮动元素是除了图像之外的其他元素,那么这个问题已经被修复了。但是,如果浮动元素是图像,那么还有最后一个问题需要解决。IE 5/Win在图像的左右都添加了3像素的间隙,而IE6不改变图像的空白边。因此,需要一个招数只在IE5/Win上去掉3像素的间隙:

/* Hide from IE5-mac, only IE-Win see this \*/
* html p {
height: 1%;
margin-left: 0;
}

* html .myFloat {
margin: 0  -3px;
ma\rgin: 0;
}
/*End hide from IE5-mac */

  这会解决问题,但是采用的方式复杂而且难看,因此,如果可能的话,最好将这些规则分别放进单独的浏览器特定的样式表中。如果这样做,在IE5的样式如下:

p {
height: 1%;
margin-left: 0;
}

img.myFloat {
margin: 0 -3px;
}

  用于IE6的样式如下:

p {
height: 1%;
margin-left: 0;
}

img.myFloat {
margin: 0;
}

浏览器bug和修复2

时间: 2024-10-14 14:47:41

浏览器bug和修复2的相关文章

浏览器bug和修复

与许多编程语言相比,CSS是一种相当容易学习的语言,它的语法简单明了,而且由于它的表现本质,开发人员并不需要处理复杂的逻辑.但是在不同的浏览器上测试代码才是真正困难的开始,你的设计在一种浏览器上表现的良好,但是在另外一个浏览器上就会变得“支离破碎”. “CSS难以掌握”的误解并非来自于语言本身,而是由于为了让站点在所有主流浏览器上工作正常需要采取很多的措施.关于bug的信息很难找到,缺乏文档记录,因此bug常常被误解.许多人把招数看做魔法子弹,认为它们就像神秘的咒语一样,当应用在代码中时,就会神

常见浏览器bug(针对IE6及更低版本)及其修复方法

常见bug及其修复方法有以下几种 1.双外边距浮动bug 双外边距浮动bug在IE6及更低版本中常见.所谓双外边距浮动bug是指使任何浮动元素上的外边距加倍.(见下图) 只要将元素的display属性设置成inline就行了.因为元素时浮动的,所以将display属性设置为inline实际上不会影响显示方式.但是,这似乎会阻止Windows上的IE6及更低版本将所有外边距加倍.所以每当对具有水平外边距的元素浮动时,都应该很自然的将display属性设置为inline,以备外边距将来被加大. 2.

EasyTable2.0 功能更加强大,bug全面修复的html table插件!

最近整理和修复了1.0的全部bug,并且给2.0添加了不少新功能.由于语法上有些修正,所以我重新写了一个非常详细的demo.html在文档里面,这里直接贴出(由于添加了新的功能,et的2.0的压缩版本已经达到了20k的体积了,虽然略显大一些,但是我相信从功能上来讲觉得是划得来的.): <html> <head> <title></title> <style type="text/css"> * { margin: 0; pad

关于margin的浏览器BUG

常见的浏览器下margin出现的bug 林林总总写了那么多,最后总结一些浏览器中常见的margin Bug吧,以后遇到margin下的布局问题可以查看这里找到解决的方案,如果你还发现其他关于浏览器下margin的Bug你可以发表留言,核对采纳后我会及时添加进去,感谢你的分享: IE6中双边距Bug: 发生场合:当给父元素内第一个浮动元素设置margin-left(元素float:left)或margin-right(元素float:right)时margin加倍. 解决方法:是给浮动元素加上di

转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复

转载自:http://www.cnblogs.com/dabaopku/archive/2012/12/12/2813940.html ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复 问题 -all_load 是在Objective-C 编译时常用到的一个参数,比如这篇文章所介绍的,生成静态库的一些问题-all_load.但是我们在加入这个参数后,有时会出现"ld: duplicate symbol _main"的错误

jquery的clone方法bug的修复

测试发现,textarea和select的jquery的clone方法有问题,textarea和select的值clone的时候会丢掉,发现这个是jquery的一个bug,上不了的可以看下代码,比较简单.就是在clone的时候将val再重新赋值一下,如果知道这个了,就简单了自己写. 引入到你要用的clone的页面就ok jquery.fix.clone.js (function (original) {  jQuery.fn.clone = function () {    var result

消格子时一个很深的bug的修复纪录

环境: cocos2d-x 2.2.2  jsb 条件:当快速在格子中来回拖拽选取时,会一直在计算指尖和格子的真实区域是否碰撞, 报错:touchMOve时由于不停的调用BOxItem的getValidRectangle方法, 即不停的在此方法内执行 node.getContentSize().witdh, 经过好几个小时的检测,发现问题就在这一行,xcode里报错的提示显示的是框架里的touchMove相关的代码,看不出具体问题,大概知道了是在touchMOve时F出的问题 修复办法:在Box

Android 5.0原生bug及修复方法

Android 5.0已经来了,这个版本改动非常大,也意味着会有更多的bug隐藏在其中,我会在这篇文章中一直更新自己遇到的原生bug及修复方法. 1.bug1 现象:5.0中ActivityManagerService.keyguardWaitingForActivityDrawn ()接口替换了4.4中ActivityManagerService.dismissKeyguardOnNextActivity()接口,但是带来了一个显示bug,现象是keyguard隐藏后activity窗口还没显

【学习】苹果iPhone safari浏览器样式重置修复按钮圆角bug

iPhone safari浏览器中,input按钮会按苹果的默认UI来渲染,例如,写的按钮明明是这个样的: 但是实际就会是这个样子: 怎么办呢? 为按钮添加:-webkit-appearance: none; 即可解决!