css中display:Inline-Block深入理解说明

inline-block,如此的让人难以琢磨,并且又有诱人的显示方式宣传,只是其承诺的很多,兑现的却如此少。我已经收到这样的PSD文件有很多次:

看了之后我就开始哭了。

通常情况下,这个类型的布局是小菜一碟。固定宽度,固定高度,左侧浮动(float:left),然后就完成了。但但但是,这个设计需要与可变数量的内容一起工作,也就是说如果这些块中的一个比其他块拥有更多的内容,它将会破坏整个布局:

由于第一个画廊项目比其他的高,所以第五个项目就相对于它进行左侧浮动而不是位于它下面。总体上来说我们想要一个拥有表格一样伸缩性的布局,但真正合适的应该是一个语义标记。

我们以拥有一个无序列表,并且display被设置为inline-block的一个简单页面开始:

<ul>
    <li>
        <h4>This is awesome</h4>
        <img src="http://farm4.static.flickr.com/3623/3279671785_d1f2e665b6_s.jpg"
        alt="lobster" width="75" height="75"/>
    </li>
...
<ul>

<style>
    li {
        width: 200px;
        min-height: 250px;
        border: 1px solid #000;
        display: inline-block;
        margin: 5px;
    }
</style>

在Firefox 3,Safari 3和Opera中看起来OK:

明显的,垂直对齐有点问题。恩,但这并不是真正的有问题,因为这是正确的行为,但这不是我们想要的。

这儿发生的事情是每个<li>的baseline是以父元素<ul>的baseline来对齐的。什么是baseline,你问道?一图抵千言:

baseline是那条穿过上面文字的黑线。行内(inline)或者行内块(inline-block)元素的默认垂直对齐的值是baseline,也就是说元素的baseline将会与其父元素的baseline进行对齐。这是第一个包含基准线在内的行内块:

你可以看见,每个基准线都和文本“This is the baseline”的基准线所对齐。那个文本并没有在一个<li>之中,它只是父元素<ul>的一个简单的文本节点,用来标识父元素的基准线在哪。

但是,解决这个问题的方法很简单:vertical-align:top,其效果是一个好看的网格:

除了它仍然不在Firefox 2,IE 6和7中工作以外。

让我们来开始处理Firefox 2。

Firefox 2不支持行内块,但是它支持一个显示效果与行内块一样,Mozilla所特有的显示属性-moz-inline-stack。当我们把它加到display:inline-block前面,FF2将会忽略那个声明(译者注:即display:inline-block)并保持-moz-inline-stack,因为它不支持行内块。支持行内块的浏览器将会使用它(译者注:display:inline-block),并且忽略前面的显示属性(译者注:-moz-inline-stack)。

<style>
    li {
        width: 200px;
        min-height: 250px;
        border: 1px solid #000;
        display: -moz-inline-stack;
        display: inline-block;
        vertical-align: top;
        margin: 5px;
    }
</style>

不幸的是,它有一个小bug:

老实说,我不知道什么导致了这个bug。但是这儿有快速解决的方法。把<li>中的所有内容包含在一个<div>之中。

<li>
        <div>
            <h4>This is awesome</h4>
            <img src="http://farm4.static.flickr.com/3623/3279671785_d1f2e665b6_s.jpg"
            alt="lobster" width="75" height="75"/>
        </div>
</li>

这好像reset<li>中的一切,然后适当的展示它们。

现在,我们来看IE7。IE7不支持行内块,但是我们可以用小把戏让它来渲染<li>,就好像它们是行内块一样。应该怎么做?hasLayout,一个为所有乐趣而生的IE魔法属性。你不能以hasLayout:true;或者以任何类似这样的形式给一个元素明确的设置hasLayout,但是你可以使用其他的声明比如zoom:1来触发它。

从技术上来说,hasLayout意味着一个设置了hasLayout的元素要对自己和其子元素的渲染负责(把它们通过min-heightwidth属性组合起来,然后你就得到了与display:block很像的行为)。它就像魔法仙尘一样,你可以把它们洒在渲染问题上,然后这些问题就烟消云散了。

当我们向<li>元素中加入zoom:1*display:inline(star hack to target IE6 & 7))的时候,我们就使得IE7以inline-block的形式显示它们:

<style>
    li {
        width: 200px;
        min-height: 250px;
        border: 1px solid #000;
        display: -moz-inline-stack;
        display: inline-block;
        vertical-align: top;
        margin: 5px;
        zoom: 1;
        *display: inline;
    }
</style>

呼!(译者注:松口气)基本上完成了。就剩下IE 6了:

IE 6不支持min-height,但是很感谢(译者注:反讽)其对height属性的不正确处理,所以我们可以用它来代替。设置_height(IE6 underscore hack)的值为250px将会使所有<li>元素的高度为250px,并且如果它们内容超过了这个值,它们将会展开来进行适配。所有其他浏览器会忽略_height

那么经过所有的努力之后,这就是最终的CSS和HTML了:

 代码如下
