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
有这样的一种情况,有的时候,我们的父级元素设置了高度,一般来说,父级元素的高度是根据子元素的高度来自适应撑开的,如果我们的父级元素也设置了高度,那么其高度就不会随着子元素的的大小而自适应,也许有的时候 ...
随机推荐
- php 判断字符串长度和字符串为纯数字字符串
<?php $str="123456a"; $str_a=123456"; if(is_numeric($str)){ 返回 false }else{ 返回 tru ...
- css中的线及vertical-align
行内元素格式化顺序: 相关概念: leading(行间距):指填充在两行文字间的铅条,等于line-height 和 font-size之差,其中一半leading加到文字上方,另一半leading ...
- input文字垂直居中和按钮对齐问题,兼容IE8
1.盒子模型问题:请CSS重置 2.按钮不对齐:请浮动或者vertical-align:middle;然后计算宽高,使其对齐 : 3.IE8文本不居中:line-height属性 注意:IE8 ...
- ecloipse背景修改豆沙
Eclipse背景色的修改 Eclipse背景色的修改,修改为豆沙色 值是85 123 205 一.修改编辑区 ①这个比较简单一般都会不多说. 1.首先点击Window 然后选择Preferen ...
- LeetCode 题解之Find Peak Element
1.题目描述 2.题目分析 在数组的首尾各加入INT_MIN ,然后遍历数组. 3.代码 int findPeakElement(vector<int>& nums) { ) ; ...
- spring boot(17)-@Async异步
验证码的异步机制 上一篇讲过可以用邮件发验证码,通常我们在某网站发验证码时,首先会提示验证码已发送,请检查邮箱或者短信,这就是图中的1和3.然而此时查看邮箱或短信可能并没有收到验证码,往往要过几秒种才 ...
- [WINCE|VS2008] 用在PC上调试WINCE程序
http://www.danielmoth.com/Blog/deploy-to-my-computer.aspx 作者:The Moth 步骤: 1. 在VS2008中打到 Device Optio ...
- Java简单的数据库连接
package test.postgre; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...
- python基础_特殊符号
#\n 回车符 #\r 换行符 #\s 空格 #\t tab符号,不知道?开个txt文本,然后按电脑的tab键,就是caps lock上面那个,卧槽,看到一个大长空格(也可能是个超短空格),这个就是t ...
- Oracle重启操作步骤
有时候在服务中重启了oracle之后,数据库并不能正常访问,可以通过以下步骤: 在windows服务中启动数据库服务: 在windows命令窗口中输入命令:sqlplus /nolog 在sql> ...