zoukankan      html  css  js  c++  java
  • CSS元素和文本垂直居中

    div居中

    1、使用绝对定位和负外边距让块级元素垂直居中

    要点:必须提前知道被居中块级元素的尺寸,否则无法准确实现垂直居中。

    <div id="box">
        <div id="child">我是测试DIV</div>
    </div>

    CSS代码:

    #box {
        width: 300px;
        height: 300px;
        background: #ddd;
        position: relative;
    }
    #child {
        width: 150px;
        height: 100px;
        background: orange;
        position: absolute;
        top: 50%;
        margin: -50px 0 0 0;    /*top设为50%,margin-top设置为负的容器的高度/2*/
        line-height: 100px;         /*单行文字,line-height值等于div的高度,使文字垂直居中*/
    }

    或者如下:

    #box {
        width: 300px;
        height: 300px;
        background: #ddd;
        position: relative;
    }
    #child {
      width: 50%;
        height: 30%;
        background: pink;
        position: absolute;
        top: 50%;
        margin: -15% 0 0 0;  /*margin的取值也可以是百分比,这时这个值规定了该元素基于父元素尺寸的百分比,可以根据实际的使用场景来决定是用具体的数值还是用百分比*/
    }

    2、使用绝对定位和transform让块级元素垂直居中

    要点:不必提前知道被居中元素的尺寸了,因为transform中translate偏移的百分比就是相对于元素自身的尺寸而言的。

    CSS代码:

    #box {
        width: 300px;
        height: 300px;
        background: #ddd;
        position: relative;
    }
    #child {
        background: #93BC49;
        position: absolute;
        top: 50%;
        transform: translate(0, -50%);
    }
    3、绝对定位结合margin: auto让块级元素垂直居中

    要点:

    1. 把要垂直居中的元素相对于父元素绝对定位,top和bottom设为相等的值(这里设成了0,也可以设为99999px或者-99999px无论什么,只要两者相等就行)。
    2. 再将要居中元素的margin设为auto,这样便可以实现垂直居中了。
    3. 被居中元素的宽高也可以不设置,但不设置的话就必须是图片这种自身就包含尺寸的元素,否则无法实现。

    css代码:

    #box {
        width: 300px;
        height: 300px;
        background: #ddd;
        position: relative;
    }
    #child {
        width: 200px;
        height: 100px;
        background: #A1CCFE;
        position: absolute;
        top: 0;
        bottom: 0;
        margin: auto;
        line-height: 100px;
    }

    4、使用padding实现子元素的垂直居中

    要点:给父元素设置相等的上下内边距,则子元素自然是垂直居中的,当然这时候父元素是不能设置高度的,要让它自动被填充起来,除非设置了一个正好等于上内边距+子元素高度+下内边距的值,否则无法精确的垂直居中。

    #box {
        width: 300px;
        background: #ddd;
        padding: 100px 0;
    }
    #child {
        width: 200px;
        height: 100px;
        background: #F7A750;
        line-height: 50px;
    }

    5、设置第三方基准

    要点:首先设置一个高度等于父元素高度一半的第三方基准元素,那么此时该基准元素的底边线自然就是父元素纵向上的中分线,做完这些之后再给要垂直居中的元素设置一个margin-top,值的大小是它自身高度的一半取负,则实现垂直居中。

    <div id="box">
        <div id="base"></div>
        <div id="child">测试测试测试!!</div>
    </div>

    CSS代码:

    #box {
        width: 300px;
        height: 300px;
        background: #ddd;
    }
    #base {
        height: 50%;
        background: #AF9BD3;
    }
    #child {
        height: 100px;
        background: rgba(131, 224, 245, 0.6);
        margin-top: -50px;
        line-height: 50px;
    }

     6、flex布局使块级元素垂直居中

     要点:元素可以通过将父元素设置display:flex;将其指定为flex布局的容器,指定好了容器之后再为其添加align-items属性,该属性定义项目在交叉轴(这里是纵向轴)上的对齐方式,可能的取值有五个,分别如下:

      flex-start::交叉轴的起点对齐;
      flex-end:交叉轴的终点对齐;
      center:交叉轴的中点对齐;
      baseline:项目第一行文字的基线对齐;
      stretch(该值是默认值):如果项目没有设置高度或者设为了auto,那么将占满整个容器的高度。

    具体flex布局在此。

    <div id="box">
        <div id="child">我是测试DIV</div>
    </div>

    CSS代码:

    #box {
        width: 300px;
        height: 300px;
        background: #ddd;
        display: flex;
        align-items: center;
    }
    #child {
        width: 300px;
        height: 100px;
        background: #8194AA;
        line-height: 100px;
    }

    7、第二种使用flex实现块级元素垂直居中

    要点:首先给父元素设置display:flex,设置好之后改变主轴的方向flex-direction: column,该属性可能的取值有四个,分别如下:

      row(该值为默认值):主轴为水平方向,起点在左端;
      row-reverse:主轴为水平方向,起点在右端;
      column:主轴为垂直方向,起点在上沿;
      column-reverse:主轴为垂直方向,起点在下沿。
    justify-content属性定义了项目在主轴上的对齐方式,可能的取值有五个,分别如下(不过具体的对齐方式与主轴的方向有关,以下的值都是假设主轴为从左到右的):
      flex-start(该值是默认值):左对齐;
      flex-end:右对齐;
      center:居中对齐;
      space-between:两端对齐,各个项目之间的间隔均相等;
      space-around:各个项目两侧的间隔相等。
    具体flex布局在此。
    css代码:
    #box {
        width: 300px;
        height: 300px;
        background: #ddd;
        display: flex;
        flex-direction: column;
        justify-content: center;
    }
    #child {
        width: 300px;
        height: 100px;
        background: #08BC67;
        line-height: 100px;
    }

    8、使用 line-height 和 vertical-align 对图片进行垂直居中

    <div id="box">
        <img src="duncan.jpeg">
    </div>

    css代码:

    #box{
        width: 300px;
        height: 300px;
        background: #ddd;
        line-height: 300px;
    }
    #box img {
        vertical-align: middle;
    }

    9、结合表格和vertical-align属性

    要点:将div转变成table-cell显示,然后通过vertical-align: middle;再设置其子元素垂直居中,子元素的高度可以动态改变,当outer里没有足够空间时,middle不会被截断。

    <div id="outer">
            <div id="middle">
                测试测试测试!!!
            </div>          
    </div>

    CSS代码:

    #outer{
        background-color: #13CDF4;
        width: 300px;
        height: 200px;
        display: table-cell; 
        vertical-align: middle;
    }
    #middle{ 
        background-color: #E41627;
        width: 100px;
        height: 100px;
        margin: 0 auto;
    }

    文本居中

    1、单行文本

    要点:只需要将文本行高(line-height)和所在区域高度(height)设为一致即可

    <div id="div1">
            这是单行文本垂直居中
    </div>

    CSS代码:

    #div1{
        width: 300px;
        height: 100px;
        margin: 50px auto;
        border: 1px solid red;
        line-height: 100px; /*设置line-height与父级元素的height相等*/
        text-align: center; /*设置文本水平居中*/
        overflow: hidden; /*防止内容超出容器或者产生自动换行*/
    }

    2、使用flex布局

    <div id="box">测试测试测试!!</div>

    CSS代码:

    #box {
        width: 300px;
        height: 300px;
        background: #ddd;
        display: flex;
        align-items: center;
    }

    3、多行文本垂直居中

    (1)父级元素高度不固定,随着内容变化

      要点:父级高度不固定的时,高度只能通过内部文本来撑开。这样,我们可以通过设置内填充(padding)的值来使文本看起来垂直居中,只需设置padding-top和padding-bottom的值相等。

    <div id="div1">
        这是多行文本垂直居中,这是多行文本垂直居中,这是多行文本垂直居中,这是多行文本垂直居中。
    </div>

    CSS代码:

            #div1{
                width: 300px;
                margin: 50px auto;
                border: 1px solid red;
                padding: 50px 20px;      /*设置padding-top和padding-bottom的值相等*/
                text-align: center; /*设置文本水平居中*/
            }

    (2)父级元素高度固定

           要点:css中的vertical-align属性只对拥有valign特性的元素才生效,结合display: table,可以使得div模拟table属性。因此我们可以设置父级div的display属性:display: table;然后再添加一个div包含文本内容,设置其display:table-cellvertical-align:middle

        <div id="outer">
            <div id="middle">
                这是固定高度多行文本垂直居中,这是固定高度多行文本垂直居中,这是固定高度多行文本垂直居中,这是固定高度多行文本垂直居中。
            </div>
        </div>

    CSS代码:

    #outer{
                width: 400px;
                height: 200px;
                margin: 50px auto;
                border: 1px solid red;
                display: table;
    }
    #middle{ 
                display:table-cell; 
                vertical-align:middle;  
                text-align: center; /*设置文本水平居中*/  
                width:100%;   
    }

    但是在IE7中显示效果如下:

    这是因为IE7及以下的版本并不能很好的支持display:table和display:table-cell属性,当然,如果你不考虑IE7以下的版本的浏览器,上述方法是可以实现垂直居中。如果把IE7及以下版本考虑进去,我们可以通过用到CSS hack的知识来设置针对不同浏览器的属性。

    要点:使用position定位来解决

        <div id="outer">
            <div id="middle">
                <div id="content">
                    这是固定高度多行文本垂直居中(兼容IE7),这是固定高度多行文本垂直居中(兼容IE7),这是固定高度多行文本垂直居中(兼容IE7),这是固定高度多行文本垂直居中(兼容IE7)。
                </div>
            </div>
        </div>

    CSS代码:

            #outer{
                width: 400px;
                height: 200px;
                margin: 50px auto;
                border: 1px solid red;
                display: table;
                *position:relative;  /*兼容IE7及以下版本*/
            }
            #middle{ 
                display:table-cell; 
                vertical-align:middle;  
                text-align: center; /*设置文本水平居中*/  
                width:100%;
                *position:absolute;   /*兼容IE7及以下版本*/
                *top:50%;   /*兼容IE7及以下版本,令middle相对于outer向下50%*/
            }
            #content {  
               *position:relative;  /*兼容IE7及以下版本 */
               *top:-50%;   /*兼容IE7及以下版本,令content相对于middle向上50%,这样content就会相对于outer居中*/
            }
  • 相关阅读:
    概率论基础学习笔记
    树点涂色
    2016北京集训测试赛(八)Problem C: 直径
    BZOJ 4361 ISN
    2017省选集训测试赛(二十五)Problem B recollection
    2016北京集训测试赛(六)Problem B: 矩阵
    记录Vue和Jquery混合开发中关于点击事件的一个bug
    记录JQ-WEUI中滚动加载的一个BUG
    Vue Elementui 如何让输入框每次自动聚焦
    什么是CDN加速?(转载)
  • 原文地址:https://www.cnblogs.com/lmjZone/p/8509161.html
Copyright © 2011-2022 走看看