复制代码

<style>
    li {
        width: 200px;
        min-height: 250px;
        border: 1px solid #000;
        display: -moz-inline-stack;
        display: inline-block;
        vertical-align: top;
        margin: 5px;
        zoom: 1;
        *display: inline;
        _height: 250px;
    }
</style>

<li>
        <div>
            <h4>This is awesome</h4>
            <img src="http://farm4.static.flickr.com/3623/3279671785_d1f2e665b6_s.jpg"
            alt="lobster" width="75" height="75"/>
        </div>
</li>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索firefox
, inline
属性
,以便于您获取更多的相关知识。

时间: 2024-12-23 13:59:50

css中display:Inline-Block深入理解说明的相关文章

CSS中display:inline-block属性妙用

  CSS中display:inline-block属性用法 在使用CSS实现表现的时候,会经常接触到display:inline-block这一属性,无论是初接触Web标准还是接触标准已久的朋友,大都会对这一属性感觉很迷惑和模糊. display:inline-block 将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内,允许空格. 但对于这个属性不是所有浏览器都识别. 支持的浏览器有:Opera.Safari 但很遗憾,最流行的IE和Firefox却不支持

css中display:inline-block的兼容性问题

inline-block的兼容性问题 兼容性: IE6.IE7不识别inline-block但可以触发块元素. 其它主流浏览器均支持inline-block. 解决IE6.IE7兼容性的方法: 1.首先设置inline-block触发块元素,具有了layout的特性,然后设置display:inline使块元素呈现内联元素,此时layout的特性不会消失. 2.直接设置display:inline,使用zoom:1触发layout. 兼容所有浏览器的方法是: display:inline-blo

解决css中display:inline-block中间的空白间隙

1.display:inline-block 让一个元素具有"区块元素"的属性(可以设置width和height),又具有"内联元素"的属性(不产生换行). 2.IE中的inline-block IE6不支持这个属性,但IE8开始支持这个属性. 让IE6内联元素具备inline-block特性 由于inline-block会触发IE的layout,所以IE6中只要设置{display:inline-block;}即可. 让IE6区块元素具备inline-block属

css中display:none和visibility:hidden的区别

区别分析 首先我们都知道,display: none 和 visibility: hidden 都可以起到隐藏元素的功能 两者的区别在于占用文档流的不同 display: none 隐藏元素同时去除元素在文档流所占的空间 visibility: hidden 隐藏元素, 但不去除元素在文档流所占的空间 区别示例 HTML Code <span class="one">第一区域</span> <span>第二区域</span> <br

CSS中display与visibility的区别

css|区别 起因: 前几天在做一个图片无间隙滚动的效果,要利用到一个隐藏的层. 问题: 之间复制以前文字滚动的效果代码(文字滚动时无错误),结果发现页面被拉长了一倍,也就是隐藏的层. 解决: 查CSS手册后发现了隐藏内容原来是有区别的,一种是保留对象的物理空间,一种是不保留. ------------------------------- display:none CSS1 隐藏对象.与 visibility 属性的hidden值不同,其不为被隐藏的对象保留其物理空间 visibility:h

CSS中display各属性语法参数详解 附实例

这里向大家描述一下HTML DOM display属性的定义和用法,HTML DOM display属性主要用来设置元素如何显示,比如当此属性值为none时,表示此元素不会被显示,而block则表示此元素将显示为块级元素,此元素前后会带有换行符. HTML DOM display属性定义和用法 此属性主要用来设置元素如何显示. 语法: Object.style.display=value 可能的值 HTML DOM display属性实例 本例设置不显示元素: <html> <head&

解决CSS中 display 与 visibility 的区别_基础教程

span为内联/inline元素,给他宽度赋值是没有效果的. span为内联/inline元素,给他宽度赋值100px+float:right;可以看到有了宽度. 这个li被定义为内联/inline,设置宽度没有效果 test test 这个li被定义为内联/inline+float:left,设置宽度有效果 test test

css中display: inline-block;间隙解决方法

标签使用display: inline-block;时,将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内,允许空格.(准确地说,应用此特性的元素呈现为内联对象,周围元素保持在同一行,但可以设置宽度和高度地块元素的属性) 使用inline-block水平呈现的元素间,换行显示或空格分隔的情况下会有间距,很简单的个例子: <!DOCTYPE html> <html lang="zh-cn"> <head>  <m

CSS中vertical-align垂直对齐属性介绍

一向以来,我对vertical-align的属性都搞的不是太清楚,今天刚好碰到有朋友问我相关的问题,于是自己潜心研究了一番,发现这玩意还真不是个简单的东西,在此我分享的东西都是抛弃脑残的IE的,如果你用的是脑残的IE,请跳过此篇文章. 一.为什么我设置的vertical-align没用? 相信很多前端开发人员都遇到过这个问题,有的时候自己明明写了vertical-align属性值,但就是没效果,归其原因,是因为vertical-align是个比较奇葩的东西,想要让他起作用,就要投其所好. 我们知