对行、块元素inline-block的兼容

学习前端以来发现好多东西需要记忆,但又经常忘记,曾试着把内容记录在word文档中发现有时候又会忘记放在哪不是很方便。看到好多人写博客感觉不错,既可以方便自己查找又可以让其他人浏览以供交流......

废话不多说了,相信学过css的对display肯定不会陌生,我们经常通过设置display的值可以改变元素的表现形式,来达到想要的布局。今天着重看了一下display属性的inline-block的表现,查阅了写资料整理如下,现在来一起看看吧,如有错误还望各位不吝赐教。

设置为inline-block 的元素既具有 block 元素可以设置宽高的特性,同时又具有 inline
元素默认不换行的特性。当然不仅仅是这些特性,比如 inline-block 元素也可以设置 vertical-align 属性。简而言之:

inline-block
后的元素就是一个格式化为行内元素的块容器( Block container
)

 该属性值在各浏览器的表现

测试表明:IE6 中 inline 元素只要触发了hasLayout其表现就类似于
inline-block(但IE6并非真支持inline-block)这里设置 display:inline-block; 或者 zoom:1;
等其他属性值可以触发 hasLayout,表现出来是一样的。

IE6 中 block 元素即使触发了 hasLayout 也不能具有 inline-block 元素不换行的特性。想要
block 元素支持 inline-block 元素的特性,我们可以这样做:

.dib-block {
display:inline;
zoom:1;
}

首先让 block 元素转化为 inline 元素,强制其不换行;然后通过 zoom:1 触发hasLayout,使其可以设置宽高。

结合现代浏览器

综上,现代浏览器都支持display:inline-block ,IE6、7 inline 元素也可以达到同样的效果,IE6、7
block 元素需要设置 display:inline; zoom:1; 它们结合在一起便是:

display:inline-block; /* 现代浏览器
+IE6
7 inline 元素 */
*display:inline; /*
IE6
7 block 元素 */
*zoom:1;

为了不让支持 CSS2.1 inline-block 的浏览器 重置为 inline,我们针对 IE6、7 做一个
hack。由于现代浏览器也开始支持 zoom 属性,这里只是希望 IE6、7 中生效,所以还是 hack 一下比较合适。至此产生了我们熟悉的兼容各个浏览器的
inline-block 写法。

1. display:inline-block
后的元素为什么会产生水平空隙,这真的是 bug
吗?


  • 现代浏览器中 inline 和 block 元素 display:inline-block 后均会产生水平空隙;

  • IE6、7,IE8(Q)模拟 display:inline-block 后分两种情况:

    IE6、7,IE8(Q)中:inline 元素会产生空隙,block 元素不会产生空隙。

看看 inline 元素默认的表现情况如何?原来默认就有空隙存在!它们是谁?是空白符(white space)!

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

去掉空隙

HTML
中的换行符、空格符、制表符等产生了空白符,而这些归根结底都是字符,那么它们的大小都是 受font-size
来控制的,字体大小直接导致 inline 或者inline-block 后元素之间空隙的大小,把 inline-block
元素间的空隙认为总是某个固定大小是错误的。

Chorme

低版本的 chrome 浏览器为了不让文字过小不利于阅读,默认是不支持 font-size:0 的,还好我们有
-webkit-text-size-adjust 这个私有属性来控制,当设为 none 时就支持字体大小为 0 了。我已经记不清楚 chrome
从哪个版本开始支持 font-size:0 了,反正我用chrome 19
是支持了(有知道的朋友,烦请告诉一丝一声,最好有官方更新说明)。但是,-webkit-text-size-adjust:none;
会直接导致页面文字无法缩放,这对于用户来说显然是不友好的。所以-webkit-text-size-adjust:none;
一定要慎用,确保使用的地方没有大面积的文字。

Safari

不支持font-size:0;

处理 Safari 不支持font-size:0 的问题上面已经指出 letter-spacing
是支持负值的,那么这个负值到底取多少合适呢?经过测试得出的结论是:inline-block
产生的空隙与父级元素继承或者设定的
font-family
font-size
有关,通常情况下,12px
大小的 tahoma
字体,inline-block
后元素间产生的空隙(间隙)大约是
5px

