display:inline-block属性是一个很神奇且被低估的属性。inline-block即行内块元素,具体而言就是:将对象呈递为内联对象(inline),但是对象的内容作为块对象呈递(block),两旁的内联对象会被呈递在同一行内,允许空格。简而言之就是:inline-block 的元素既具有 block 元素可以设置宽高的特性,同时又具有 inline 元素默认不换行的特性。

目前浏览器支持情况: 除IE6/7不支持,IE8+及高级浏览器均支持(低版本Firefox私有属性-moz-inline-box也可实现类似效果)

疑问一: IE6/7真的不支持inline-block吗?

答疑:其实从 IE5.5开始IE就支持 inline-block 了,且看微软IE浏览器的说法:

"The inline-block value is supported starting with Internet Explorer 5.5. You can use this value to give an object a layout without specifying the object's height or width."

也就是说:display:inline-block 是可以触发hasLayout的,触发了hasLayout的元素表现出来的特征就是一个独立的矩形容器,可以设置宽高而且不受外部元素的影响. 但推究IE5.5推出时间2000年,而W3C官方提出这一概念则是在2002年,因而 IE5.5及IE6/7所理解的inline-block并不能等同于CSS2.1中的统一概念,因为 IE5.5 比 CSS2.1 更早提出 inline-block 的概念并作为所谓的「私有属性值」使用,所以二者表现出来的效果是不完全一致。

疑问二:IE6/7中行内元素和块状元素都能使用 inline-block 达到预期效果吗?

答疑:对行内元素而言:行内元素已经具有了在同一行并排显示的能力,但不能像块级元素那样设定宽高等属性,因而,IE低版本中行内元素欲达到官方inline-block效果,只需直接设定 display: inline-block 或者 设置 zoom:1 来触发Layout就可以了。

对块状元素而言:block 元素对 inline-block 支持不完整,如果要达到类似的效果,需要先设置为 display:inline,然后使用 zoom:1 等触发hasLayout。(首先让 block 元素转化为 inline 元素,强制其不换行;然后通过 zoom:1 触发hasLayout,使其可以设置宽高)

疑问三:如何看待display:inline-block 后的元素产生水平空隙?

答疑:W3C制定标准中元素设定了这一属性后,元素之间会出现少许水平间隙,经各浏览器测试:在高级浏览器( webkit, o, moz, IE9+)中,无论是块状还是行内元素,设定这一属性后水平间隙均会出现;在IE6/7中,行内元素产生空隙,而块状元素无空隙!

其实元素之间的空隙是空白符( 空格+回车符+换行符+制表符等 ),行内元素默认display也存在这种间隙。

所以这并不是 inline-block 后产生的 bug,而是因为 inline-block 具有 inline 元素固有的特性。那么为何 IE6、7 block 元素没有产生空隙呢?其实前面也提到了 IE 的hasLayout,具有独立性,所以产生hasLayout的元素之间表现出来互不影响,这也再次表明 IE6、7 中的 inline-block 不能等同于 CSS2.1 中的 inline-block。如果非要说是有 bug, IE6、7 block 元素 inline-block 后不产生空隙才是 bug。

疑问四:如何去掉display:inline-block 后的元素产生的水平空隙?

答疑:最简单直观的办法是:删除换行符,在同一行或者前后标签尾首相连。这种办法实用性差。

考虑到 所谓的空格产生的空格符本质上是字符,只不过是一种“只占位不显示内容”的字符,尝试用相关几个属性:font-size、margin负值及letter-spacing 和 word-spacing来解决。

1.设定 font-size: 0

理论上,字符大小由font-size控制,取值越大,空格越大;取值越小,空格越小。

如下图所示:

但font-size:0 这一属性并非所有浏览器都支持:webkit内核浏览器考虑到过小字符不利于阅读,不支持设定的支付大小<12px( -webkit-text-size:none 虽然能实现任意大小的设定,但会直接导致页面文字无法缩放,这对于用户来说显然是不友好的,慎用!); MOZ+O+IE8+内核浏览器能完美支持这一属性; IE6/7能支持但对象之间总存在1px间距。

