css之overflow与padding-right

2012年11月29日 来源:昔之追忆 0条评论 849 views 标签:overflow, padding-right, 滚动条

前几天遇到一个问题,一直没找时间把它记下来,今天终于抽出点时间来看看它!对于我来说,它是一个问题,也许是我之前对它理解不够深,所以才会走入陷阱,好了,言归正传,我们来看看这个问题。
首先,准备如下html内容:

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试overflow与padding-right</title>
    <style>
        html, body, div {margin: 0; padding:0; border: 0 none}
        .outer {background: https://csswang.com/ccc; width: 200px; padding: 50px; overflow: auto; height: 300px; margin:20px auto}
        .inner {width: 250px; background: red}
    </style>
</head>
<body>
    <div class="outer">
        outer
        <div class="inner">
           inner 
        </div>
    </div>    
</body>
</html>

内容比较简单,我们来看看chrome下的效果:

不知各位看出什么名堂没?

外围div.outer的宽度为200px,也就是div.outer有200px的空间可以来存放内部元素或文本,对于任何超出的部分,使用overflow: auto,即出现滚动条

现在内部元素div.inner的盒子宽度是200px(width) + 50px(padding-right),这个时候div.outer应该容纳不下这么一个大元素,理论上,个人觉得应该出现滚动条

但是,chrome却没有出现,ie8也没有出现滚动条,ie7却出现了滚动条(符合我的设想),firefox系列浏览器也没有出现滚动。

难道padding-right被忽略了?但是用开发工具看了一下盒子模型,完全正常,那是什么原因造成的呢?

在w3c官网上查查文档,结果找到了如下一段话:

Whenever overflow occurs, the &https://csswang.com/8216;overflow’ property specifies whether a box is clipped to its padding edge, and if so, whether a scrolling mechanism is provided to access any clipped out content.

要看w3c原文档介绍,可以点击此处

原来,并不是padding-right失效了,而是浏览器在应用overflow样式时,是剪切到了一个box的padding edge,内部元素的padding-right部分对于div.outer还是可见的(有点绕口令),所以浏览器不对padding-right部分出滚动条,因为浏览器不认为padding-right部分超出了div.outer的可视范围。

所以如果div.inner的盒子宽度 = width[div.outer + padding-right],就会造成一种padding-right无效的错觉。

尽管w3c是如此解释,但我还是觉得应该出现滚动条才符合逻辑吧!!!

为了验证我的想法,我将内部元素换是一张图片,终于出现了想象中的滚动条,比如,我把div.outer改成如下代码:

<div class="outer">
    <img src="test.png" width="250" height="93" />
</div>

est.png为宽250px,高93px的图片,这个时候,chrome的渲染效果如下:

由以上的截图,可以看到,overflow仍然是剪裁到了padding-right edge上,但是div.outer出现了想象中的滚动条,我感觉这个才表现得符合逻辑。

到了这里,这个问题还没完,哎,真是郁闷,我们再来看看,如果img外面包多一层div,会是什么情况呢?

如下代码所示:

<div class="outer">
    <div style="float:left"> <!--float是为了让img撑开这个div,使这个div的宽高与img一致-->
        <img src="test.png" width="250" height="93" />
    </div>
</div>

啥都不用说,我们来看效果图:

我勒个去,不出所料,滚动条又没了!!!

小结

对于一个设置了width以及overflow的div.outer,如果div.inner的width值没有超过div.outer的width值,chrome等浏览器不会出现滚动条(div.outer无视padding值);反之,则出现滚动条。



无觅m88帮助网站插件,快速提升流量

你也可以分享到: