CSS元素水平垂直居中方法

本文详细介绍了CSS实现元素水平垂直居中的多种方法,包括绝对定位、相对定位、Flex布局、行内内容居中、margin/padding、calc计算、position:absolute结合transform、Flexbox和Grid布局等。同时,还讲解了不同场景下的居中策略,如单行内容、表格内容的居中处理。
摘要由CSDN通过智能技术生成

1.不知道自己高度和父容器高度的情况下, 利用绝对定位只需要以下三行:
parentElement{
position:relative;
}

childElement{
position: absolute;
top: 50%;
transform: translateY(-50%);
}
2.若父容器下只有一个元素,且父元素设置了高度,则只需要使用相对定位即可
parentElement{
height:xxx;
}

.childElement {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}

Flex 布局:
不考虑兼容老式浏览器的话,用Flex布局简单直观一劳永逸:
parentElement{
display:flex;/Flex布局/
display: -webkit-flex; /* Safari */
align-items:center;/指定垂直居中/
}
行内内容的居中
如何让一个容器的行内内容(文本和行内元素–inline/inlineblock)居中。(当然inline-block比较特殊,即有行内属性,又有块级属性)
text-align:center水平居中
在块级元素上设置text-align:center,其内部的inline或inline-block的子元素以及文本内容会在父元素内居中。
line-height垂直居中
line-height设置了行间的距离(行高),将要居中的元素的line-heigth值设置为和其块级父元素的height值一样时,其内部内容会垂直居中。
用于单行的行内元素的垂直居中
.wrap{
height:100px;
line-height: 100px;
}
注意:
line-height不能使用负值
在块级元素使用line-height是定义该元素基线之间的最小距离而不是最大距离。
vertical-align:middle垂直居中
vertical-align的使用效果要分为以下不同情况:
行内元素inline/linline-block/inline-table内部内容的居中
使用伪元素(也可以.wrap的父元素和兄弟元素进行居中,将下面代码中的.wrap::before换成.wrap的兄弟元素的选择器即可)
.wrap{
display:inline-block;
vertical-align: middle;
}
.wrap::before{ //或者::after
content: ‘’;
display: inline-block;
height: 100%;
display:inline-block;
vertical-align: middle;
}
注意:
vertical-align大部分取值是相对于父元素来说的
例如vertical-align:baseline(vertical-align的默认值)是相对于父元素的基线对齐。父元素的基线取值有以下规则:
inline类——小写字母x的底端
inline-block类,其内没有inline类型——盒子模型的底端
inline-block类,其内有inline类型时——其内最后一行inline元素的基线(即最后一行小写x的底端)

设置为middle也不一定是真正的对齐,某些字体的中线位置不一定顶部和底部的正中间。
不同风格的字体常有不同的排版标准,因此有不同的基线/中线/顶线等,多种字体混合排版会让基线发生变化(参看父元素的基线取值规则)。

表格单元格(table-cell)元素
在单元格上设置vertical-align:middle,其内部内容将垂直居中。
::first-letter 和 ::first-line 伪元素 (同第一条行内元素)
块级元素居中
block、list-item、inline-block等元素如何在其父元素中居中。
margin/padding值设置居中
最基础的方法是设置精确的padding(父元素上)或margin(子元素上)值使得子元素居中,这里不再示例。
clac计算数值
margin值为 父容器宽/高的50% 减去 自身宽/高的50%:
.center{
width: 20rem;height: 20rem;
margin-left:calc(50% - 10rem);
margin-top:calc(50% - 10rem);
}
注意:inline水平的元素margin/padding设置仅在左右方向上有效。
margin:0 auto左右居中
要居中的块级元素(block)元素设置margin:0 auto 。
注意:对浮动元素、绝对定位和固定定位的元素无效 。(注意:使用绝对定位+偏移量0+margin:auto方法中使用了四个方向的值为0偏移量例外)