IE

  • IE8 以上支持 font-size:0;

  • IE6、7 inline 元素 inline-block 后设置 font-size:0 始终有 1px 的空隙。

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

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

  • 第四步:子元素重置回正常值

    上述所有操作都是在父元素设置的,那么子元素都会继承这些属性,字体大小为0了,子元素就什么都看不到了,这并不是我们想要的。
    同时字符和单词间距我们也要把它重置为默认值。「font-size: 12px; letter-spacing: normal; word-spacing:
    normal;」

  • 最后:inline-block 更好的复用

去除
inline-block
空隙终极解决方案

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

*word-spacing:-1px;/* IE6
7 */
}
.dib-wrap .dib{

font-size: 12px;
letter-spacing: normal;
word-spacing: normal;

vertical-align:top;
}
@media screen and
(-webkit-min-device-pixel-ratio:0){
/* firefox

letter-spacing
会导致脱离普通流的元素水平位移 */
.dib-wrap{

letter-spacing:-5px;/* Safari
等不支持字体大小为 0
的浏览器, N 根据父级字体调节*/
}
}
.dib {

display: inline-block;
*display:inline;
*zoom:1;
}

其实在YUI
3
中也全面运用了 inline-block 作为基础布局,YUI 3 是这样解决的:

.yui3-g {
letter-spacing: -0.31em; /* webkit: collapse white-space
between units */
*letter-spacing: normal; /* reset IE < 8 */

word-spacing: -0.43em; /* IE < 8 && gecko: collapse white-space
between units */
}

.yui3-u {
display: inline-block;
zoom: 1; *display: inline; /* IE
< 8: fake inline-block */
letter-spacing: normal;
word-spacing:
normal;
vertical-align: top;
}

显然,这里纯粹使用了 letter-spacing 和 word-spacing 来控制元素间的空隙,局限性极大,-0.31em和-0.43em 只是因为
YUI 3 全局cssfonts.css里设置是:「body { font:13px/1.231
arial,helvetica,clean,sans-serif; }」。

当然,如果你坚持使用把 html 写在一行的方式来达到去除 inline-block
空隙的目的,我只能说:一切以牺牲结构来兼容表现的行为都是耍流氓!所以探讨此种方式去除空隙也将是

本文产生的一些观点如下:


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

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

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

时间: 2024-10-28 14:26:14

对行、块元素inline-block的兼容的相关文章

Study 8 —— 行块元素及定位

行&块元素display:inline;display:block;display:inline-block; 盒模型padding[内边距]padding: 上下内边距 左右内边距;padding: 上部内边距 右边内边距 下部内边距 默认与右边内边距相同;padding: 上部内边距 右边内边距 下部内边距 左边内边距; 定位1.水平位置的两个元素它们之间的外边距=左边的margin-right+右边的margin-left2.垂直方向的两个元素它们之间的外边距=两者之中较大的外边距3.包含

行内元素(inline标签)设置了行高为什么不生效,还是表现为父盒子的行高?行内元素行高问题终极解释

最近在看张鑫旭大佬的<css世界>,读到5.2.4  内联元素 line-height 的“大值特性” ,产生了疑惑, 在开发中确实也遇到了同样的问题,深入探究后得出结果,先说结论吧,论证内容有点长,结论: 行内元素自身并没有行高这个属性,虽然设置可以设置行高,但是最终作用的地方并不是自身,而是其自身所在的行框盒子上!如果你不知道什么是行框盒子,建议你好好读读张大佬的<css世界>,这里我简单的画一画 如上如所示,我的结论是: 内联盒子没有行高这一属性,给它设置line-heigh

块级元素和行内元素以及display中block、inline和inline-block的区别

