问题的条件有:

  • A元素是B元素的包含块。
  • A元素设置overflow:hidden;,并同时设置了heightmin-height,同时height计算值 < min-height
  • 原生IE8浏览器,或者IE9浏览器的IE8兼容性模式(以下统称为IE8)

期待结果:

  • 若B元素为absolute定位元素,A元素为relative定位元素,则B元素的包含块高度为A元素的padding-edge高度
  • 若A、B元素均为常规流定位元素,则B元素的包含块高度为A元素的content-box高度
  • 若A元素同时设置了min-heightheight,同时height计算值小于min-height。因为height权重小于min-height,最终A元素的content-box高度计算值应以min-height为准

IE8的bug是:

  • 若B元素的包含块的content-box的值计算错误,在height计算值小于min-height的同时,误取了heihgt值作为其包含块的content-box部分
  • B元素跟其包含块有关的属性,如百分比top/bottom/百分比height均受到影响,因此,B元素的位置可能受到影响
  • A元素的最终高度计算依然正确
  • 受到影响的仅仅是以A元素为包含块的元素,包括B元素

DEMO

  • 一个使用了absolute定位的DEMO:

http://jsfiddle.net/humphry/Xzy28/7/

  • 一个未使用absolute定位的DEMO,可见jsfiddle:

http://jsfiddle.net/humphry/NSCLa/8/

我们看一下渲染结果的区别。

计算流程,试解释

  absolute static
其他浏览器 外层高500/内层高500 外层高500/内层高300
IE8 外层高500/内层高220 外层高500/内层高20

我们先看看外层的计算。

.wrapperheight是20px,被min-height的300px覆盖,最终的高度值为:100px padding-top + 100px padding-bottom + 200px height计算值 = 500px。这里所有的浏览器都计算正确。

对于内层,IE8/其他正常浏览器,在absolute定位和static定位下的区别有:

  1. 正常浏览器,.innerabsolute定位: .inner设置了100%高度,即100%的包含块的高度,即外层容器的padding-edge高度,也就是外层容器的 200px padding高度 + 300px content-box高度 = 500px
  2. IE8浏览器,.innerabsolute定位: .inner的包含块的content-box高度误用了height值而非min-height值,计算出来高度值为 200px padding高度 + 20px height高度 = 220px

  3. 正常浏览器,.inner static定位: .inner设置了100%高度,即100%的包含块的高度,即外层容器的content-box高度,也就是外层容器的 300px content-box高度 = 300px

  4. IE8浏览器,.inner static定位: .inner的包含块的content-box高度误用了height值而非min-height值,计算出来高度值为 20px height高度 = 20px

解决方案

  • 去掉.wrapper上的overflow:hidden;
  • overflow:hidden;加在不【同时设置heightmin-height,且height计算值<min-height】的元素上

参考资料

bug记录:IE8,包含块min-height/height共存时的高度计算bug的更多相关文章

  1. CSS2.1SPEC:视觉格式化模型之包含块

    原汁原味的才是最有味道的,在阅读CSS标准时对这一点的体会更加深刻了,阅读文档后的一大感觉就是很多看上去理所应当的样式表现也都有了对应的支持机制.本文首先从包含块写起,一方面总结标准中相应的阐述,并且 ...

  2. # bug 查找 (一) 快速记录 IE8 下三个问题

    bug 查找 (一) 快速记录 IE8 下三个问题 昨天 pc 端网站上灰度,发现多个在 IE8 下的问题,描述和解决方案如下: 第一个问题是 css 文件过大 现象 把项目所有的 css 打包成单个 ...

  3. 转: Firefox 浏览器对 TABLE 中绝对定位元素包含块的判定有错误

    标准参考 元素的包含块 W3C CSS2.1 规范中规定,绝对定位元素的包含块(containing block),由离它最近的 position 特性值是 "absolute". ...

  4. <p></p>标签为什么不能包含块级标签?还有哪些特殊的HTML标签?

    最近,在码代码的时候,就是下面的这段代码,我犯了一个很不起眼,但犯了就致命的BUG. <body> <p> <ol> <li>Hello</li& ...

  5. * CSS 视觉格式化(基本框、包含块、盒模型、水平格式化、垂直格式化、行布局、em框、内容区、行间距、行内框、行框)

    前言 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应该显示的 ...

  6. 【疑点】<p></p>标签为什么不能包含块级标签?还有哪些特殊的HTML标签?

    最近,在码代码的时候,就是下面的这段代码,我犯了一个很不起眼,但犯了就致命的BUG. <body> <p> <ol> <li>Hello</li& ...

  7. CSS学习笔记——包含块 containing block

    以下内容翻译自CSS 2.1官方文档.网址:https://www.w3.org/TR/CSS2/visudet.html#strut 有时,一个元素的盒子的位置和尺寸根据一个确定的矩形计算,这个确定 ...

  8. 由position属性引申的关于css的进阶讨论(包含块、BFC、margin collapse)

    写这篇文章的起因是源于这篇文章:谈谈面试与面试题 中关于position的讨论,文中一开始就说的这句话: 面试的时候问个css的position属性能刷掉一半的人这是啥情况…… 其实这问题我本来打算的 ...

  9. 包含块( Containing block ) 转自W3CHelp

    包含块简介 在 CSS2.1 中,很多框的定位和尺寸的计算,都取决于一个矩形的边界,这个矩形,被称作是包含块( containing block ). 一般来说,(元素)生成的框会扮演它子孙元素包含块 ...

随机推荐

  1. Webpack-dashboard 简单使用

    1. 安装 npm install webpack-dashboard --save-dev 2. 配置说明 webpack config // Import the plugin: var Dash ...

  2. Shell脚本基础知识详细介绍(一)

    Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种 ...

  3. ajax级联实现

    效果如下: 选择第一项,第二项.第三项的内容跟着改变. 选择第二项,第三项的内容跟着改变. 第三项则不影响第一项和第二项. 有几点值得提: 1.html到底是前台拼接还是后台拼接. 我选择的是前台拼接 ...

  4. [Kingdom Rush]团队分享:如何做塔防手游

    转自:http://www.gamelook.com.cn/2015/03/207324 GameLook报道/2014年11月,乌拉圭开发商Ironhide Studios发布的<Kingdo ...

  5. web新特性 之 WebSocket

    详情参见:你真的了解WebSocket吗?     WebSocket系列教程   HTML5新特性之WebSocket WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HT ...

  6. php学习之if

    <html> <head> <title>xxx</title> <style> #tian{ color:blue; float:left ...

  7. 4.Django使用celery

    1. 配置celery   创建django项目celery_demo, 创建应用demo: django-admin startproject celery_demo python manage.p ...

  8. leetcode804

    int uniqueMorseRepresentations(vector<string>& words) { map<char, string> st; st.ins ...

  9. 解决The JSP specification requires that an attribute name is preceded by whitespace问题

    笔者今天调试界面出现下边这个问题: The JSP specification requires that an attribute name is preceded by whitespace 经查 ...

  10. OK6410&nbsp;tftp下载内核、文件系…

    飞凌官方提供了一键下载烧写linux的方式,相对来说比较方便,但是对于开发来说不够灵活,因此这篇文章把tftp相关的点介绍一下,整理下其中遇到的一些问题. 一键烧写本质上是启动位于SD卡中的Uboot ...