一、神奇的两个inline-block

很初级的问题,无聊决定写一个故事。

故事的主人公很简单,两个inline-block元素。代码如下,为了看起来简单明了,写得很简陋。效果图如右。发现有两个问题。

1:两个元素水平有空隙,简单的初始化margin:0好像并没有起想象中的作用,为什么呢

2:两个元素垂直也没有对齐,等高的的行内块元素不应该阿:

 

二、消除两个inline-block元素水平间距

最终效果

讲解demo

<div class="space">
<a href="##">惆怅</a>
<a href="##">淡定</a>
<a href="##">热血</a>
</div>

1.去空格

元素间留白间距出现的原因就是标签段之间的空格,因此,去掉HTML中的空格,自然间距就木有了。考虑到代码可读性,显然连成一行的写法是不可取的,我们可以:

<div class="space">
<a href="##">
惆怅</a><a href="##">
淡定</a><a href="##">
热血</a>
</div>

或者是:

<div class="space">
<a href="##">惆怅</a
><a href="##">淡定</a
><a href="##">热血</a>
</div>

或者是借助HTML注释:

<div class="space">
<a href="##">惆怅</a><!--
--><a href="##">淡定</a><!--
--><a href="##">热血</a>
</div>

等。

2、使用margin负值

.space a {
display: inline-block;
margin-right: -3px;
}

例如,对于12像素大小的上下文,Arial字体的margin负值为-3像素,Tahoma和Verdana就是-4像素,而Geneva为-6像素。

由于外部环境的不确定性,以及最后一个元素多出的父margin值等问题,这个方法不适合大规模使用。

3、让闭合标签吃胶囊

如下处理:

<div class="space">
<a href="##">惆怅
<a href="##">淡定
<a href="##">热血</a>
</div>

注意,为了向下兼容IE6/IE7等喝蒙牛长大的浏览器,最后一个列表的标签的结束(闭合)标签不能丢。

在HTML5中,我们直接:

<div class="space">
<a href="##">惆怅
<a href="##">淡定
<a href="##">热血
</div>

好吧,虽然感觉上有点怪怪的,但是,这是OK的。

4、使用font-size:0

类似下面的代码:

.space {
font-size: 0;
}
.space a {
font-size: 12px;
}

这个方法,基本上可以解决大部分浏览器下inline-block元素之间的间距(IE7等浏览器有时候会有1像素的间距)。不过有个浏览器,就是Chrome, 其默认有最小字体大小限制,因为,考虑到兼容性,我们还需要添加:
类似下面的代码:

.space {
font-size: 0;
-webkit-text-size-adjust:none;
}

5、使用letter-spacing

类似下面的代码:

.space {
letter-spacing: -3px;
}
.space a {
letter-spacing: 0;
}

6、使用word-spacing

类似下面代码:

.space {
word-spacing: -6px;
}
.space a {
word-spacing: 0;
}

三、使两个inline-block元素垂直对齐、

元素在父元素垂直居中有许多办法:

1,设置父元素line-hight等于父元素高度

2.设置父元素的after伪类,宽度为0,高度为100%的行内块和元素垂直居中,再设置vertical-align: middle;