综上,直接设定font-size:0并不能完美解决这一问题。

2.设定 margin负值

基本思想:设定对象向左偏移空格宽度个值,同时设定父框等值的左内边界( 保证第一个对象不溢出 )。这种方法在所有浏览器中均能看到效果,但考虑到inline-block 产生的空隙与父元素设定的字体及字体大小相关,一方面,相同取值在opera和firefox中并不能实现同其他浏览器相同效果;另一方面,取值不准可能出现对象之间的重叠和覆盖。综上,直接设定margin负值并不能完美解决这一问题。

3.设定letter-spacing 和 word-spacing

letter-spacing可以控制文字间的水平距离,支持负值,可以让文字水平方向上重叠,同时对于彼此不存在空格的块状元素之间不起作用。经测试,在高级浏览器中只要设置得当,完全能实现去除空格的效果。

总结:

»IE5.5 后开始支持 inline-block, 比 CSS2.1 更早提出 inline-block 的概念并作为所谓的「私有属性值」使用。但是它所支持的 inline-block 不能等同于 CSS2.1 中的 inline-block,IE 5.5、6、7 、8(Q)中 block 元素对 inline-block 支持不完整,因此二者表现出来的效果是不完全一致。

»产生 inline-block 空隙的根本性原因是:HTML 中的换行符、空格符、制表符等合并为空白符,字体大小不为 0 的情况下,空白符自然占据一定的宽度,因此产生了元素间的空隙。

»慎用 -webkit-text-size-adjust:none,它将会导致页面无法通过缩放来改变字体大小。

» block水平的元素inline-block化后,IE6/7没有换行符间隙问题,其他浏览器均有;» inline水平的元素inline-block后,所有主流浏览器都有换行符/空格间隙问题;» font-size:0,去除换行符间隙,在IE6/7下残留1像素间隙,webkit内核浏览器无效,其他浏览器都完美去除;» letter-spacing负值可以去除所有浏览器的换行符间隙,但是,Opera浏览器下极限是间隙1像素,0像素会反弹,换行符间隙还原。

综上可得出全兼容方案:

父框:

font-size:0;// 所有浏览器

letter-spacing:-5px;// Safari 等不支持字体大小为 0 的浏览器*letter-spacing:normal;word-spacing:-1px;// IE6/7

vertical-align:top

子对象:

letter-spacing: normal;

word-spacing: normal;//清除父元素的继承

另一个不错的解决方案:

