布局中的inline-block

说css简单的人,肯定木有深入了解过它,会用不代表懂,更谈不上表精通,用了一年多css的我也只能说一知半解,对css Hack的了解还是不够啊啊啊啊。。。。

就拿inline-block来说,众所周知,它是和相对/绝对定位,float一样可以实现页面布局的一个属性,在页面中【display:inline-block; *display:inline; *zoom:1;】这样的代码更是随处可见,而上面的代码是为了兼容ie6,ie7,但当有人问起为什么要这样写时,惯性思维告诉我“因为ie6,ie7”这样的老古董不兼容,真的是这样么,今天在网上查阅了一些资料。原来,在ie6,ie7中display:inline-block;是可以触发hasLayout 的,触发hasLayout 的元素表现出来的特征就是一个矩形容器,可以给它设置宽高而不受外部因素的影响。类似于现代浏览器中的block formatting contexts(块级格式化上下文)的概念。

当然,这几种布局方式并不能单纯的拿出来比较,说谁更优秀,只有在你实际的应用环境中,根据需要来合理选择布局方案,我们的目的是让浏览器识别我们的代码,更好的还原设 计效果,呈现给用户一个更舒服,更美观的界面。在此,主要分析一下inline-block布局方案:

什么是inline-block?

那inline-block到底是什么呢?顾名思义:inline行,block块,那inline-block后的元素就是格式化为行内元素后的一个块元素。更加直白一点就是说inline-block后的元素既有块元素可以设置宽高的属性,也可以有inline元素不换行的属性,当然inline-block也可以设置vetical-algin属性等。

inline-block引发的问题

所以在这里做一个整理,一方面加深自己对inline-block布局的理解,另一方面,有需要的童鞋也可以参考一下,有好的建议也可以分享一下啦啦啦啦------

话说在正常的浏览器中直接用【display:inline-block;】就可以实现,但在浏览器中的显示并不是我们所预期的那样,每个块儿之间出现了间隙,如下所示:

而正常情况下我们所希望看到的效果是这样的

通过float实现的

      

从上面的显示效果来看,第一个明显比第二个看着舒服,但并不是任何时候都能满足我们的要求,那问题就来了,我们该如何解决这个间隙的问题呢?

inline-block空白的解决方案

针对这个问题,参考了一些大神的著作,找到了一些解决方案

第一种: 移除空格法

第二种:使用margin负值

.box a{

display:inline-block;

margin-right:-10px;

}

这种办法由于外部环境的不确定性,以及最后一个元素多出的负margin值等问题,这个方法并不适合用于大规模的开发中

第三种: 使用font-size:0清除换行符;

第四种: display:table; 方法 但这种方法在ie6,ie7下是不起作用的;暂时就保留着吧

第五种: 使用letter-spacing和word-spacing清除空隙,但经验证后发现。这两个属性并不能正真的清除空隙,所以还需要与其他属性的结合才能实现我们想要的效果

所以综合一下上面的所有解决方案,可以得到一个终极解决方案如下:

.box{

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

*word-spacing: -1px;  /* 针对ie6,ie7*/

}

.box a{

font-size:12px;

letter-spacing: normal;

word-spacing: normal;

vertical-align:top;

}

@media screen and(-webkit-min-device-pixel-ratio:0){

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

.box{

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

}

}

.box a{

display: inline-block;

*display: inline;

*zoom:1;

}

其实在YUI3中也用了inline-block来布局,在YUI中是这样解决这个问题的

.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留下的空格,但是这样就破坏了我们页面本身的结构,作为一个程序员来说,估计没人愿意看到像下面这样没有结构的代码吧,所以这种解决方案就划在解决方案之内了。

结论:

    • 产生 inline-block 空隙的根本性原因是:HTML 中的换行符、空格符、制表符等合并为空白符,字体大小不为 0 的情况下,空白符自然占据一定的宽度,因此产生了元素间的空隙。
    • 慎用 -webkit-text-size-adjust:none,它将会导致页面无法通过缩放来改变字体大小。
时间: 2024-08-08 17:56:43

布局中的inline-block的相关文章

CSS display:inline|block|inline-block差异

