zoukankan      html  css  js  c++  java
  • css水平垂直居中

    margin法(水平居中)

    需要满足三个条件:

    • 元素定宽
    • 元素为块级元素或行内元素设置display:block
    • 元素的margin-leftmargin-right都必须设置为auto
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <style>
            .box {
                width: 100px;
                height: 100px;
                background: orange;
                margin: 0 auto;
            }
        </style>
    </head>
    <body>
        <div class="box"></div>    
    </body>
    </html>

    定位法(水平垂直居中)

    首先绝对定位,设置top:50%; left:50%; 然后再利用负margin把它向左、向上移动(移动距离相当于它自身宽高的一半)

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <style>
            .box {
                width: 100px;
                height: 100px;
                background: orange;
                position: absolute;
                left: 50%;
                top: 50%;
                margin-left: -50px;  /*宽度的一半*/
                margin-top: -50px;   /*高度的一半*/
            }
        </style>
    </head>
    <body>
        <div class="box"></div>    
    </body>
    </html>

    利用calc()函数简化上面的代码:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <style>
            .box {
                width: 100px;
                height: 100px;
                background: orange;
                position: absolute;
                left: calc(50% - 50px);
                top: calc(50% - 50px);
            }
        </style>
    </head>
    <body>
        <div class="box"></div>    
    </body>
    </html>

    这个方法的最大的局限性在于它要求元素的宽高是固定的,在通常情况下,对那些需要居中的元素来说,其尺寸往往是由其内容来决定的。如果能找到一个属性的百分比是以元素自身的宽高作为解析基准,那我们的难题就迎刃而解!遗憾的是,对于绝大多数css属性(包括margin)来说,百分比都是以父元素的尺寸为基准进行解析的。

    而translate()变形函数中使用百分比值时,是以这个元素自身的宽度和高度为基准进行换算和移动的,这正是我们所需要的,接下来,只要换用基于百分比的css变形来对元素进行偏移,就不需要在偏移量中把元素的尺寸写死了。这样我们就可以彻底解决对固定尺寸的依赖。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <style>
            .box {    
                padding: 20px;
                background: orange;
                position: absolute;
                left: 50%;
                top: 50%;
                transform: translate(-50%, -50%);
            }
        </style>
    </head>
    <body>
        <div class="box">this is a test.</div>    
    </body>
    </html>

    文字水平垂直居中

    对于单行文字来说,直接使用text-align: center即可实现水平居中。使用line-height实现垂直居中。
    多行文字可以看作一个块级元素参考margin法和定位法。

    绝对水平垂直居中

    利用绝对定位与margin:auto; box宽度与高度要固定,常用在弹出层的定位中。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <style>
            .box {    
                width: 100px;
                height: 100px;
                background: orange;
                position: absolute;
                left: 0;
                right: 0;
                top: 0;
                bottom: 0;
                margin: auto;
            }
        </style>
    </head>
    <body>
        <div class="box"></div>    
    </body>
    </html>

    writing-mode与垂直居中

    我们知道块状元素的水平居中可用margin:0 auto来实现,即margin-left:auto;margin-right:auto;

    writing-mode是改变文档流的显示方向的,所以水平居中也可以变为垂直居中。writing-mode结合margin-top:auto,margin-bottom:auto就可以实现。

    但水平居中会失效。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <style>
            .father {
                width: 500px;
                height: 500px;
                background: orange;
                writing-mode: vertical-lr;
            }
            .son {
                width: 100px;
                height: 100px;
                background: red;
                margin: auto;
            }
        </style>
    </head>
    <body>    
        <div class="father">
            <div class="son"></div>
        </div>
    </body>
    </html>

    基于视口单位(水平垂直居中)

    vw是相对于视窗的宽度。与你预期刚好相反,1vw相当于视窗宽度的1%,而不是100%
    vw相似的是,1vh相当于视窗高度的1%
    如果视窗的宽度小于高度,1vmin等于1vw,反之,如果视窗宽度大于高度,1vmin等于1vh
    如果视窗的宽度大于高度,1vmax等于1vw,反之,如果视窗宽度小于高度,1vmax等于1vh

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <style>
            .box {    
                width: 100px;
                height: 100px;
                background: orange;
                margin: 50vh auto 0;
                transform: translateY(-50%);
            }
        </style>
    </head>
    <body>
        <div class="box"></div>    
    </body>
    </html>

    注意:这种方法最大的局限是只能适用于元素在视窗中垂直居中,如果是在局部的某个地方就无能为力了。

    Flexbox的解决方案

    如果不考虑浏览器的兼容性,Flexbox无疑是最好的解决方案,因为它的出现就是为了解决这样的问题。

    完成这项工作只需要两个样式,在需要水平垂直居中的父元素上设置display:flex(在这个例子中的body元素)和在水平垂直居中的元素上设置margin:auto(在这个例子中的类名为box的元素)

    当我们使用Flexbox时,margin:auto;不仅在水平方向上将元素居中,垂直方向上也是如此。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <style>
            body {
                display: flex;
                margin: 0;
                min-height: 100vh;
            }
            .box {    
                width: 100px;
                height: 100px;
                background: orange;    
                margin: auto;
            }
        </style>
    </head>
    <body>
        <div class="box"></div>    
    </body>
    </html>

     Flexbox的另一个好处是,它可以将匿名容器(即没有被标签包裹的文本节点)垂直居中。

    代码如下:我们先给box指定一个固定的尺寸,然后借助flexbox的align-items和justify-content属性,这样让它内部的文本也实现居中。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title></title>
        <style>
            .box {
                width: 400px;
                height: 400px;
                background: orange;
                display: flex;
                align-items: center;
                justify-content: center;
            }
        </style>
    </head>
    <body>
        <div class="box">this is a test.</div>
    </body>
    </html>

     

    参考:https://xdlrt.github.io/2016/12/15/2016-12-15/

  • 相关阅读:
    如何弹出QQ临时对话框实现不添加好友在线交谈效果
    让sublime text3支持Vue语法高亮显示[转]
    spa(单页面应用)的优缺点[转]
    vue-devtoools 调试工具安装
    元素视差方向移动jQuery插件-类似github 404页面效果
    js删除数组元素、清空数组的简单方法
    sublime text3 setting-user
    vue环境搭建
    Starting httpd:Could not reliably determine the server's fully qualified domain name
    使用传输表空间迁移数据
  • 原文地址:https://www.cnblogs.com/loveyunk/p/6377554.html
Copyright © 2011-2022 走看看