.father-wrap { font-size:0;//所有浏览器

*word-spacing:-1px;//IE6、7}.father-wrap .son{ font-size: 12px; letter-spacing: normal; word-spacing: normal; vertical-align:top;}

//firefox 中letter-spacing会导致脱离普通流的元素水平位移

@media screen and (-webkit-min-device-pixel-ratio:0){.father-wrap{ letter-spacing:-npx;//webkit浏览器,n根据父级字体调节}}.son{ display: inline-block; *display:inline; *zoom:1;

}}

inline-block什么意思中文_【CSS深入】之对inline-block的理解相关推荐

  1. [CSS]详解display:inline | block |inline-block的区别

    2019独角兽企业重金招聘Python工程师标准>>> [CSS]详解display:inline | block |inline-block的区别[点评网站][发布新闻][申请专栏 ...

  2. 三分钟快速了解CSS Display的属性:Block,Inline,Inline-Block

    文章目录 三分钟快速了解CSS Display的属性:Block,Inline,Inline-Block Block Inline Inline-block Block,Inline,Inline-B ...

  3. 横向排列两个多个div盒子的方法(CSS浮动清除float-clear/inline)/办法

    最近在做一个div css切割,昨晚发现了长期以来一直无记录下来的问题!关于兼容IE跟FF的float属性.趁现在还清醒赶紧记下笔记先: 一.并排在一行的两个div样式有这种情况:ie或者ff下对于子 ...

  4. ionic 中文 API CSS and javascript link

    ionic 中文 API CSS ionic 中文 API javascript 转载于:https://www.cnblogs.com/xieyier/p/4036152.html

  5. css 小知识点:inline/inline-block/line-height

    inline: 此元素会被显示为内联元素,元素前后没有换行符.因此:无法设置宽度和高度- inline-block: 行内块元素.元素前后没有换行符(CSS2.1 新增的值) 用通俗的话讲,就是不独占 ...

  6. html在一行内横向排列并排同行同时显示两个多个div盒子的方法(CSS浮动清除float-clear/inline)/办法

    01/23/2014, Posted in  移动 Comments: No comments 最近在做一个div css切割,昨晚发现了长期以来一直无记录下来的问题!关于兼容IE跟FF的float属 ...

  7. matplotlib 中文_详解Matplotlib中文字符显示问题

    在用matplotlib进行绘图时,如果在绘制过程中会用到中文,则默认情况下会出现字体警告,中文字符显示为方框或乱码的形式,我们这里将介绍多种解决方案. 02 目录: 1.中文字体显示问题 2.几种解 ...

  8. 2.HTML、CSS初识盒子模型详解行高理解

    什么是语言? 1. 语言是一个沟通工具: 2. 人与人之间的沟通交流我们会用到语言,比如: 汉语.英语-- : 3. 作为前端工程师,要与浏览器沟通交流,就要用到浏览器所能识别的语言. 浏览器 3大语 ...

  9. [css] 圣杯布局和双飞翼布局的理解和区别,并用代码实现

    [css] 圣杯布局和双飞翼布局的理解和区别,并用代码实现 一: section{height: 100%; overflow: hidden;clear:both; } .left{ height: ...

最新文章

  1. 19条效率至少提高3倍的MySQL技巧
  2. 儿童编程软件python-MRT7-Python少儿编程下载
  3. 【转】Linux查看文件编码格式及文件编码转换
  4. 全球及中国抗甲状腺药物行业应用现状调研及未来产销需求预测报告2021-2027年
  5. pandas使用笔记大全
  6. yum install / yum localinstall
  7. Springmvc+mybaits 分页处理+ajax翻页
  8. java sbt二叉树,Treap——堆和二叉树的完美结合,性价比极值的搜索树
  9. Windows Azure Cloud Service (42) 使用Azure In-Role Cache缓存(1)Co-located Role
  10. win10计算机网络共享设置密码,win10系统清除网络共享密码的方法介绍
  11. 各种格式视频,图片,音频免费下载
  12. 软件概要设计的过程和内容
  13. <一起JS(基础篇)>4.标识符、字符串、Number、波尔值、Null和Undefined
  14. 关于下载pdf请求不到数据问题
  15. 1bit和1byte_Bit和Byte的区别及单位换算
  16. lr背景虚化_LR调色教程,用LR把夏天的颜色以图片的样式呈现出来
  17. aac格式怎么转换为MP3格式
  18. 智慧养殖远程管理监控方案
  19. 利用kali爆破telnet
  20. 【JavaWeb】9—监听器

热门文章

  1. MySQL卸载、下载、安装、配置、目录结构、源码、登录、编码设置、可视化工具、MySQL的常见问题的解决
  2. 神啊,救救我吧~~~
  3. 遥测终端RTU边坡监测预警
  4. Tomcat部署及配置
  5. SQL Server 2008数据库备份与恢复
  6. 如何更换jdk版本?(以在win10操作系统上把jdk8更换为jdk9为例)
  7. Android 使用PLDroidPlayer播放网络视频 根据视频角度自动旋转
  8. 4G频段划分体现平衡 三大运营商重回起跑线
  9. 2020-11-20,聊聊新感悟+待业总结
  10. ES聚合之Pipeline聚合语法讲解