display:inline|block|inline-block三属性的区别和联系,block就是将元素显示为块级元素,inline就是将元素 显示为行内元素,CSS display:inline-block将对象呈递为内联对象,但是对象的内容作为块对象呈递.旁边的内联对象会被呈递在同一行内,允许空格. 详解CSS display:inline|block|inline-block的区别 ◆CSS display:block CSS display:block就是将元素显示为块级元素. blo

响应式布局中的CSS相对量

一个响应式布局,要能够根据设备屏幕尺寸的改变,动态的调整页面内容,展现不同的设计风格.在进行响应式的 CSS 代码编写过程中,经常会用到一些相对尺寸,以达到相对定位的目的.例如,常见的响应式布局中需要用到"自适应的图片"."流动布局"等技术. 体现在 CSS 代码编写上,就需要前端开发人员精准掌握特定属性的相对量表示方法.然而,其中一些相对量的计算方法很容易混淆. 本文在完整梳理全部 CSS 属性基础上,将其中的"相对单位.百分比相对量.数字相对量&quo

css布局中,什么是BFC

BFC的定义是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用.在创建了 Block Formatting Context 的元素中,其子元素会一个接一个地放置.垂直方向上他们的起点是一个包含块的顶部,两个相邻的元素之间的垂直距离取决于 ‘margin’ 特性.在 Block Formatting Context 中相邻的块级元素的垂直边距会折叠(collapse). 在 Block Formatting Context 中,每一个元素

移动端网页布局中需要注意事项以及解决方法总结

移动端网页布局中需要注意事项以及解决方法总结,这份对我们在布局移动端网页的时候非常有用! winphone系统a.input标签被点击时产生的半透明灰色背景怎么去掉<meta name="msapplication-tap-highlight" content="no">1.关闭iOS键盘首字母自动大写<input type="text" autocapitalize="off" />2.禁止文本缩放h

CSS布局中应用BFC的例子

BFC是啥? BFC(Block Formatting Context),“块状格式化上下文”.简单地说,它提供一个独立的布局环境.在同一个BFC中,盒子会一个挨一个地排列,margin边距还会在垂直方向上叠加.float和clear:float也只会在同一个BFC内有效. 产生BFC的情况有? W3C标准中这样描述:Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cel

display:flex 在布局中的妙用

最近越来越依赖display:flex 了.本来只是在移动端用来作弹性布局,现在在PC端,我基本用它来取代 float:left.比如昨天做的一个专题,基本都用 flex 来布局. 但是这其中的原理呢,flex布局的相对于float的优势又在哪呢.只是对这些有一个模糊的概念. 比如float:left/right 这个功能,一般用来排版.而它的高度塌缩,一些潜在的未被触发的问题,总是给人一种很"不靠谱"的感觉. 先来盘点下float的特性: 1. 脱离当前文档流.浮动盒子会贴着容器或者

认识和理解css布局中的BFC

认识和理解css布局中的BFC BFC的定义 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用. Block Formatting Context 的元素的特点 其子元素会一个接一个地放置.垂直方向上他们的起点是一个包含块的顶部,两个相邻的元素之间的垂直距离取决于 ‘margin’ 特性. 相邻的块级元素的垂直边距会折叠(collapse). 每一个元素左外边(margin)与包含块的左边相接触(对于从右到左的格式化,右外边接触右边)

1.解决自适应布局中div内部img距离底部4px的空白问题?2. img怎么实现水平垂直居中?

1.解决自适应布局中div内部img距离底部4px的空白问题? 示例代码: <style> .t1{自适应布局,外层盒子不给宽高(由内部元素撑开) } img{ /* vertical-align:bottom; */     1.设置img vertical-align:bottom /* display:block; */ 2.img 变成块级元素 display:block;  变成块级元素就无法在父元素设置可继承的text-align:center等了,而是使用 margin:xx a

android 在布局中动态添加控件

第一步 Java代码 final LayoutInflater inflater = LayoutInflater.from(this); 第二步:获取需要被添加控件的布局 Java代码 final LinearLayout lin = (LinearLayout) findViewById(R.id.LinearLayout01); 第三步:获取需要添加的布局(控件) Java代码 LinearLayout layout = (LinearLayout) inflater.inflate( R