css - 有关IE8的下height:100%计算错误
怪我咯
怪我咯 2017-04-17 11:06:44
[HTML讨论组]
<!doctype html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin: 0;padding: 0;}
html{height: 100%}
body{min-width: 1280px;height: 100%;}
.wrapper{position:relative;overflow: hidden;height: 100%;min-height: 920px;}
.u-pagebg{position:absolute;width: 100%;height: 100%;background: #ddd}
.m-ft{width: 100%;height: 70px;position: absolute;left: 0;bottom: 0;background-color: #000;}
</style>
</head>
<body>
    <p class="wrapper">
        <p class="u-pagebg"></p>
        <p class="m-ft"></p>
    </p>
</body>
</html>

大致代码如上,IE8下.u-pagebg和.m-ft并未在正确位置出现,这个问题只有在原生的IE8存在,其他浏览器均没有,IE11的IE8文档模式也没有这个问题。不知道有哪位知道怎么解决吗?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(1)
PHP中文网

这是一个比较罕见的bug,而且跟高度100%没有关系,跟absolute定位也关系不太大。

详细的bug复现DEMO请见我的这篇文章:《【bug记录】IE8,包含块min-height/height共存时的高度计算错误》

问题复现

  • 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元素

问题发生流程试解释

以LZ的DEMO为例子:

// 以下为正常的CSS计算值得出流程,自顶向下

// 视口
// ┗html
// 意味着: 视口是html的包含块

视口 // height=600px
┗html // height:100% -> height=600px
 ┗body // height:100% -> height=600px
  ┕.wrapper // height:100% & min-height:720px; -> height=720px
   ┗.u-pagebg // height:100% -> height=720px

IE8中出现了什么样的差错呢,从现象尝试着解释一下bug的成因:

// 以下为IE8中的CSS计算值得出流程

视口 // height=600px
┗html // height:100% -> height=600px
 ┗body // height:100% -> height=600px
  ┕.wrapper // height:100% -> height≈600px
   ┗.u-pagebg // height:100% -> height=600px
              // 在计算完.u-pagebg的包含块的高度之后
              // .wrapper才受到min-height约束,如下
  ┕.wrapper // height:100% & min-height:720px; -> height=720px

解决方案

  • 去掉.wrapper上的overflow:hidden;
  • 若需要overflow:hidden;,加在不【同时设置了heightmin-height,且height计算值<min-height】的地方。(为了防止断句错误,用了【】来区分分句)

老实说,LZ这样的布局上为何需要overflow:hidden;,我看不出来太大意义。720px是一个非常高的值,比大部分用户的屏幕都要高。

况且这样的布局也用不着绝对定位,负margin定位也能做到。

overflow & absolute定位 是低版本IE里面布局bug的万恶之源之二,如果有兼容性要求,LZ使用之前请三思。


最后,IE10,IE11的IE8兼容性模式,都是扯淡。微软的IE想跟过去断离关系,又不肯断干净,偷偷把bug修复了,搞了个这么不伦不类的兼容性模式,在兼容性上毫无帮助。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号