当前位置: 首页 > Web前端 > CSS

由一个绝对定位引发overflow:auto滚动问题产生的关于包含块(containing block)的思考

时间:2023-03-31 11:10:21 CSS

一个绝对定位触发溢出:思考包含块自动滚动导致的问题框显示其详细内容。简化场景的代码如下:我是一个列表项我是一个浮动框

.box{高度:200px;边框:1px纯红色;溢出:自动;}.item{位置:相对;高度:150px;border-bottom:1pxsolidblue;}.susp{position:absolute;左:0;顶部:150px;高度:100px;background-color:#eee;}预览我以为效果是这样的:实际是这样的:心碎了,为什么绝对定位可以触发容器的滚动效果?以前用css太随意了,完全没有考虑这些问题。问题分析还好在StackOverflow上找到了居然有人问过这个问题。。。下面的回答其实不是很清楚,但是看到了核心概念containingblock,也就是containingblock。嗯,我对包含块解释清楚有点困难,因为我一直没看懂解释...直接搬W3C中文规范的定义:根元素所在的包含块,叫做初始包含块rectangle对于其他元素,如果元素的位置是'relative'或'static',则包含块由其最近的块容器祖先box的内容边界形成如果元素具有'position:fixed',则包含块由建立连续媒体的视口或分页媒体的页面区域。如果元素具有“position:absolute”,则包含块由最近的“position”作为“absolute”、“relative”或“fixed”的祖先。对比这个定义,我们现在的情况是符合第四条的,我的浮动框是绝对的,列表项相对的是它的包含块,列表项的包含块是容器框。明白这一点应该就能猜出问题了。浮动框的包含块属于容器,所以它的高度可以触发容器的滚动。虽然我在官方规范中没有找到对应的解释,但是这样理解应该是没有问题的,还请各位大神给个更好的分析。解决方案如果找到问题的原因,问题就会得到解决。既然是因为浮动框的包含块在容器内部,那么我们可以让浮动框的包含块在它的外面,包含块会默认为初始的包含块就够了,除非浮动框的高度超过页面,会触发页面的滚动……但是浮动框的设计高度绝对不可能超过页面视口。修改后的代码如下:我是一个列表项
我是一个浮动框.box{高度:200px;边框:1px纯红色;overflow:auto;}.item{/*position:relative;*/高度:150px;border-bottom:1pxsolidblue;}.susp{position:absolute;/*左:0;*//*顶部:150px;*/高度:100px;background-color:#eee;}其实就是注释掉列表项的position:relative,让浮动框的包含块指向初始包含块,但是这个时候要注意不能添加定位,因为想不通,所以注释掉left和top,把悬浮框的div放在列表项的div旁边,这样悬浮框就是一个BFC,实现我们的位置效果想。这个其实和BFC关系不大,不过之前也没有总结过,所以有空再给出参考1和参考2总结一下。总结还是那句话,如果一个block的containingblock在容器内部(包括容器本身),那么它的高度就会触发容器的滚动。参考文中的StackOverflow问题