overflow:hidden 影响inline-block元素周围元素下移
前言:
最近在切页中,我想实现左边一个类似下拉选框,且不允许输入,右边有一段垂直居中的文字描述的效果。我对文字用的是p标签。其实可以用个i/b/em等其他行内标签,同时也具有一定语义,做为强调提示,(当时事实证明用行内标签问题一样存在)。最后我的问题出现了。一个设置了overflow:hidden 的inline-block元素旁边的文字与边框的下边放佛是对齐的。因为vertical-align属性的默认值时baseline,同是文字又只有一行那么它们的baseline应该是对齐的啊!!
当修改元素的vertical-align属性为baseline以外的其他值时可以看到文字相对边框的垂直位置发生了变化。初步能确定是跟对齐方式有关,并且是由于基线(baseline)的位置发生了变化而不再是原来的以x的下边线做为基线了。那么是什么原因造成位置的偏移呢?经过测试,发现是overflow:hidden的这个属性影响了inline-block元素baseline的位置。那么overflow:hidden的inline-block元素的baseline怎样设置的呢?请继续往下读......
问题描述:
overflow:hidden怎样影响inline-block的baseline的位置。导致文字不与inline-block的文字的对齐,而是向下偏移。

化繁为简,代码如下,效果运行请看demo。
html结构
<div class="div1">
我是div1
</div>
<div class="div2">
我是div2
</div>
css 样式
.div1 ,
.div2 {
display: inline-block;
}
.div1 {
width: 180px;
height: 40px;
line-height: 40px;
overflow: hidden;
border: 1px solid #000;
}

div2和左边的框中间没对齐。 默认对齐方式是baseline.
原因:
vertical-align的默认值是baseline。当div1 设置了属性overflow:hidden后,baseline会设置在bottom margin的边缘。详情戳css规范。
规范的截图:

翻译:'inline-block'(盒)的基线是它的最后一个常规流中的行盒的基线,除非它没有流内行盒或者它的'overflow'属性的计算值不为'visible',此时基线是bottom margin边。
所以div2的文字和div1的下边框对齐。
注意:如果元素内部只有脱离常规流的行盒,如被设置了float 除了none以外的值,position为fixed和absolute,也会出现同样的情况。demo
解决方案:
方案1.将设置了overflow:hidden的元素 的垂直对齐方式设置为vertical:middle;将该盒的竖直中点与父级元素的baseline对齐。demo2.

