前言:

最近在切页中,我想实现左边一个类似下拉选框,且不允许输入,右边有一段垂直居中的文字描述的效果。我对文字用的是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规范

内联格式化上下文节所述,用户代理把内联级盒排列在一个行盒的垂直堆叠里。行盒的高度由下列规则决定:

  1. 计算行盒中每个内联级盒的高度时,对于可替换元素,inline-block元素和inline-table元素,这个值就是其margin box的高度;对于内联盒,这个值是其'line-height'(见“计算height与margin”“行距(Leading)与半行距”中的内联盒的高度
  2. 内联级盒是根据其'vertical-align'属性竖直对齐的。如果它们是'top'或者'bottom'对齐,它们必须对齐得让行盒高度最小化。如果这样的盒足够高,存在多个解,而CSS 2.1没有定义行盒基线的位置(即,strut的位置,见下文)
  3. 行盒高度是最高的盒的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元素周围元素下移的更多相关文章

  1. [Web 前端] inline-block元素设置overflow:hidden属性导致相邻行内元素向下偏移

    cp from : https://blog.csdn.net/iefreer/article/details/50421025 在表单修改界面中常会使用一个标签.一个内容加一个修改按钮来组成单行界面 ...

  2. overflow:hidden 影响布局的问题

    a 与 b 都是 inline-block且高与父元素 c 相同均为 30px,而在a加上 overflow:hidden; 会使 a 的底线与整个父元素 c 的 text baseline 对齐,相 ...

  3. overflow: hidden用法,不仅仅是隐藏溢出

    overflow:hidden是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. <!DOCTYPE html> <html ...

  4. overflow:hidden的用法

    overflow:hidden是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解. <%@ Page Language="C#& ...

  5. 关于css中overflow:hidden的使用

    overflow:hidden有两个用处经常用到: 1.通过设定自身的高度,加上overflow:hidden可以隐藏超过容器本身的内容:     但是,小编在以往的使用中,发现了一个问题,只要父级容 ...

  6. 关于overflow:hidden的作用(溢出隐藏,清除浮动,解决外边塌陷等等)

    1.overflow:hidden  溢出隐藏 给一个元素中设置overflow:hidden ,那么该元素的内容若超出了给定的宽度和高度属性,那么超出的部分将会被隐藏,不占位. 代码如下: 运行结果 ...

  7. 整理display:none;和visibility:hidden;和overflow:hidden;的区别

    1.display:none;  这个属性隐藏元素,不占网页任何空间,彻底隐藏,消失 2.visibility:hidden;  占据空间,但是无法点击.隐藏了这个层,看不到,却能摸得着 3.over ...

  8. 【css】主要的块状元素(block element)和内联元素(inline element行内元素)

      内联元素:只在行内发生作用,设置宽高不起作用,不会影响文字内容,使其换行等.竖直方向和间距也不起作用   display可以强制转换行内元素和块状元素,还可以取消显示none   块元素(bloc ...

  9. 为什么我们要给父级元素写overflow:hidden

    有这样的一种情况,有的时候,我们的父级元素设置了高度,一般来说,父级元素的高度是根据子元素的高度来自适应撑开的,如果我们的父级元素也设置了高度,那么其高度就不会随着子元素的的大小而自适应,也许有的时候 ...

随机推荐

  1. opencv图像处理时使用stringstream批量读取图片,处理后并保存

    简介: 同文件输入输出流一样,使用stringstream可以批量读取图片,处理后并进行保存.因为C++中头文件 stringstream既可以从string读数据也可向string写数据,利于其这个 ...

  2. ArcGIS10.3+Oracle12C+ArcGIS Server10.3安装布署(之三)

    1.将Oracle的客户端切换到64位 (1)将C:\下的instantclient_12_1目录重命名为instantclient_12_1X86 (2)从Oracle的官方网站下载   insta ...

  3. ArcGIS for JavaScript 关于路径开发的一些记录(一)

    今年毕业,进入公司的第一个任务就是单独负责一个项目的地图模块,用ArcGIS API for JavaScript来开发web地图.花了大概一个礼拜的时间学会了安装和搭建ArcGIS Server和A ...

  4. AR中的SLAM(二)

    写在前面 本文想讨论一下AR的架构和SLAM在其中的作用. AR AR的框架可以简单划分为感知和交互两部分. 感知部分主要负责信息的收集和处理.信息主要通过不同的传感器收集,包括图像.设备加速度.距离 ...

  5. Android设置日期DatePickerDialog

    设置日期DatePickerDialog package com.example.testview; import java.util.Calendar; import java.util.Date; ...

  6. leetCode题解单链表反转

    1.题目描述 反转一个单链表.链表节点结构如下: struct ListNode { int val; ListNode* next; }; 2.问题分析 特殊情况是输入的头结点是一个空的,或者只有一 ...

  7. 纲举目张:打通MySQL架构和业务的任督二脉

    目前,在很多OLTP场景中,MySQL数据库都有着广泛的应用,也有很多不同的使用方式.从数据库的业务需求.架构设计.运营维护.再到扩容迁移,不同的MySQL架构有不同的特点,适应一定的业务场景,或者解 ...

  8. 使用vue做项目

    使用vue做项目需要用到node.js的npm来管理包 所以我们需要先下载node.js然后通过node的npm来管理包  安装完 nodejs后 我们需要执行 npm install vue-cli ...

  9. Linux下安装Tomcat7

    一.Tomcat7软件包下载 Tomcat下载地址http://tomcat.apache.org/download-70.cgi 下载完成后, 将软件包apache-tomcat-7.0.82.ta ...

  10. Python入门-模块4(序列化----json模块和pickle模块)

    序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes.反之,把硬盘里面的数据读到内存里,叫反序列化.