`

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”。因为每一种盒模型的解析方式都存在着利与弊,所以可以使用这项技术是有好处的。但说回来,对于这种属性的任何具体的落实,都会面临一些浏览器尚不支持的尴尬情况。

分享到:
评论

相关推荐

    css 盒模型整理

    由于IE盒模型与W3C盒模型的差异,老版本的IE浏览器可能显示不一致。通过使用`box-sizing`属性,我们可以确保元素在所有浏览器中表现一致。 ### 7. 结论 理解CSS盒模型是提升网页布局技能的基础。通过熟练掌握盒...

    CSS盒子模型.rar

    虽然W3C标准定义了盒子模型,但早期的IE浏览器(尤其是IE6和IE7)采用了一种不同的实现,称为“怪异盒模型”。这导致了跨浏览器的布局问题。为解决这个问题,可以使用`*{box-sizing:border-box}`进行全局设置,使...

    解决ie9、ie10本地css加载不上的解决方法实例

    3. **使用条件注释**:IE浏览器支持条件注释,可以针对特定版本的IE加载特定的CSS。例如,为IE9和IE10编写专门的CSS文件,并通过条件注释引入: ```html &lt;!--[if IE 9]&gt; &lt;link rel="stylesheet" type="text/css" ...

    IE浏览器源码

    9. **安全与兼容性**:由于IE浏览器的市场份额和历史遗留问题,源码中会涉及很多兼容性和安全性的考虑,如ActiveX控件的管理、跨域策略等。 10. **调试与测试**:源码中通常包含调试工具和测试框架,以便于开发者...

    让ie兼容css选择器

    总之,ie7.js、ie8.js和ie9.js是开发者解决IE浏览器CSS兼容性问题的重要工具,它们通过JavaScript模拟现代CSS选择器的功能,使得在旧版IE中也能呈现出丰富的样式效果。然而,随着技术的进步,使用这些库的同时,也要...

    css盒子模型详解加示例

    需要注意的是,IE浏览器有一个非标准的盒子模型,其中内容区域的宽度和高度包含了内填充和边框,这导致了与W3C标准模型的差异。为了避免这种兼容性问题,通常会在HTML文档开头添加DOCTYPE声明,以确保浏览器使用标准...

    IETest(IE浏览器集合)

    3. **元素选择和检查**:IETest提供了类似开发者工具的功能,可以选中页面元素,查看其样式和盒模型,帮助调试布局问题。 4. **CSS和脚本支持**:除了基本的HTML渲染,IETest还能检测CSS和JavaScript在不同IE版本中...

    css盒子模型 css margin 外边框合并

    这种差异有时会导致布局的不一致,因此在这些旧版本的IE浏览器中,通常建议避免给元素添加具有指定宽度的内边距或边框,而是可以通过调整父元素或子元素的内边距和边框来实现布局。 在实际开发中,为了避免外边距...

    CSS样式兼容IE6、IE7、IE8、FF火狐浏览器的方法

    为了兼容不同版本的IE浏览器及火狐浏览器,开发者常采用CSS Hack技术来针对性地应用样式。以下是一些常用的Hack方法: - **星号Hack(*)**:用于向IE7及以上版本和火狐浏览器发送特定样式,而忽略IE6。 - **下划线...

    Day05-CSS布局-盒子模型

    在实际项目中,我们可能会遇到盒模型兼容性问题,尤其是当涉及到老版本的IE浏览器时。为了确保跨浏览器的一致性,可以使用`box-sizing`属性来指定元素的盒子模型类型,例如`box-sizing: border-box;`。 总的来说,...

    [资源分享]解决Win10下IE浏览器树形控件treeview无法显示的问题

    总之,解决Win10下IE浏览器树形控件无法显示的问题需要综合考虑浏览器兼容性、ActiveX设置、JavaScript和CSS代码、以及可能的资源路径问题。通过逐步排查和测试,通常可以找到问题的根源并予以修复。同时,随着现代...

    新版IE浏览器源代码

    这个资源可能包含了构建和修改IE浏览器功能的原始代码。 描述中提到的"带有截屏,调出网页源文件,全屏"等功能是现代浏览器普遍具备的特性,这些功能的实现涉及多个技术层面: 1. **截屏功能**:截屏功能通常通过...

    CSS3底部半圆形导航菜单代码,点击底部加号,会弹出一个半圆形的导航栏,不支持IE浏览器,支持chorme,firefox浏览器

    由于其依赖于CSS3特性,因此不兼容较老的IE浏览器,但可在Chrome和Firefox等现代浏览器中正常运行。 首先,让我们来了解一下CSS3的关键特性在这个案例中的应用。这个底部导航菜单主要利用了以下几点: 1. **伪元素...

    IE浏览器测试器

    "IE浏览器测试器"就是专为解决这个问题而设计的工具,它主要用于检测和调试网页在不同版本的Internet Explorer(IE)浏览器中的表现。 IE浏览器测试器的核心功能在于模拟多个版本的IE环境,以便开发者可以直观地...

    详解CSS 怪异盒模型和标准盒模型

    然而,在处理旧代码或需要与旧版IE浏览器兼容时,可能需要对怪异盒模型有所了解。 为了更好地应用盒模型,开发者需要注意以下几点: 1. **明确指定盒模型**:使用`box-sizing`属性可以明确指定元素的盒模型,避免因...

    ie浏览器样式查看工具

    IE浏览器样式查看工具,即IEDevToolBar,是一款专为Internet Explorer设计的强大辅助工具,它允许开发者直接在浏览器中查看和修改网页的CSS样式,从而极大地提升了前端开发和调试的效率。 **一、IEDevToolBar的功能...

    ie浏览器插件(页面数据抓取)

    9. **替代方案**:除了IE浏览器插件,还有其他工具和平台如Chrome扩展、Scrapy框架(Python)和各种网页抓取服务,它们提供了更强大和灵活的数据抓取解决方案。 10. **学习资源**:想学习如何开发这样的插件,可以...

    让IE8以下兼容HTML5标签和CSS3高级选择器

    IE8及以下版本只支持CSS2.1的选择器,如ID、类、属性、后代和子代选择器。要让这些浏览器理解CSS3的伪类(如:hover, :nth-child())、属性选择器(如[E~=F])和其他更复杂的选择器,可以使用Selectivizr库。...

    wince ie浏览器源代码

    在Windows CE(简称WinCE)平台上,IE浏览器的开发是一项技术含量较高的工作。...通过对这些知识点的深入学习和实践,开发者可以有效地利用提供的源代码进行WinCE IE浏览器的定制和优化,以适应不同应用场景的需求。

    什么是IE浏览器.docx

    ### IE浏览器概述与发展历程 #### 一、浏览器概念解析 浏览器是一种用于访问...对于开发者来说,了解IE浏览器的历史及其技术特性,有助于更好地理解和应对不同浏览器之间的差异,从而优化网页在各种浏览器上的表现。

Global site tag (gtag.js) - Google Analytics