css学习之 display:inline-block;

设置display:inline-block;后的元素 就是一个格式化为行内元素的块容器( Block container );通俗讲就是:将对象呈递为内联对象,但是对象的内容作为块对象呈递。旁边的内联对象会被呈递在同一行内,允许空格。

支持的浏览器:目前有 safri 和 chorme 及 ie8+ 和 firefox3.6+;ie6和ie7不支持该属性;

解决办法:

  IE6/IE7的inline-block属性只对原生默认的内联元素(span, a, em......)有效,对于块级元素(div,p,ul......)无效。
            In IE 6 and 7 inline-block works only on elements that have a natural display: inline.IE doesn't apply the value inline-block for the CSS display property on HTML elements that default to block level.
            
            两个结论: 1、IE6/7不识别inline-block,只是触发了layout,表现跟inline-block块元素表现一样。
                     2、IE6/7不完全支持inline-block,只对内联元素有效。

   ie6,7 块元素实现 display:inline-block效果:

    div{
            display: inline-block;
            width: 350px;
            min-height: 250px;
            background-color: silver;    
            margin:0 5px;
            
            vertical-align:top; /*垂直方向 顶部对齐,base_line为基线对齐*/
            *display: inline;    /*只用于 ie6和ie7的hack*/
            zoom: 1;            /*激发 ie7的 hasLayout*/
            _height:250px;        /*通过min-height 和 _height(ie6hack) 来达到相同高度效果*/
        }

   块状元素怎么实现display:inline-block;效果:

        方法有2个: 1、 先使用display:inline-block属性触发块元素,然后再定义display:inline,让块元素呈递为内联对象(两个display 要先后放在两个CSS声明                中才有效果,这是IE的一个经典bug,如果先定义了display:inline-block,然后再将display设回 inline或block,layout不会消失)。代码如                下(...为省略的其他属性内容):
                  div {display:inline-block;...}
                  div {display:inline;}
              2、直接让块元素设置为内联对象呈递(设置属性display:inline),然后触发块元素的layout(如:zoom:1 或float属性等)。代码如下:
                div { display:inline-block; _zoom:1;_display:inline;} /*推荐*/
                div { display:inline-block; _zoom:1;*display:inline;} /*推荐:IE67*/

  触发haslayout有很多方法:

display: inline-block
* height: (任何值除了auto)
* float: (left 或 right)
* position: absolute
* (任何值除了auto)
* writing-mode: tb-rl
* zoom: (除 normal 外任意值)
Internet Explorer 7 还有一些额外的属性(不完全列表):
* min-height: (任意值)
* max-height: (除 none 外任意值)
* min- (任意值)
* max- (除 none 外任意值)
* overflow: (除 visible 外任意值)
* overflow-x: (除 visible 外任意值)
* overflow-y: (除 visible 外任意值)
* position: fixed

附我的demo代码一个:

<!DOCTYPE html>
<html>
  <head>
    <title>display:inline-block hack001.html</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <style type="text/css">
        *{
            margin: 0px;
            padding: 0px;
        }
        
        h3{
            text-align:center;
            margin: 5px auto;
        }
    
        div{
            display: inline-block;
            width: 350px;
            min-height: 250px;
            background-color: silver;    
            margin:0 5px;
            
            vertical-align:top; /*垂直方向 顶部对齐,base_line为基线对齐*/
            *display: inline;    /*用于 ie6和ie7的hack*/
            zoom: 1;            /*激发 ie7的 hasLayout*/
            _height:250px;        /*通过min-height 和 _height(ie6hack) 来达到相同效果*/
        }
        
    </style>

  </head>
  
  <body>
      <p>inline-block 后的元素就是一个格式化为行内元素的块容器( Block container )</p>
      <h3>测试 demo</h3>
    <div>display:inline-block将对象呈递为内联对象,但是对象的内容作为块对象呈递。旁边的内联对象会被呈递在同一行内,允许空格。
    </div>
    <div>
        这段代码在ie8以上版本显示正常,已经其他的浏览器都是正常的,而唯独在ie6,7下无效,然后通过css hack进行处理后的css为: zoom:1;*display:inline;
    </div>
    <div>
        在没有加 vertical-align:top 之前;显然,在垂直排列上有些错误。嗯,也不算错误吧,这是正确的表现,只不过不是我们想要的效果:这
        是因为每个div的基线是和其父基线对其的; 通俗的说 inline 和 inline-block 元素默认的值是 基线;也就是说元素基线要和其父元素基线对齐;
        总之,修正方法是很简单的: vertical-align: top;
        
        但是在IE 6 和 7 中,依然无效:IE 7 也不支持 inline-block,但是我们可以欺骗它以使 div 好像是 inline-block 的。
        怎么做呢?hasLayout,IE 的一个带来乐趣的神奇属性。你无法在一个元素上用 hasLayout: true; 显示地设置 hasLayout,或通过其他类似的简单方法,
        但是可以用其他类似 zoom:1 的声明来激发它。(技术上来说,hasLayout 意味着,一个 hasLayout 设为 true 的元素负责渲染它自己及其子元素);
        当我们给 div 加上 zoom:1 和 *display:inline(用于 IE6 和 IE7 的星号 hack) 之后,
        在 IE7 中它们就可以像 inline-block 一样显示了;
        
        只剩 IE 6 了:IE6 不支持 min-height,但是多亏它对 height 属性的不正确处理,我们可以用它来代替。
        把 _height(IE6 下划线 hack) 设为 250px 使所有的 div 元素高度为 250px,并且如果它们的内容大于 250px,他们会扩大来适应。
        其他所有的浏览器会忽略 _height。
    </div>
    <a href="###">这是基线</a>
    
  </body>
</html>

参考链接:http://www.cnblogs.com/yupeng/archive/2011/04/13/2014147.html

      http://www.cnblogs.com/leejersey/archive/2012/07/11/2586506.html

等;另两个链接找不到了~~!

     

原文地址:https://www.cnblogs.com/happy-rabbit/p/5123904.html