inline-box之vertical-align详解

一:图片文字布局的解决方案

1,图片文字一行居中

方法一:采用img方式

<img>一掷千金,**为您轻松备战购物节<img>

css: img{vertical-align: middle;}

备注:vertical-align 只对行内元素有效,对块级元素无效。

思考:设置 img 的vertical-align:middle 可以使旁边的文字上下居中

方法二:采用背景图的方式

<div class="test">一掷千金,**为您轻松备战购物节</div>

background: url(../../images/landingpage/2017NovemberActivity/img1.png) left no-repeat;

width: 203px;

padding-left: 66px;

如果是左边的图片就left 如果是右边的图片就right

background: url(../../images/landingpage/2017NovemberActivity/img1.png) right no-repeat;

width: 203px;

padding-right: 66px;

方法三:采用两个div float的方式

<div class="test1"></div>

<div class="test2">一掷千金,合拍为您轻松备战购物节</div>

.test1{

background: url(../../images/landingpage/2017NovemberActivity/img1.png) center no-repeat;

width: 66px;

height: 50px;

display: inline-block;

float: left;

}

.test2{

float: left;

height: 50px;

line-height: 50px;

}

二:关于vertical-align的解析

1,关于vertical-align 语法属性详解

(1)vertical-align属性的具体定义列表如下:

语法: vertical-align : baseline | sub | super | top | text- top | middle | bottom | text-bottom | <百分比> | <长度> | inherit

说明: 设置元素内容的垂直对齐方式

值: baseline:基线对齐;sub:下标;super:上标;top:顶端对齐;text-top:与文本的顶端对齐;middle:中部对齐;bottom:底端对齐;text-bottom:文本的底端对齐;

百分比和长度:CSS2,可为负数。

初始值: baseline

继承性: 不继承

适用于: 行内元素和单元格(table-cell)元素

媒体: 视觉

计算值: 百分比和长度值为绝对长度;其他同指定值

此处需要特别注意的是:垂直对齐属性只对行内元素有效。

(2)预备知识

了解baseline top middle bottom的一般结构图

clipboard3.png

当然,大家不要误会了,在实际渲染中,line box的这几条线并非等分的,要视具体情况而定,毕竟vertical-align还会受line-height的影响。

举个实际例子,下面是我在ps上面画图的,可能不太清晰

clipboard4.png

最上面的虚线是top line,最下面的是bottom line,文字的顶部和底部分别是text-top text-bottom,而middle在baseline的上面一点。

baseline,所谓基线,是指小写x的底部所在的那条水平线位置,形象点,你在ps里面写文字时出现的那条线即是(可以试试,看下图)

clipboard5.png

middle,顾名思义就是中间线,那什么是中间线,准确定义是这样的:中线位于基线的上方,与基线的距离为小写字母x高度(即ex)的一半。而ex同字体尺寸相关,大部分浏览器认为1ex = 0.5em,因此会将基线以上四分之一em处作为中线来对齐。

注意:同在行高显示上的差别一样,在中间对齐上,各浏览器之间也稍有些差异。

(3)vertical-align属性值例子如下:

  1. 基线对齐(vertical-align : baseline)

基线对齐(vertical-align : baseline)使元素的基线同父元素的基线对齐

先看例子:

<div class="test">

<img src="./Img/actives/2017NovemberActivity/bag1.png">

xxx:vertical-align啦啦啦,大奖快来砸文文!

</div>

div{

text-align: center;

border: 1px dashed #fff;

margin: 50px;

}

clipboard6.png

图1

其中:白色虚线框是父容器,里面包含一张图片,一行文字,默认基线对齐

可以看到:图片是与基线对齐的,也就是小写字母x的底部所在的水平线。

思考一:为啥图片和文字下方还有一段空白呢?后面将会解释,可以先思考一下。

为了方便比较,我给文字加了一个span标签,并且加了一个背景,方便大家比较,如下图

clipboard7.png

代码如下:

<div class="test">

<img src="./Img/actives/2017NovemberActivity/bag1.png" ">

<span style="background: orange;">xxx:vertical-align啦啦啦,大奖快来砸文文!</span>

</div>

img{

vertical-align: baseline;

}

  1. 顶端对齐(vertical-align : top)

顶端对齐(vertical-align : top)是将元素的行内框的顶端与行框的顶端对齐

clipboard8.png

图2

思考二:为啥我们设置了img的属性,文字也跟着跑上去了呢?

  1. 文本顶端对齐(vertical-align : text-top)

文本顶端对齐(vertical-align : text-top)是将元素行内框的顶端同文本行的顶线对齐

clipboard9.png

图3

思考三:text-top为啥表现跟top一样呢?什么时候不一样呢?

  1. 底端对齐(vertical-align : bottom)

底端对齐(vertical-align : bottom)与顶端对齐(vertical-align : top)相反

clipboard10.png

图4

  1. 文本底端对齐(vertical-align : text-bottom)

文本底端对齐(vertical-align : text-bottom)与文本顶端对齐(vertical-align : text-top)相反

clipboard11.png