此方案需要写的代码少,当它周围有其他元素的时候,也能解决。 兼容问题,在支持inline-block的浏览器中都支持。想要ie 6,7兼容可以触发haslayout,并将元素用ie6、7的hack设为inline盒模型。使其表现出inline-block的特性。
代码如下:
.div1,
.div2 {
display: inline-block;
*display: inline; /*ie7及以下浏览器 以内联盒模型渲染*/
*zoom: 1; /*触发ie的haslayout*/
}
.div1 {
width: 180px;
height: 40px;
line-height: 40px;
overflow: hidden;
border: 1px solid #000;
vertical-align: middle;
}
方案2. 稍微麻烦点,对受影响的另一个inline-block的元素处理,让它的line-height和div1的height相同。并且让自己的垂直对齐方式为vertica-align:middle; demo3
.div1,
.div2 {
display: inline-block;
*display: inline; /*ie7及以下浏览器 以内联盒模型渲染*/
*zoom: 1; /*触发ie的haslayout*/
}
.div1 {
width: 180px;
height: 40px;
line-height: 40px;
overflow: hidden;
border: 1px solid #000;
vertical-align: middle;
}
.div2 {
line-height: 40px;
vertical-align: top;
}
此方法,只是让它看起来在旁边盒子的垂直中点位置,且如果旁边的元素比较多,要为这些元素一一设置属性。不建议使用。
延伸问题:
如果inline-block元素旁边的是inline元素,有同样的影响吗?
答案是 yes ,请看demo4,原因也是同上。
关于baseline 怎么确定,规范上没有具体定义,user agent自己规定。
以下摘自w3c规范
如内联格式化上下文节所述,用户代理把内联级盒排列在一个行盒的垂直堆叠里。行盒的高度由下列规则决定:
- 计算行盒中每个内联级盒的高度时,对于可替换元素,inline-block元素和inline-table元素,这个值就是其margin box的高度;对于内联盒,这个值是其'line-height'(见“计算height与margin”和“行距(Leading)与半行距”中的内联盒的高度)
- 内联级盒是根据其'vertical-align'属性竖直对齐的。如果它们是'top'或者'bottom'对齐,它们必须对齐得让行盒高度最小化。如果这样的盒足够高,存在多个解,而CSS 2.1没有定义行盒基线的位置(即,strut的位置,见下文)
- 行盒高度是最高的盒的top与最低的盒的bottom之间的距离(包括下面'line-height'中解释的strut)
空内联元素生成空的内联盒,但这些盒仍然具有margin,padding,border和line height,并因此会影响这些计算,就像有内容的元素一样。
补充 strut:对于一个内容由内联级元素组成的块容器元素,'line-height'指定了元素内行盒的最小高度。这个最小高度包含基线上方的最小高度和下方的最小深度,就像每个行盒以一个具有该元素的字体和行高属性的0宽内联盒开始。我们把这种假想盒叫做"strut"(这个名字是受TeX的启发)。
参考资料:
https://www.w3.org/TR/CSS2/visudet.html#strut
http://blog.csdn.net/iefreer/article/details/50421025
overflow:hidden 影响inline-block元素周围元素下移的更多相关文章
- [Web 前端] inline-block元素设置overflow:hidden属性导致相邻行内元素向下偏移
cp from : https://blog.csdn.net/iefreer/article/details/50421025 在表单修改界面中常会使用一个标签.一个内容加一个修改按钮来组成单行界面 ...
- overflow:hidden 影响布局的问题
a 与 b 都是 inline-block且高与父元素 c 相同均为 30px,而在a加上 overflow:hidden; 会使 a 的底线与整个父元素 c 的 text baseline 对齐,相 ...
- overflow: hidden用法,不仅仅是隐藏溢出
overflow:hidden是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. <!DOCTYPE html> <html ...
- overflow:hidden的用法
overflow:hidden是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. <%@ Page Language="C#& ...
- 关于css中overflow:hidden的使用
overflow:hidden有两个用处经常用到: 1.通过设定自身的高度,加上overflow:hidden可以隐藏超过容器本身的内容: 但是,小编在以往的使用中,发现了一个问题,只要父级容 ...
- 关于overflow:hidden的作用(溢出隐藏,清除浮动,解决外边塌陷等等)
1.overflow:hidden 溢出隐藏 给一个元素中设置overflow:hidden ,那么该元素的内容若超出了给定的宽度和高度属性,那么超出的部分将会被隐藏,不占位. 代码如下: 运行结果 ...
- 整理display:none;和visibility:hidden;和overflow:hidden;的区别
1.display:none; 这个属性隐藏元素,不占网页任何空间,彻底隐藏,消失 2.visibility:hidden; 占据空间,但是无法点击.隐藏了这个层,看不到,却能摸得着 3.over ...
- 【css】主要的块状元素(block element)和内联元素(inline element行内元素)
内联元素:只在行内发生作用,设置宽高不起作用,不会影响文字内容,使其换行等.竖直方向和间距也不起作用 display可以强制转换行内元素和块状元素,还可以取消显示none 块元素(bloc ...
- 为什么我们要给父级元素写overflow:hidden
有这样的一种情况,有的时候,我们的父级元素设置了高度,一般来说,父级元素的高度是根据子元素的高度来自适应撑开的,如果我们的父级元素也设置了高度,那么其高度就不会随着子元素的的大小而自适应,也许有的时候 ...
随机推荐
- Android Authenticator使用(转)
出处:http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/ 这篇文章个人觉得讲的非常好,比官方文档还要清晰,将 ...
- 回归JavaScript基础(六)
主题:引用类型Date.RegExp的介绍. 上节主要主要介绍了Object.Array引用类型.这节将继续为大家介绍引用类型,并对书中的一些知识点进行总结与归纳,也借此巩固自己对JavaScript ...
- top,job,user,file,alias
1.系统进程 2.系统资源管理 3.作业管理 4.用户管理 5.文件权限 6.别名定义 一.系统进程 1.进程的定义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了 ...
- [C#] Microsoft .Net框架SerialPort类的用法与示例
从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,用户可以非常简单地编写少量代码就完成串口的信息收发程序.本文将介绍如何在PC端用C# ...
- gitlab 灾备
Gitlab创建备份 使用Gitlab一键安装包安装Gitlab非常简单,同样的备份恢复与迁移也非常简单.使用一条命令即可创建完整的Gitlab备份: gitlab-rake gitlab:ba ...
- Jmeter入门--断言(检查点)
断言是在请求的返回层面增加一层判断机制.因为请求成功,并不代表结果一定正确,因为此需要检查机制提高测试准确性. 1.响应断言 模式匹配规则: 包括:返回结果包括你指定的内容,支持正则匹配 例如: 响应 ...
- 要提高SQL查询效率where语句条件的先后次序应如何写
我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句 ...
- CSS学习摘要-浮动与清除浮动
以下从浮动到BFC的段落 摘自MDN 网络开发者 float 浮动 float CSS属性指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素环绕它.该元素从网页的正常流动中移除,尽管仍然保持部 ...
- 铁乐学python_day10_作业
1.继续整理函数相关知识点,写博客. 2.写函数,接收n个数字,求这些参数数字的和.(动态传参) def sum_n(*args): sum = 0 for i in args: sum += i r ...
- XtraEditors一、总体介绍
一.所有编辑器的公共功能 全部都可以绑定数据: 全部都可以独立使用或用于由 Developer Express 提供的容器控件 (XtraGrid.XtraVerticalGrid.XtraTreeL ...