附:
注意margin/pading
百分比值参照其包含块的宽度进行计算
因此使用margin:auto并不能实现垂直方向上的居中,垂直居中最好不要使用margin/pading来实现。(当然如果确切知道父容器的高度,使用精确的margin/pading数值来实现不再此讨论之列)
position:absolute居中
在父元素上设置定位,再在要居中的子元素上使用绝对定位进行居中。
最基础的方法:计算出要居中的元素宽高与父容器宽高的差值,然后将差值除以2得到精确的值,再用以设置精确的水平和垂直偏移量;
其次是设置水平和垂直偏移量鸽50%,然会设置水平和垂直的负margin值——取值分别为要居中的子元素宽高的半。
以上方法均需要使用容器宽高的确切值,灵活性较差,以下方法更为灵活:
偏移量50%+负margin值
设置50%的水平和垂直偏移,然后设置的margin-top和margin-left值是要居中元素自身宽/高的一半的负数 :
.wrap {
position: relative;
}
.center {
position: absolute;
height: 100px;width:100px;
top: 50%;left:50%;
margin-top:-50px;
margin-left:-50px;
}
偏移量50%+负50%translate值
使用位移transform:translate,将设置了50%偏移的子元素”往回”移动自身宽高的一半:
.wrap {
position: relative;
}
.center {
position: absolute;
top: 50%;left:50%;
transform: translate(-50%,-50%);
}
偏移量0+margin:auto
父元素设置相对或绝对定位;要居中的子元素设置绝对定位,所有偏移量为0,外边距为auto:
.wrap{
positon:relative;
}
.center{
positon:absolute;
top:0;bottom:0;left:0;right:0;
margin:auto;
}
flex弹性布局居中
父元素设置为弹性盒子(容器),子元素就成为了弹性元素,利用flex相关属性进行居中。
在父元素上设置相关属性即可使子元素居中:
.wrap{
display:flex; /使用flex盒子/
justify-content:center;/水平轴上居中/
align-items:center;/垂直轴上居中/
}
父元素设置为弹性容器display:flex,子元素设置magrin:auto :
.wrap{
display:flex;
}
.child{
margin: auto;
}

注意:
如果有多个弹性子元素,默认情况下弹性子元素会成一横排分布在父元素容器中,因为
1.flex默认将子元素水平排列到一行(flex-direction:row),使用flex-direction:column可以使子元素垂直排成一列。
2.flex默认子元素不折行显示(flex-wrap: nowrap ),使用flex-wrap: wrap可使子元素自动折行显示(当一行宽/高度不足容下多个子元素时折行为多行/列)。

align-items和align-content区别:
align-content属性只适用于多行子元素(超过一行)的flex容器,如果只有一行子元素,该属性不起作用;align-items适用于任意行子元素的flex容器。
align-content是设置一列子元素在整个纵轴上的对其方式;而align-items是设置每个子元素在该行的高度范围内的侧轴上的对齐方式(垂直对齐)。
align-items相当于将侧轴高度按行平分,设置的是子元素在该行高度上的对其方式。

object-fit和object-postion居中
object-fit 只能用于可替换元素(replaced element) ,用以
指定替换元素的内容应该如何适应到其使用的高度和宽度确定的框。
一般用做图片的样式。它有着类似background-image的用法:
.center{
object-fit:fill|cover|contain|none|scale-down;
/其属性值,分别是填充(默认)、包含、覆盖(可能被裁剪)、无变化(保持原状)和等比例缩放/
}
而object-positon属性默认值是50% 50%,也就是居中(也就是要求居中的情况不用写这个属性了……),对元素定位控制,类似background-postion。
grid网格布局居中
根据需要布局网格,将要居中的元素“摆放”在网格中间即可。
示例制作3x3的表格内元素居中:
.wrap{
display:grid;
grid-template-rows: repeat(3, 1fr);
grid-template-columns: repeat(3, 1fr);
}
.center{
grid-row: 2;
grid-column: 2;
}

表格内容居中
表格式布局:根据语义化原则,使用表格布局非表格的内容已不再合适,而且表格的 标签的align和valign属性已经是HTML的废除标签属性,建议不要使用。
非表格元素模拟表格:可以使用display:table-cell 模拟其为一个表格,由于不建议使用废除的align和valign标签属性,故而也就vertical-align:middle 垂直居中具有实用性,将元素模拟成表格进行垂直居中意义也不大了,因此建议不要使用。
真正的表格,表格内容的居中:
水平:text-align:center
垂直:vertical-align:middle
也可以使用margin/pading等其他方法来控制表格内容的居中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值