`

IE浏览器和CSS盒模型

    博客分类:
  • Web
阅读更多

如果你已经了解了CSS盒模型在兼容性上的差异以及如何处理IE浏览器的问题,那就请飘过——这里要谈的没任何新的东西。如果你对为什么IE和其他浏览器会显示出不同大小的盒子一无所知,那就继续阅读吧。

CSS盒模型图解

下面是一幅关于应用了CSS的元素是如何显示它的尺寸的图示。

box-model.gif

在本篇文章中,所有的浏览器在计算盒模型总宽度时处理margin属性的方式都是一致的,所以我们将更多的精力放在padding和border属性上。

W3C盒模型

首先看一下《 the W3C box model》,这里所写出的标准,如果没问题的话,是应该被所有标准的现代浏览器及IE6和它的后续版本所遵循的。在W3C盒模型中,一个块级元素的总宽度按照如下的方程式计算:

总宽度 = margin-left + border-left + padding-left + width + padding-right + border-right + margin-right

对于高度也使用同样的计算方法,但是为了简便起见从现在开始我只说width。

IE盒模型

IE盒模型的计算方式和W3C的很相似,但有一点是非常不同的,这就是:填充和边框并不被包含在计算的范围内。

总宽度 = margin-left + width + margin-right

这就意味着一旦元素拥有横向的填充和/或边框,实际的内容区域(content area )就要扩大来创造出他们占据的空间。

关于IE的版本

IE5.5及更早的版本使用的是IE盒模型。很多人似乎没注意到IE6及更新的版本在标准兼容模式(standards compliant mode)下使用的是W3C的盒模型标准。我们说这是一个好消息因为这意味着此盒模型问题只会出现在IE5.5及其更早的版本中。只要为文档设置一个DOCTYPE,就会使得IE遵循标准兼容模式的方式工作。

解决问题

现在确定了IE6及后续版本都会遵循标准兼容模式,那现在唯一要关注的事情就是如何令IE5.5及更早版本中的网页和其在更现代的浏览器中呈现出的是一致的。如果你目前就遇到了这个问题,那么下面的几个方法会帮助到你,我以我的喜好为它们列出了优先顺序。

  1. 避免导致这个问题的情景
  2. 插入额外的标记
  3. 使用条件注释判断语句
  4. 使用CSS hacks

因为这个由盒模型解析方式不同导致的问题往往只是针对表象上的显示,所以我个人偏好的方法就是尽量避免不去触发IE5.*/Win的这个BUG,而有些时候会不可避免的遇到,那我就会使用下面介绍的方法中的一个。

1.避免导致这个问题的情景

这是我的首选,很简单,就是避免为一个元素同时设置width和padding值或者width和border值,再或者width同时和它们两个值。这确保了所有的浏览器都会一样的去计算元素的总宽度,而不用考虑它们使用哪种盒模型方式。

我这里拿一个例子说明,下面的HTML用来定义一个新闻列表:

<div id="news">
  <h2>News</h2>
  <ul>
    <li>
      <h3>News article 1</h3>
      <p>Lorem ipsum dolor sit amet</p>
    </li>
    <li>
      <h3>News article 2</h3>
      <p>Lorem ipsum dolor sit amet</p>
    </li>
  </ul>
</div>

为了得到一个250像素宽的列表,且应用1像素的边框和10像素的填充,会用到这样的CSS:

#news {
  padding:10px;
  border:1px solid;
  width:228px;
}

在符合标准的浏览器中,总宽度是250像素(1px left border + 10px left padding + width + 10px right padding + 1px right border)。但在IE5.5及更早的版本中,总宽度只是228像素,因为它并未计算边框和填充的值。

那么该如何避免这个问题呢?让我们假设新闻列表在另一个容器里,比如它在侧边栏(sidebar)里:

<div id="sidebar">
  <div id="news">
    ...
  </div>
</div>

如果是这样,你可以为父容器(sidebar)设置宽度来达到效果:

#sidebar {width:250px}
#news {
  padding:10px;
  border:1px solid;
}

2.插入额外的标记

如果情况不容许你使用第一种方法,那可以使用插入额外的标记这个方法。还是使用前面那个例子,这次我们在#news里面插入一个标记:

<div id="news">
  <div>
  <h2>News</h2>
    <ul>
      ...
    </ul>
  </div>
</div>

使用如下的CSS:

#news {width:250px}
#news div {
  padding:10px;
  border:1px solid;
}

外层的元素提供宽度,包含在里面的元素提供边框和填充。

是否使用一个额外标记这种妥协式的方式的决定权在于开发者本身。避免使用这种方式的好处是显而易见的,但是一个额外的div标签除了会增加文件的体积和降低代码的可维护性之外,不会产生其他的不良影响。它不会影响到页面的无障碍性以及当CSS文档不存在的时候文档的可阅读性。此外,增加一个额外的标记还会为某些设计上的实现提供便利条件。

3.使用条件注释判断语句

如果没有合适的父容器来控制宽度也不能通过添加额外的标记解决问题,那针对IE 5.*/Win我们就需要设置一个不同的width值了。

我的建议,这么做最安全的方式就是使用条件注释判断语句(conditional comments,)这些内容只能在IE/Win中被解析,下面的代码只有在IE6以下的版本中被执行:

<!--[if lt IE 6]>
<style type="text/css">
  #news {width:250px}
</style>
<![endif]-->

如果你打算使用这个方法,我建议将全部的针对IE 5.*/Win的代码都转移到一个单独的CSS文件中来加载它:

<!--[if lt IE 6]>
<link rel="stylesheet" type="text/css" href="/css/ie5.css">
<![endif]-->

4.使用CSS hacks

最后你还可以通过使用一个CSS hack(CSS hack)来为IE 5.*/Win提供修改过的属性值。我的建议是尽量不使用CSS hacks。顾名思义,它们是hacks,hacks是基于不同浏览器对CSS解析不同导致的无证错误之上的。因为现在依然有很多人在使用hacks,所以我在这里提一下也无妨。除非你明确的知道在做些什么,否则我还是要建议你尽可能的使用其他方法。

针对盒模型问题最简单的CSS hack是SBMH(The simplified box model hack),案例的HTML代码和上面第一个是一样的,CSS是:

#news {
  padding:10px;
  border:1px solid;
  width:250px;
  width:228px;
}

所有的浏览器都会看到并理解“width:250px”,但IE 5.*/Win不会读取下面的一行,width:228px,但这行会被其余的浏览器解析。所以最后,IE 5.*/Win得到的width值是250px,其他浏览器得到的是228px。这样,在全部的浏览器中我们的新闻列表的总宽度就一致了。

总结:

我在本文中展示了如何避免或解决因CSS盒模型计算不同而导致的问题的办法,你可以根据实际情况来选择使用哪一种方法。

需要提到的是,可能在未来的某个时间,CSS3的“box-sizing”属性会给开发者选择盒模型解析方式的权利(在新发布的CSS草案中,容许开发者使用content-boxborder-box属性来选择盒模型解析的类型)。W3C的盒模型方式被称为“content-box”,IE的被称为“border-box”。因为每一种盒模型的解析方式都存在着利与弊,所以可以使用这项技术是有好处的。但说回来,对于这种属性的任何具体的落实,都会面临一些浏览器尚不支持的尴尬情况。

分享到:
评论

相关推荐

    详解CSS3中的box-sizing(content-box与border-box)

    border-box:怪异盒模型,低版本IE浏览器中的盒模型 现代浏览器和IE9+默认值是content-box。 语法格式: box-sizing:content-box | border-box 区别: content-box:padding和border不被包含在定义的width和height...

    JQuery 确定css方框模型(盒模型Box Model)

    做过前台设置的都知道css存在两种盒模型,W3C标准的方框模型和IE浏览器的方框模型。除IE以外的大多数浏览器只支持W3C方框模型。IE浏览器能够根据页面的呈现模式的定义而是用对性的方框模式。已用哪中呈现的模式取决...

    深入剖析CSS弹性盒模型flex

    CSS3引入了一种新的布局模型——flex布局。flex是flexible box的缩写,一般称之为弹性盒模型。和CSS3其他属性不一样,flexbox并不是一个属性,而是一个模块,包括多个CSS3属性。...该版本IE浏览器不支持,且其他浏览

    前端开发面试题–htmlcss篇

    1.2 怪异盒模型(ie浏览器默认的盒子模型) box-sizing: border-box:宽和高代表的是盒子的content+padding+border,给盒子加边框和内边距不会撑大盒子(前提是内边距和边框不会超过盒子宽度) 盒子的总宽度=width+...

    使用div+css开发个人网站毕业设计.doc

    10 三、实现结构与表现分离 11 第六节 div+css的兼容性问题 11 一、div的垂直居中问题 11 二、margin加倍的问题 11 三、浮动ie产生的双倍距离 11 四、IE与宽度和高度的问题 11 五、页面的最小宽度 12 六、DIV浮动IE...

    css入门笔记

    样式规则:由选择器和样式声明组成 3.外部样式 独立于任何网页位置处,声明一个样式文件(.css为后缀),在文件中声明样式,在使用的网页中引入.css文件。 使用步骤: 1.创建样式表文件(.css) 2.在样式文件中...

    javascript

    02开启IE浏览器对本地文件的JavaScript的支持.EXE 03开启firefox浏览器对JavaScript的支持.EXE 04开启Opera浏览器对JavaScript的支持.EXE 05开启Netscape浏览器对JavaScript的支持.EXE 演示内容:JavaScript的...

    xhEditor编辑器 v0.9.6 简体中文

    2.修正:IE浏览器下,由于原光标丢失解决方案不理想,造成光标在某些情况会跑到页面结尾的问题 3.修正:在Chrome和Safari浏览器下,切换到源代码模式无法全窗口的问题(目前仅部分修正) 4.修正:某些非盒模型...

    xhEditor编辑器 v0.9.6 繁体中文

    2.修正:IE浏览器下,由于原光标丢失解决方案不理想,造成光标在某些情况会跑到页面结尾的问题 3.修正:在Chrome和Safari浏览器下,切换到源代码模式无法全窗口的问题(目前仅部分修正) 4.修正:某些非盒模型...

    javascript完全学习手册2 源码

    13.2 IE浏览器内建的错误报告 13.3 异常处理 13.3.1 异常类型 13.3.2 触发onError事件处理异常 13.3.3 使用trycatch语句处理异常 13.3.4 Error对象 13.3.5 使用throw语句 13.4 JavaScript调试技法 ...

    javascript完全学习手册1 源码

    13.2 IE浏览器内建的错误报告 373 13.3 异常处理 374 13.3.1 异常类型 374 13.3.2 触发onError事件处理异常 375 13.3.3 使用try...catch语句处理 异常 377 13.3.4 Error对象 379 13.3.5 使用throw语句 380 13.4 ...

    XML高级编程pdf

    4.1.1 静态模型和动态模型 4.1.2 文档和数据 4.1.3 从何处开始 4.1.4 静态信息模型 4.1.5 动态建模:对数据进行哪些处理? 4.2 设计XML文档 4.2.1 XML的两种角色 4.2.2 将信息模型映射到XML 4.3 模式语言和...

    XML高级编程 (Extensible Markup Language)

    4.1.1 静态模型和动态模型 4.1.2 文档和数据 4.1.3 从何处开始 4.1.4 静态信息模型 4.1.5 动态建模:对数据进行哪些处理? 4.2 设计XML文档 4.2.1 XML的两种角色 4.2.2 将信息模型映射到XML 4.3 模式语言和...

    XML 高级编程(高清版)

    4.1.1 静态模型和动态模型 4.1.2 文档和数据 4.1.3 从何处开始 4.1.4 静态信息模型 4.1.5 动态建模:对数据进行哪些处理? 4.2 设计XML文档 4.2.1 XML的两种角色 4.2.2 将信息模型映射到XML 4.3 模式语言和...

    XML高级编程

    4.1.1 静态模型和动态模型 81 4.1.2 文档和数据 82 4.1.3 从何处开始 82 4.1.4 静态信息模型 83 4.1.5 动态建模:对数据进行哪些处理 87 4.2 设计XML文档 90 4.2.1 XML的两种角色 90 4.2.2 将信息模型映射到XML 93 ...

    javapms门户网站源码

    在浏览器兼容性方面,目前多种浏览器并存,使用非IE浏览器的用户越来越多,即使是IE浏览器也有多种版本。系统所有web页面制作遵循w3c标准制作,采用最新的html5规范,基于div+css布局,所有标签生成的html代码都经过...

    世界之窗 3.5.0.3

    自2.0版继IE浏览器7.0版之后,是世界上第二款采用多线程窗口框架的浏览器,区别于其它采用单线程的多窗口浏览器,多线程框架可以大幅减少由于某个网页假死导致的整个浏览器假死情况,并且可以在一定程度上提高网页...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    它是微软的IE浏览器特有的功能,用它可以对XML标识设定一些有趣动作。 七.DOM DOM全称是document object model(文档对象模型),DOM是用来干什么的呢?假设把你的文档看成一个单独的对象,DOM就是如何用HTML或者...

Global site tag (gtag.js) - Google Analytics