块元素又名块级元素(block element),和其对应的是内联元素(inline element),都是html规范中的概念.块元素和内联元素的基本差异是块元素一般都从新行开始,相邻的块级元素将会在不同行显示.而当加入了css控制以后,块元素和内联元素的这种属性差异就不成为差异了.比如,我们完全可以把内联元素加上display:block这样的属性,让它也有每次都从新行开始的属性,即成为块元素同样我们可以把块元素加上display:inline这样的属性,让它也在一行上排列. block元素

HTML 块级元素与行内元素

1.块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签'P"."form"这个块元素比较特殊,它只能用来容纳其他块元素. 2.如果没有css的作用,块元素会顺序以每次另起一行的方式一直往下排.而有了css以后,我们可以改变这种html的默认布局模式,把块元素摆放到你想要 的位置上去.而不是每次都愚蠢的另起一行.需要指出的是,table标签也是块元素的一种,table based layout和css based layout从一般使用者(不包括视力障

块级元素 行级元素及其他元素

我们常说元素分为块级元素和行级元素,这只是一种简化了的约定. 1.元素的display属性定义了该元素在页面中渲染出来的盒模型. Every HTML element has a default display value depending on what type of element it is. The default display value for most elements is block or inline. 2.display属性的值如下: 2.1常见的值如下三个: blo

块级元素与行级元素(内联元素)

内联元素(inline element)一般都是基于语义级(semantic)的基本元素.内联元素只能容纳文本或者其他内联元素,常见内联元素"a". 块元素(block element)和内联元素(inline element)都是html规范中的概念.块元素和内联元素的基本差异是块元素一般都从新行开始.而当加入了css控制以后,块元素和内联元素的这种属性差异就不成为差异了.比如,我们完全可以把 内联元素cite加上display:block这样的属性,让他也有每次都从新行开始的属性.

CSS中块级元素和行内元素

文档流 将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流. 每个非浮动块级元素都独占一行, 浮动元素则按规定浮在行的一端. 若当前行容不下, 则另起新行再浮动. 内联元素也不会独占一行. 几乎所有元素(包括块级,内联和列表元素)均可生成子行, 用于摆放子元素. 有三种情况将使得元素脱离文档流而存在,分别是浮动,绝对定位, 固定定位. 但是在IE中浮动元素也存在于文档流中(还让我觉得这样很合理><). 浮动元素不占任何正常文档流空间,而浮动元素的定位还是基于正常的文档流

盒子模型,块级元素和行内元素特性与区别

盒子模型 css盒子模型分为两种,一种是遵循w3c标准的标准盒子模型,另外一种就是IE盒子模型. 标准盒子模型 IE盒子模型 通过上面两张图可以看出,两种盒子模型都包括padding,margin,border,content,但是ie盒子模型的content包括border和padding. 一个例子 一个盒子的 margin 为 20px,border 为 1px,padding 为 10px,content 的宽为 200px.高为 50px. 标准盒子模型 盒子需要占据的位置为:宽 20

块级元素与行内元素(内联元素)的区别和联系

在css盒子模型中,我们提到了html元素中的块元素(block element)和内联元素(inline element).那么它们究竟是什么呢? 其实,这两种元素都是html规范中的概念.块元素(block element)一般是其他元素的容器元素,能容纳其他块元素或内联元素.最常见的就是P和div这两个,说的简单点,块元素就好比一个四方块,可以放其 他的四方块,并可以呈现在页面上任何地方.默认情况下块元素,是独占一行的.常见的块元素:div.h1-h6标题.form(只能用来容纳其他块元

块元素与行内(内嵌)元素的区别

原文连接http://www.jb51.net/css/468282.html block(块)元素的特点: ①总是在新行上开始,相当于每个块元素默认有个换行符:②高度,行高以及外边距和内边距都可控制:③宽度缺省是它的容器的100%,除非设定一个宽度.④它可以容纳内联元素和其他块元素 inline元素的特点: ①和其他元素都在一行上  默认没有换行符所以在一行上可以显示多个行内元素:②高,行高及外边距和内边距不可改变:③宽度就是它的文字或图片的宽度,不可改变④内联元素只能容纳文本或者其他内联元素