css overflow失效的原因

摘要:
目前,海洋对此一无所知。它没有设置溢出:隐藏属性,该属性使黄色段落中本应剪切的所有部分都可见。它不仅污染海洋,还影响整个地球。情况非常紧急。即使海洋被设置为溢出:隐藏,只有蓝色海洋之外的黄色部分可以被剪裁。如图3所示,海洋此时处于亏损状态。Div.ocean{位置:相对;背景色:蓝色;120px;高度:120px;}div.land{位置:相对;100px;高度:100px;背景色:红色;溢出:隐藏;}p、 job{position:absolute;150px;height:110px;top:30px;left:30px;background color:yellow;满足第六个条件,这会使元素的包含块发生变化。

声明

转载自https://my.oschina.net/xuqianwen/blog/540587

项目中常常有同学遇到这样的问题,现象是给元素设置了overflow:hidden,但超出容器的部分并没有被隐藏,难道是设置的hidden失效了吗?
其实看似不合理的现象背后都会有其合理的解释。

我们知道,overflow属性值有这几种:
visible:声明内容不会被剪裁。比如内容可能被渲染到容器外面。
hidden:声明内容将被剪裁,并且也甭想使用滚动条来查看剪裁掉的内容。
scroll:声明内容将被剪裁,但有可能出现滚动条来查看被剪裁掉的内容。滚动条出现的位置在inner
border adge和outer padding adge之间。
auto:声明决策将依赖于客户端,优先使用scroll。

W3C标准中指明:
通常一个盒子的内容是被限制在盒子边界之内的。但有时也会产生溢出,即部分或全部内容跑到盒子边界之外。溢出将在满足下列条件之一时出现:

  1. 一个不换行的行元素宽度超出了容器盒子宽度。
  2. 一个宽度固定的块元素放在了比它窄的容器盒子内。
  3. 一个元素的高度超出了容器盒子的高度。
  4. 一个子孙元素,由负边距值引起的部分内容在盒子外部。
  5. text-indent属性引起的行内元素在盒子的左右边界外。

一个绝对定位的子孙元素,部分内容在盒子外。但超出的部分不是总会被剪裁。子孙元素的内容就不会被子孙元素和其包含块之间的祖先元素的overflow的设置所剪裁。

当溢出发生时,overflow属性约定了容器盒子是否剪裁掉超出其内边界的部分,并且决定是否出现滚动条来访问被剪裁掉的内容。它会影响到元素所
有内容的剪裁,但有个例外情况,即上面第6条所提到的:元素的子孙元素的包含块(Containing
blocks)是整个视窗(viewport)或是该元素的祖先元素,内容将不会被剪裁。包含块是什么呢?简单的说,就是可以决定一个元素位置和大小的
块。通常一个元素的包含块由离它最近的块级祖先元素的内容边界决定。但当元素被设置成绝对定位时,包含块由最近的position不是static的祖先
元素决定。

看起来有点绕,让我们来听个简单的故事吧。
html片段:

<div class=”ocean”>
<div class=”land”>
<p class=”joke”>
Mrs. Smith couldn’t get her husband to exercise.
She asked Mrs. Jones what she should do. Jones replied,
”Tape the remote control between his toes.”
</p>
</div>
</div>

style:

div.ocean{
position:relative;
background-color:blue;
120px;
height:120px;
}
div.land{
100px;
height:100px;
background-color:red;
overflow:hidden;
}
p.joke{
150px;
height:110px;
margin-top:30px;
margin-left:30px;
background-color:yellow;
}

上面的代码讲述的是这样一个故事:蓝色的海洋里有块红色的大地,红色大地内有个黄色的段子。由于段子样式的设置,它的部分内容超出了红色大地。为避
免黄色段子污染到蓝色海洋,红色大地警惕的为自己设置了overflow:hidden;这样超出大地的黄色部分就被剪掉了,我们看到的将是这样一派和谐
景象,如图1:
cssoverflow:hidden为什么会失效
图1:和谐的星球

如果事物都是这样有理有序,天下可不就太平了。没多久,黄色段子觉得凭自己的显赫身份不该受红色大地的控制,于是绞尽脑汁将自己变改成了绝对定位,一下子就摆脱了大地的束缚,如图2:

p.joke{
position:absolute;
150px;
height:110px;
top:30px;
left:30px;
background-color:yellow;
}

cssoverflow:hidden为什么会失效
图2:猖獗的段子

为什么会这样呢?这便是创造了上面提到过的第6个条件。当黄色段子变成position:absolute时,它的包含块已由原来的红色大地的内容
边界升级到了离它最近的position不是static的蓝色海洋了。而海洋此刻对此还一无所知呢,自身没有设置overflow:hidden属性,
导致黄色段子本该被裁剪的部分全部可见,不仅污染到海洋,还影响到整个星球,情况万分火急啊。即使这时海洋设置上overflow:hidden,也只能
将超出蓝色海洋的黄色部分剪裁,就像图3,海洋此时是手足无措啊。
cssoverflow:hidden为什么会失效
图3:无辜的海洋

俗语说的好,魔高一尺道高一丈,解铃还须系铃人。红色大地怎就甘心段子跑出去呢。怎么说大地终归是段子的祖先元素,怎么能甘心由着段子胡作非为呢。
于是,大地历尽千辛,寻得秘籍,在自己的样式中添加position:relative属性,将段子的包含块又改成了大地来决定。这下段子就乖乖的被关起
来了。星球看起来又回到了最初的状态。

div.ocean{
position:relative;
background-color:blue;
120px;
height:120px;
}
div.land{
position:relative;
100px;
height:100px;
background-color:red;
overflow:hidden;
}
p.joke{
position:absolute;
150px;
height:110px;
top:30px;
left:30px;
background-color:yellow;
}

所以说,hidden并没有失效,而是有可能我们遇到的情况恰好满足了第6个条件,使得元素的包含块发生了变化。上面的故事中,也提到了在遇到‘hidden’失效的情况时,可以根据需要来改变元素的包含块来达到正义的目的。

解决办法:在父元素上加一个z-index;妥妥哒

免责声明:文章转载自《css overflow失效的原因》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.NET Framework 3.5 sp1离线安装方案中标麒麟(龙芯CPU)--docker基础镜像制作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Unity3D 物体移动方法总结

1. 简介     在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 2. 通过Transform组件移动物体     Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改...

webstorm下的sass自动编译和移动端自适应实践

1、安装Ruby 2、安装sass 3、webstorm配置file watcher 4、移动端自适应 1、安装Ruby   安装Ruby,有多种方式,打开官网下载 因为,使用的是window选择RubyInstall,下载地址 RubyInstall下载地址 选择对应系统的版本,下载完成,安装 添加到path,建议勾上,安装完成后,打开开始面板,...

在HTML5中,用getCurrentPosition()获取用户的当前位置

转:https://blog.csdn.net/xiaoxia188/article/details/84703576 getCurrentPosition(successCallback, errorCallback,PositionOptions);successCallback: 表示获取到的用户数据位置。该对象包含三个属性:coords、addre...

3D画廊

3D画廊 之前我都是写的学习的内容,我在写这些教程时遇到有趣的炫酷的小例子也会专门拿出来写一篇文章,今天就写一个酷炫的小例子,叫3D画廊,它是属于ViewPage的进阶版。 此项目下载地点:https://github.com/qySvip/3D-gallery 下面的指示器是使用的一大神的第三方库,会在文章下方简单讲述一下。 效果图 3D画廊的实现 首...

用HTML,CSS和JavaScript创建iPhone/iPad应用程序

象大多数iPad粉丝和程序员一样,我有一个梦想,那就是如果不需要昂贵的Apple设备,不要繁琐的审批程序,不要为发布应用交钱就能开发iPad 应用程序该多好.现在这个梦想就要实现了,那就是网页应用程序. 那么,怎样才能让网页象看起来象本机程序一样呢?你需要做这些工作: 全屏幕:(去掉浏览器的地址栏和按钮栏);防止窗口滚动和缩放; 响应多点触摸和手势事件;...

第一百八十节,jQuery-UI,知问前端--消息提示 UI

jQuery-UI,知问前端--消息提示 UI 学习要点:   1.HTML 部分   2.CSS 部分   3.jQuery 部分 通过前面已学的 jQuery UI 部件,我们来创建一个注册表单。 html <div id="reg" title="会员注册"> <p> <label fo...