css水平垂直居中总结

在网页布局中,垂直居中对齐总是一个绕不过的话题,而且这两种对齐方式由于浏览器渲染方式的不同,也存在很多不同的场景,本文试图将这些场景一一列举并给出解决方案,也是对这个知识点的一点回顾和总结。

1.水平居中

水平居中这个问题首先要搞清楚存在两个条件才能够称之为水平居中,即父元素必须是块级盒子容器父元素宽度必须已经被设定好,在这两个前提下我们来看水平居中问题。

场景1:子元素是块级元素且宽度没有设定

在这种情况下,实际上也不存在水平居中一说,因为子元素是块级元素没有设定宽度,那么它会充满整个父级元素的宽度,即在水平位置上宽度和父元素一致

html代码

<div class="wrap">
   <div class="non-child">
      non-child
   </div>
</div>

css代码:

 .wrap{
          width: 300px;
          height: 200px;
          border: 2px solid #ccc;
          box-sizing: border-box;

      }
        .non-child{
            border: 1px solid #000;
            background: green;

        }

结果:

场景2:子元素是行内元素,子元素宽度是由其内容撑开的

这种情况下解决方案是给父元素设定text-align:center;

html代码:

<div class="wrap center">
    <span class="span">1111</span>
</div>

css代码

  .wrap{
          width: 300px;
          height: 200px;
          border: 2px solid #ccc;
          box-sizing: border-box;
      }
 .span{
            background: red;
        }
 .center{
            text-align: center;
        }

结果:

场景3

子元素是块级元素且宽度已经设定

这种情形存在多种解法,下面一一来列举

解法1:给子元素添加margin:0 auto;

HTML代码

<div class="wrap">
    <div class="child auto">
        non-child
    </div>
</div>

css代码:

.child{
            width: 100px;
            height: 100px;
            background: green;
            box-sizing: border-box;
        }
        .auto{
            margin:0 auto;
        }
   .wrap{
          width: 300px;
          height: 200px;
          border: 2px solid #ccc;
          box-sizing: border-box;
      }

结果

解法2:通过计算指定父元素的padding-left或padding-right

HTML代码

<div class="wrap padding">
    <div class="child ">
        non-child
    </div>
</div>

css代码:

 .child{
            width: 100px;
            height: 100px;
            background: green;
            box-sizing: border-box;
        }
 .padding{
            padding-left: 100px;
        }
 .wrap{
          width: 300px;
          height: 200px;
          border: 2px solid #ccc;
          box-sizing: border-box;
      }

结果同上,这里计算父元素padding-left或padding-right的方法为(父元素宽度-子元素宽度)/2,注意这里为了计算方便给父元素和子元素都设定了box-sizing:border-box,这样设定的宽度就是包含border+padding+content整个宽度来计算的,如果不设定box-sizing:border-box,浏览器默认是认为content-box,所以设定的宽度仅包含content的宽度,在这种情况下,计算父容器的padding-left或padding-right的方式就是[(父容器content宽度+左右border宽度)-(子容器content宽+水平padding宽+左右border宽)]/2,可以看到较为麻烦,所以这里建议让父元素和子元素都采取border-box.

解法3:计算得到子元素的margin-left或margin-right

html代码

<div class="wrap">
    <div class="child margin">
        non-child
    </div>
</div>

css代码

 .child{
            width: 100px;
            height: 100px;
            background: green;
            box-sizing: border-box;
        }
 .margin{
            margin-left:100px;
        }
 .wrap{
          width: 300px;
          height: 200px;
          border: 2px solid #ccc;
          box-sizing: border-box;
      }

结果同上,这里计算子元素margin-left或margin-right的方法同上。

解法4:

通过子元素相对父元素绝对定位

html代码

<div class="relative">
    <div class="child absolute">
        non-child
    </div>
</div>

css代码

 .relative{
            width: 300px;
            height: 200px;
            border: 2px solid #ccc;
            box-sizing: border-box;
            position: relative;
        }
        .absolute{
            position: absolute;
            left:50%;
            margin-left:-50px;
        }
   .child{
            width: 100px;
            height: 100px;
            background: green;
            box-sizing: border-box;
        }

结果同上,这里还要设定子元素margin-top为-50是需要消除父元素50%造成的偏移

解法5:利用flex-box

HTML代码

<div class="flex">
    <div class="child ">
        non-child
    </div>
</div>

css代码

 .flex{
            width: 300px;
            height: 200px;
            border: 2px solid #ccc;
            box-sizing: border-box;
            display:flex;
            flex-direction: row;
            justify-content:center;

        }
  .child{
            width: 100px;
            height: 100px;
            background: green;
            box-sizing: border-box;
        }

结果同上

2.垂直居中

和水平居中一样,这里要讲垂直居中,首先设定两个条件即父元素是盒子容器高度已经设定

场景1:子元素是行内元素,高度时有其内容撑开的

这种情况下,需要通过设定父元素的line-height为其高度来使得子元素水平居中

html代码

<div class="wrap line-height">
    <span class="span">111111</span>
</div>

css代码

 .wrap{
            width:200px ;
            height: 300px;
            border: 2px solid #ccc;
            box-sizing: border-box;
        }
        .span{
            background: red;
        }
        .line-height{
            line-height: 300px;
        }

结果

场景2:子元素是块级元素但是子元素高度没有设定,在这种情况下不存在垂直居中一说,因为子元素会默认在垂直方向上充满父元素高度

html代码

<div class="wrap ">
    <div class="non-height">111111</div>
</div>

css代码

 .wrap{
            width:200px ;
            height: 300px;
            border: 2px solid #ccc;
            box-sizing: border-box;
        }
 .non-height{
            background: green;
        }

