vertical-align对齐规则

起做用的前提条件

  • 只能应用于内联元素以及 display 值为 table-cell 的元素。
  • vertical-align 属性只能做用在 display 计算值为 inline、inline- block,inline-table 或 table-cell 的元素上。所以,默认状况下,span、strong、 em等内联元素,img、button、input等替换元素,非 HTML 规范的自定义标签 元素,以及<td>单元格,都是支持 vertical-align 属性的,其余块级元素则不支持。
  • 浮动和绝对定位会让元素块状化,从而让内联元素的vertical-align不生效

百分比

  • vertical-align 的百分比值是相对于 line-height 计算的
  • 且是以line-height的基线为基础,vertical-align:0%和vertical-align:baseline效果同样

vertical-align:inline-block和baseline

  • vertical-align 属性的默认值 baseline 在文本之类的内联元素那里就是字符 x 的下 边缘,对于替换元素则是替换元素的下边缘。可是,若是是 inline-block 元素则规则要 复杂了:一个 inline-block 元素,若是里面就是没有图文内容,或者 overflow 不是 visible, 则该元素的基线就是其 margin 底边缘;不然其基线就是元素里面最后一行内的图文的基线。 见demo :inline-block元素的vertical-align.html

vertical-align:middle实现垂直居中

  • 内联元素:元素的垂直中心点和行框盒子基线往上 1/2 x-height 处对齐。vertical-align:middle 定义是元素的中线和字符 x 中心点对齐html

  • table-cell 元素:单元格填充盒子相对于外面的表格行居中对齐。table-cell 元素设置 vertical-align 垂 直对齐的是子元素,可是其做用的并非子元素,而是 table-cell 元素自身。就算 table-cell 元素的子元素是一个块级元素,也同样可让其有各 种垂直对齐表现。app

  • middle 将元素盒子的垂直中点与父盒子的baseline加上父盒子的x-height的一半位置对齐 这里元素盒子的垂直中点容易肯定,父盒子的baseline也好肯定,可是x-height要进行计算获得,这个x-height就是字母x的高度。ui

  • baseline肯定的规则 一、inline-table元素的baseline是它的table第一行的baseline。spa

二、父元素【line box】的baseline是最后一个inline box 的baseline。code

三、inline-block元素的baseline肯定规则htm

规则1:inline-block元素,若是内部有line box,则inline-block元素的baseline就是最后一个做为内容存在的元素[inline box]的baseline,而这个元素的baseline的肯定就要根据它自身来定了。 规则2:inline-block元素,若是其内部没有line box或它的overflow属性不是visible,那么baseline将是这个inline-block元素的底margin边界。blog

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    *{
        margin: 0;
        padding: 0;
    }
    .ctn-block{
        display: block;
        background-color: #bbb;
        line-height: 200px;
        font-size: 50px;
    }
    .ctn-block .child1{
        display: inline-block;
        width: 100px;
        height: 100px;
        margin:10px 0;
        vertical-align: baseline; /*将子元素盒子的baseline与父盒子的baseline对齐
        vertical-align: middle;/*将子元素盒子的垂直中点与父盒子的baseline加上父盒子的x-height的一半位置对齐*/

        /***注意:当vertical-align设置为top和bottom时,其就不是按照baseline进行定位了,而是根据line box进行定位。子元素盒子的顶部和底部也就是其上下margin外边界。**/
        /*vertical-align: top;/*将子元素盒子的顶部和其所在的line box顶部对齐*/
        /*vertical-align: bottom;/*将子元素盒子的底部和其所在的line box底部对齐*/
        background-color: aliceblue;
    }
    /*
    父元素.ctn-block的base-line是Gg的baseline,
    inline-block元素由于没有内部line box,也没有设置overflow:visible,因此其baseline是底margin边界。
    */
    .wrapper{
        width: 200px;
        height: 200px;
        border: 1px solid red;
        line-height: 150px; /*line box就是行高所造成的那个高度*/
    }
    .son{
        /***注意:当vertical-align设置为top和bottom时,其就不是按照baseline进行定位了,而是根据line box进行定位。子元素盒子的顶部和底部也就是其上下margin外边界。**/
        /*vertical-align: top;/*将子元素盒子的顶部和其所在的line box顶部对齐*/
        /*vertical-align: bottom;/*将子元素盒子的底部和其所在的line box底部对齐*/
        vertical-align: bottom;
        display: inline-block;
        width: 50px;
        height: 50px;
        background: black;
    }
    </style>
</head>
<body>
    <div class="ctn-block">
        <div class="child1"></div>
        <span>Gg</span>
    </div>
    <div class="wrapper">
        <span class="son"></span>
    </div>
</body>
</html>
相关文章
相关标签/搜索