样式篇-居中的方法总结

156 阅读2分钟

一、水平居中:

前提: 父元素必须是块级元素,父元素宽度必须已经设定好

场景1;子元素是块级元素并且宽度没有设定(无需考虑)
场景2:子元素是行内元素(子元素的宽度是由内容撑开的)
    解决: text-align: center
场景3:子元素是块级元素并且宽度已经设定
    方案一:给子元素添加: margin: 0 auto;
    方案二:通过子元素相对父元素绝对定位
        1.父相子绝
        2.子:left: 50%;margin-left: -子宽-半(知道子元素宽度) 或 transform: translateX(-50%)(不知道子元素宽度) ;
    方案三:父: 弹性布局
        display: flex; flex-direction:row; justify-content: center;

二、垂直居中

前提: 父元素是盒子元素
场景1: 子元素是行内元素且为单行:设置父元素line-heigh为高度
    子元素是行内元素且为多行:设置父元素display: inline/inline-block/table-cell; vertical-align: middle;
场景2:  子元素是块级元素且子元素高度没有设定
    方案一:设置父元素display: inline/inline-block/table-cell; vertical-align: middle;
    方案二: 父元素 {display: flex; flex-direction:column; justify-content: center;}
场景3: 元素是块级元素且子元素高度已经设定
    方案一:让子元素相对父元素绝对定位
        父相子绝
            子(高已知): top: 50%;margin-top: -子高一半
            子(高未知): top: 50%;transform: translateY(-50%);
    方案二: 父元素 {display: flex; flex-direction:column; justify-content: center;}

三、垂直和水平同时居中:

方案一:父相子绝:
    子(宽高已知): top: 50%; left: 50%; margin-left: -子宽一半; margin-top: -子高一半
    子(宽高未知): top: 50%; left: 50%; transform: translate(-50%, -50%)
方案二: 
    .son {display: flex; justify-content: center; align-item: center; }
    

提问: 块级元素内部一定可以嵌套块级元素吗?

不一定。如p元素嵌套h1元素

 效果: 

WechatIMG621.png

不可自由嵌套的元素(就是里面只能放内联元素):

标题标记的<h1><h2><h3><h4><h5><h6><caption>
段落标记的<p>
分割线<hr>
一个特别的元素<dt>(它只存在于列表元素<dl>的子一级)。