3.父元素table-cell,再给父子元素设置vertical-align: middle等(CSS垂直居中的11种实现方式

首先什么是基线?元素的基线怎么确定?

对于inline-block元素来说,他的基线取决于元素本身的特性,

在该元素中没有行内子元素(注意是DOM树的子元素,块子元素中有行元素这个行元素算)的时候或者overflow不为visible,该inline-block的基线为margin-bottom的下边界。

否则,以该元素中最后一个行内子元素的基线为该元素的基线。

字母x的下边缘(线)就是我们的基线baseline。(以下是几种默认的基线对齐形式)

                                                                                                                                       

 

元素是怎么垂直对齐的?

vertical-align设置行内元素的基线相对于该元素所在行的基线的垂直对齐方式。

如a设置middle,b默认。则a的middle和b的bsaeline对齐

vertical-align:middle指的是baseline + 1/2 "x-height"高度。我们可以近似脑补成字母x交叉点那个位置。

vertical-align:baseline(,默认元素的基线与父元素的基线对齐)
vertical-align:sub(降低元素的基线到父元素合适的下标位置)
vertical-align:super(升高元素的基线到父元素合适的上标位置)
vertical-align:bottom(把对齐的子元素的底端与行框底端对齐)
vertical-align:text-bottom(把元素的底端与父元素内容区域的底端对齐,当line-height设置时与bottom显示不同)
vertical-align:top(把对齐的子元素的顶端与行框顶端对齐)
vertical-align:text-top(把元素的顶端与父元素内容区域的顶端对齐)
vertical-align:middle(元素的中垂点与父元素的基线加1/2父元素中字母X的高度对齐)
vertical-align:(+-n)px(元素相对于基线上下偏移npx)
vertical-align:x%(相对于元素的line-height值)
vertical-align:inherit(从父元素继承vertical-align属性的值)

举个例子,正常div,高度自适应,并且有一张图片。

会发现有一端留白,这段空白间隙就是vertical-alignline-height携手搞的鬼。

实际上块状元素内部还有一个(更有可能两个-前后)看不见摸不着没有宽度没有实体的空白节点

为了明显一点这个宽度为0的空格元素我们用inline-block来代替

可以看到图片的下边缘就和字母x下边缘对齐(见下图)

但是字符还是有高度的,由line-height决定(默认normal,1.2倍font-size)

怎么消除这种留白呢

1. 让vertical-align失效

将图片设置成display或者浮动、绝对定位等(如果布局允许)

2. 使用其他vertical-align值

告别baseline, 取用其他属性值,比方说bottom/middle/top都是可以的。

3. 直接修改父元素line-height值

空白部分其实是是文字计算后的行高底部和字母x下边缘的距离,如把line-height设置为0

4. line-height为相对单位,font-size间接控制

原理同上,如把font-size设置为0

③ 基本现象衍生:垂直居中

图片后面(前面)有个类似空格字符的节点,然后就能响应line-height形成高度,此时,图片再来个vertical-align:middle,就可以和这个被行高撑高的「幽灵空白节点」(近似)垂直对齐了。

不过上面的效果并不是完全的垂直居中,因为middle中线位置(字符x的中心)并不是字符内容的绝对居中位置

div { line-height: 240px; font-size: ; }
img { vertical-align: middle; }

font-size:0, 因此此时content area高度是0,各种乱七八糟的线都在高度为0的这条线上,绝对中心线和中线重合。自然全垂直居中:

两个inline-block消除间距和对齐(vertical-align)的更多相关文章

  1. 两个button之间的间距如何去掉

    在外层加上一个父元素,设置font-size:0;即可. 两个按钮之间的间距如何去掉

  2. [前端]如何写一个水平导航栏?(浮动、inline-block+消除间距)

    在看W3school时,看到一个很好的例子,如何制作一个水平的导航栏?没有任何要求,只需要达到下面的效果: 我认为这个例子包含了很多css布局需要了解的知识,因此单独写一下. W3school上面的方 ...

  3. inline-block,inline,block,table-cell,float

    float:left ---------------------------------------------------------------------------------------- ...

  4. 两个div横向排列,顶端对齐的方式。

    1.左右两个div都设置为float:left,如果右边div没有设置宽度,右边div的宽度会根据div里的内容自动调整. <!DOCTYPE html PUBLIC "-//W3C/ ...

  5. inline,block,inline-block的区别

    display:block block元素会独占一行,多个block元素会各自新起一行.默认情况下,block元素宽度自动填满其父元素宽度. block元素可以设置width,height属性.块级元 ...

  6. 使用<input>标签做了两个按钮, 按钮之间间距如何去掉

    遇到的问题: 使用<input>标签做了两个按钮, 按钮之间有个间距不知道怎么去掉. 如下图: 问题解决: <input>是内联块状元素(inline-block); 内联元素 ...

  7. inline, block, and inline-block

    总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 block-level elements (块级元素) 和 inline elements (内联元素).block元素通 ...

  8. display:inline block inline-block 的区别

    原文地址:http://blog.csdn.net/jly036/article/details/5506182 display:block就是将元素显示为块级元素. block元素的特点是: 总是在 ...

  9. inline,block,inline-block解析

    display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...

随机推荐

  1. WPF实现特殊统计图

    效果图: ActiveFunItem.xaml代码: <UserControl x:Class="SunCreate.Vipf.Client.UI.ActiveFunItem" ...

  2. Android Service用法知识点的讲解

    Android Service 学习Service相关知识点: android service 的基础知识,生命周期,service分类,运行地点(本地服务,远程服务),运行类型(前台服务,后台服务) ...

  3. vs2017 遇到异常。这可能是由某个扩展导致的。奇妙的解决方式

    最近在使用visual studio 2017 创建.netcore 2.2的MVC项目后,在View里面拖拽引用css或js文件时总出现“遇到异常.这可能是由某个扩展导致的.” 然后在网上找了大半天 ...

  4. css 设计规范

    外部 div 设置 margin 和 padding: 内部每个元素只设计跟自己相关的属性,这样方便复用:

  5. vue elementui 引入第三方icon iconfront

    elementui框架自带icon在开发大型前端应用时显得捉襟见肘.淘宝开源的iconfront的图标库上有很多优秀的icon图标.elementui支持整合iconfront到应用中,步骤如下: 首 ...

  6. linux中awk的使用

    在linux中awk绝对是核心工具,特别是在查找搜索这一领域,和掌握sed命令一样重要 下面为awk的一些基本知识,基于这些知识,可以让你随意操控一个文件: 在awk中:()括号为条件块,{}为执行的 ...

  7. Xamarin.Android 调用手机拍照功能

    最近开发Android遇到了调用本地拍照功能,于是在网上搜了一些方法,加上自己理解的注释,在这儿记录下来省的下次用时候找不到,同事也给正在寻找调用本地拍照功能的小伙伴一些帮助~ 实现思路:首先加载-- ...

  8. (转)websphere线程池 连接池设置

    原文:http://www.talkwithtrend.com/Article/207511 池(Pool)是WebSphere中最常涉及的概念之一.从网络.Web 服务器.Web 容器.EJB 容器 ...

  9. HP服务器设置iLO步凑

    HP服务器设置iLO步凑 1.开机出现界面—按下F11进入Boot Menu: 2.选择Generic USB Boot回车: 3.选择System Configuration回车: 4.选择iLO ...

  10. Spring Boot 集成 Swagger2 与配置 OAuth2.0 授权

    Spring Boot 集成 Swagger2 很简单,由于接口采用了OAuth2.0 & JWT 协议做了安全验证,使用过程中也遇到了很多小的问题,多次尝试下述配置可以正常使用. Maven ...