结果:

场景3:子元素是块级元素且高度已经设定

解法1:

计算子元素的margin-top或margin-bottom,计算方法为父元素高度-子元素高度/2

html代码

<div class="wrap ">
    <div class="div1 margin">111111</div>
</div>

css代码

  .wrap{
            width:200px ;
            height: 300px;
            border: 2px solid #ccc;
            box-sizing: border-box;
        }
.div1{
            width:100px ;
            height: 100px;
            box-sizing: border-box;
            background: darkblue;
        }
        .margin{
          margin-top: 100px;
        }

结果

解法2:计算父元素的padding-top或padding-bottom,计算方法为父元素高度-子元素高度/2

html代码

<div class="wrap  padding">
    <div class="div1 ">111111</div>
</div>

css代码

 .wrap{
            width:200px ;
            height: 300px;
            border: 2px solid #ccc;
            box-sizing: border-box;
        }
 .padding{
            padding-top: 100px;
        }
.div1{
            width:100px ;
            height: 100px;
            box-sizing: border-box;
            background: darkblue;
        }

结果同上

解法3:利用绝对定位,让子元素相对于父元素绝对定位

html代码

<div class="wrap  relative">
    <div class="div1 absolute">111111</div>
</div>

css代码

 .relative{
            position: relative;
        }
        .absolute{
            position: absolute;
            top:50%;
            margin-top: -50px;
        }
.wrap{
            width:200px ;
            height: 300px;
            border: 2px solid #ccc;
            box-sizing: border-box;
        }
.div1{
            width:100px ;
            height: 100px;
            box-sizing: border-box;
            background: darkblue;
        }

结果同上

解法4:利用flexbox

html代码

<div class="wrap  flex">
    <div class="div1 ">111111</div>
</div>

css代码

.flex{
            display: flex;
            flex-direction: column;
            justify-content: center;
        }
.wrap{
            width:200px ;
            height: 300px;
            border: 2px solid #ccc;
            box-sizing: border-box;
        }
.div1{
            width:100px ;
            height: 100px;
            box-sizing: border-box;
            background: darkblue;
        }
时间: 2024-11-03 21:27:50

css水平垂直居中总结的相关文章

常见的几种 CSS 水平垂直居中解决办法

用CSS实现元素的水平居中,比较简单,可以设置text-align center,或者设置 margin-left:auto; margin-right:auto 之类的即可. 主要麻烦的地方还是在垂直居中的处理上,所以接下来主要考虑垂直方向上的居中实现. 水平垂直居中主要包括三类:基本文本类,图像类,其他元素类 但,也是由一些方法可以实现的,下面就来谈谈了解到的10中方法. 方法一.使用 line-height 这种方式更多地用在 单行文字的情况,其中使用overflow:hidden的设置是

CSS水平垂直居中的几种方法

直接进入主题! 一.脱离文档流元素的居中 方法一:margin:auto法 CSS代码: div{ width: 400px; height: 400px; position: relative; border: 1px solid #465468; } img{ position: absolute; margin: auto; top: 0; left: 0; right: 0; bottom: 0; } HTML代码: <div> <img src="mm.jpg&quo

CSS水平垂直居中的几种方法2

直接进入主题! 一.脱离文档流元素的居中 方法一:margin:auto法 CSS代码: div{ width: 400px; height: 400px; position: relative; border: 1px solid #465468; } img{ position: absolute; margin: auto; top: 0; left: 0; right: 0; bottom: 0; } HTML代码: <div> <img src="mm.jpg&quo

css 水平垂直居中那些事

本文是在参考众大神文章基础上,整理的几个常用方案,另外也掺杂个人的一些猜想,如有不妥,请不吝指出下面开始正题,为了方便验证+展示,下面的案例我会直接附上个人验证的源码+截图 1. <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="t

介绍一种css水平垂直居中的方法(非常好用!)

这次介绍一下一个水平垂直居中的css方法,这个方法可以说是百试百灵,废话不多说,直接附上代码: html,body{ width:100%; height:100%; } 你需要居中的元素{ position: fixed;(absolute)      left:50%;      top:50%;      -webkit-transform: translate(-50%,-50%); } 他的父元素{ position: relative; width:100%; height:100%

CSS水平垂直居中方法总结

部分HTML代码如下: <div class="wrap block"> <div class="block-center">块儿居中</div> </div> <div class="wrap inline"> <span class="inline-center">内联居中</span> </div> 一.absolute 拔河

CSS水平垂直居中常见方法总结(转)

行内元素: 父级元素是块级元素:父元素设置text-align:center 1.元素水平居中 margin: 0 auto;谁居中,谁设置 居中不好使的原因: 1.元素没有设置宽度,没有宽度怎么居中嘛! 2.设置了宽度依然不好使,你设置的是行内元素吧 实例1: <div class="box"> <div class="content"> 哇!居中了 </div> </div> <style type=&quo

聊聊css水平垂直居中那些事

1.水平居中实现方法 <div class="demo">     我是一个水平居中的div </div> /*方法1*/ .demo{width: 960px;margin: 0 auto;} /*方法2*/ .demo{width: 960px;height: 400px;background: #f00;position: relative;left: 50%;margin-left: -480px;} 2.水平垂直居中实现方法 <div class

css - 水平垂直居中几种方式

水平垂直居中 水平居中 定宽: margin: 0 auto; 不定宽: 参考例子中不定宽高例子. 垂直居中 position: absolute设置left.top.margin-left.margin-to(定高): position: fixed设置margin: auto(定高): display: table-cell: transform: translate(x, y): flex(不定高,不定宽): grid(不定高,不定宽),兼容性相对比较差: 例子 右键f12 覆盖html后