牛骨文教育服务平台(让学习变的简单)
博文笔记

css中overflow和position的搭配

创建时间:2015-11-12 投稿人: 浏览次数:2887

大数据控制平台查询结果的表格的表头需要做过滤功能,我的想法是在每一列的表头上加个过滤小图标,当点击它时弹出个相对右对齐的小框,框里有个输入框,一个过滤按钮,一个清空按钮。类似下图:

一般来说,就是将表头每一格都设置成

position:relative;

然后将弹框设置成

position:absolute; right:0px; top:35px; z-index:999;

 即可实现。

但是我设置后弹框竟然没有显示出来。

经过我的检查,发现是因为表头的样式中有

overflow:hidden;

是不是它导致的,于是我做了个测试:

<style> .parent{     width:100px;     height:100px;     background-color:red;     color:white;     font-size:20px;     position:relative; } .child{     width:100px;     height:100px;     background-color:black;     color:white;     font-size:16px;     position:absolute;     left:50px;     top:50px; } </style>  <div class="parent">     Parent     <div class="child">Child</div> </div>

显示结果为:

 

此时子元素超过父级的部分也显示出来了。

2.父级设置了overflow:hidden

<style> .parent{     width:100px;     height:100px;     background-color:red;     color:white;     font-size:20px;     position:relative; overflow:hidden; } .child{     width:100px;     height:100px;     background-color:black;     color:white;     font-size:16px;     position:absolute;     left:50px;     top:50px; } </style>  <div class="parent">     Parent     <div class="child">Child</div> </div>

显示结果为:

此时子元素超过父级的部分被隐藏掉了,果然是overflow捣的乱。

但是不是只要有overflow:hidden子元素就显示不出来呢?

3.父元素只有overflow:hidden,没有position:relative

<style> .parent{     width:100px;     height:100px;     background-color:red;     color:white;     font-size:20px; overflow:hidden; } .child{     width:100px;     height:100px;     background-color:black;     color:white;     font-size:16px;     position:absolute;     left:50px;     top:50px; } </style>  <div class="parent">     Parent     <div class="child">Child</div> </div>

显示结果为:

和第一种情况结果几乎一样,Parent中没有设置position:relative;或者position:absolute;或者position:fixed时,子元素会继续往上级找,找到有这几个设置中其中任意一个元素为止,继而将其作为子元素的相对位置参考对象,本例中只有一个父级没有找到,这时就默认将body作为其位置参考对象。

 

既然这样我就把表头处的overflow:hidden去掉,最外层再套个div,将其设置overflow:hidden,这样就既不影响之前隐藏超出部分的功能,也能满足现在的弹框显示功能。

4.父级没有overflow:hidden,最外层加个div并设置其overflow:hidden

<style> .wrapper{     width:100px;     height:100px;     background-color:blue;     color:white;     font-size:24px; position:relative; } .parent{     width:100px;     height:100px;     background-color:red;     color:white;     font-size:20px; overflow:hidden; } .child{     width:100px;     height:100px;     background-color:black;     color:white;     font-size:16px;     position:absolute;     left:50px;     top:50px; } </style>  <div class="wrapper"> Wrapper <div class="parent">     Parent     <div class="child">Child</div> </div> </div>

显示结果为:

由此可看出子元素Child显示出来了。

也就是说只要父级中position:relative/absolute/fixed和overflow不同时存在就可以了,是不是这样呢?

5.父元素只有position:relative没有overflow:hidden,最外层加个div并设置其overflow:hidden

<style> .wrapper{     width:100px;     height:100px;     background-color:blue;     color:white;     font-size:24px; overflow:hidden; } .parent{     width:100px;     height:100px;     background-color:red;     color:white;     font-size:20px; position:relative; } .child{     width:100px;     height:100px;     background-color:black;     color:white;     font-size:16px;     position:absolute;     left:50px;     top:50px; } </style>  <div class="wrapper"> Wrapper <div class="parent">     Parent     <div class="child">Child</div> </div> </div>

显示结果为:

可以看到此时Child超出的部分仍然被隐藏了,这是个很奇怪的事,大家都知道有些样式属性是可以被继承的,我查了mdn后发现这两个都是无法继承的,详情参见position和overflow.

唯一可以解释的就是position:absolute的子元素的显示隐藏和其参照位置的父级元素的息息相关,皮之不存,毛将焉附,如果父级都被限制超出的部分会被隐藏,那么子元素也会受到相同命运,不管它的position是不是absolute。

经过上述的实验过程得出的结论,我将表头去除了position:relative样式,外层又套了个div设置position:relative,解决了弹框显示的问题。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。