图5

  1. 中间对齐(vertical-align : middle)

中间对齐(vertical-align : middle)通常使用在图片上,将图片的垂直方向的中线与文本行的中线对齐

clipboard12.png

图6

思考四:我们设置的是img居中,为啥看到的效果是文字跑到图片的居中了呢?图片的中线究竟与文字哪个水平位置平行呢?

7,上标和下标

上标(vertical-align:super)使元素的基线(替换元素的底端)相对于父元素的基线升高,下标(vertical-align:sub)使元素的基线降低

vertical-align:super图如下

clipboard13.png

图7

vertical-align:sub图如下

clipboard14.png

图8

三:关于上述问题的答案

首先,看第一个问题:为啥图片和文字下方还有一段空白呢?

仔细检查,我们并没有设置padding 或者其他属性啊,其实,这个是由于vertical-align 和line-height一起影响的。对于内联元素,这两个属性是无处不在的,尽管你没有使用它。

从图1我们可以看到,vertical-align:baseline的对齐是正确的,我们知道,baseline是小写字母x的底部,图片确实和x的底部对齐,那么,我们就知道问题的原因了。不管是图片还是文字实际上的占用空间不是我们看到的大小,还有一部分我们看不到的虚拟区域,而这部分虚拟区域是行高影响的,匿名文本本身就是有行高的,继承父级元素设置的行高,默认为normal(即font-size的1.2倍),所以X的底边距离行框有一段距离,这段距离就是图像留出的空隙。

clipboard15.png

大家会想,如果想去掉这个空白呢,很简单,方法如下:

一是可以改变vertical-align的值

二是让vertical-align失效,那么可以设置img为block,或者float等

三是设置父元素div 的line-height 为0

四是设置font-size为0

这些方法是没有考虑文字和图片对齐的话,仅仅是考虑去掉img标签下面的空白地方

问题二:为啥我们设置了img的属性,文字也跟着跑上去了呢?

这个问题与问题四的本质一样的。很简单:其实我们看到的现象不是本质,本质是图片的top line与父容器的top对齐,这个时候图片的top就与文字的top在一条线上,所以是图片移动了,而不是文字移动了。为了验证,可以做如下实验:

给div加一个line-height:300px

样式如下:

div{line-height: 300px;}

img{vertical-align: baseline;}

clipboard16.png

然后我们变化一下img的verical-align属性值

vertical-align: bottom;

clipboard17.png

vertical-align: middle;

clipboard18.png

vertical-align: top;

clipboard19.png

通过实验,大家可以发现,变化的是图片的位置,旁边的文字并没有变化,大家可以试试!

思考:为什么我们设置line-height 而不是设置Height,如果是设置高度会有问题?line-height与height有啥本质区别?如果上面我们设置line-height的高度比较小呢?

直接上图

div{line-height: 0;}

img{vertical-align: top;}

clipboard20.png

原因:因为字符实际占据的高度是由行高决定的,当行高变成0的时候,字符占据的高度也是0,此时,高度的起始位置就变成了字符content area的垂直中心位置,于是,文字就一半落在看看2的外面了。

问题三:text-top为啥表现跟top一样呢?什么时候不一样呢?

直接说答案吧:当设置了line-height的时候就不一样啦

这个div设置的是line-height:300px

图片就挨着div的顶部对齐了

clipboard21.png

下面再看text-top

clipboard22.png

这个时候图片就与文字的top对齐了

问题四:我们设置的是img居中,为啥看到的效果是文字跑到图片的居中了呢?图片的中线究竟与文字哪个水平位置平行呢?

第一问已经解释了,那么图片中中线与文字哪个位置水平平行呢?根据middle的解析,应该是在字母x的中心位置,即基线上面0.5ex处,如果有Line-height的情况下,这里也不是绝对居中的,至于为什么,大家可以下去查查,这里不详述了!

三、inline-box布局的三个重要属性:line-height、font-size、vertical-align

从上面的例子可以看出,这几个属性值任何一个改变都可能改变UI的布局情况,那么这三个的具体关系是啥呢?

先看这张图。了解几个基本概念。

clipboard23.png

内容区:对于行内非替换元素或匿名文本某一部分,font-size确定了内容区的高度

行内框:内容区加上行间距等于行内框。如果一个行内非替换元素的font-size为15px,line-height为21px,则相差6px。用户代理将这6像素一分为二,将其一半分别应用到内容区的顶部和底部,这就得到了行内框

当line-height小于font-size时,行内框实际上小于内容区

行框

行框定义为行中最高行内框的顶端到最低行内框底端之间的距离,而且各行框的顶端挨着上一行行框的底端

line-height行高是指文本行基线之间的距离

行高line-height实际上只影响行内元素和其他行内内容,而不会直接影响块级元素,也可以为一个块级元素设置line-height,但这个值只是应用到块级元素的内联内容时才会有影响。在应用到块级元素时,line-height定义了元素文本基线之间的最小距离,即最小行高。

vertical-align的百分数值是相对于元素的line-height来计算的。对于垂直对齐来说,图像本身的高度无关紧要,关键是line-height的值

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342