[TOC]
备份及更新css
.center
表示要被居中的元素,.wrap
表示要居中的元素的父元素(包含.center
元素的元素)。html
为了便于理解和叙述同一:webpack
.wrap
就是指包含文字的元素(例如<i>文字</i>
,i标签就是.wrap
)。文本内容会在外部建立一个行框(line-box),能够将文本看做是一个(外框隐形)的行内元素 ,line-box内部能够包含普通文本框、inline-block元素、inline元素。git
例如父容器不设置背景或边框,没法看出子元素是否居中,示例代码只是写出了该居中方法所须要的那部分样式 。github
inline元素,准确来讲,是不可替换(non-replace)的inline元素,不能设置竖直方向上的margin和padding,下不赘述。(margin同理)web
参看margin规定和padding规定 ,之因此不能设置margin/padding,是由于布局
padding的值是根据目标元素的width计算出来的,而inline中的non-replace元素的width是不肯定的。
如何让一个容器的行内内容(文本和行内元素--inline/inlineblock)居中。(固然inline-block比较特殊,即有行内属性,又有块级属性)post
在块级元素上设置text-align:center
,其内部的inline或inline-block的子元素以及文本内容会在父元素内居中。字体
line-height设置了行间的距离(行高),将要居中的元素的line-heigth值设置为和其块级父元素的height值同样时,其内部内容会垂直居中。flex
用于单行的行内元素的垂直居中
.wrap{ height:100px; line-height: 100px; }
注意:
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; }
注意:
直接对一个inline-block元素(block、list-item元素更没必要说)元素设置vertical-align:middle
每每不能让其内部的达到预期的垂直居中效果,由于:
vertical-align大部分取值是 相对于父元素来讲的
例如vertical-align:baseline
(vertical-align的默认值)是相对于父元素的基线对齐,vertical-align: middle
是相对与父元素的中线对齐(中线位置受到基线的影响)。
而父元素的基线取值有如下规则:
inline-block类
正常流内容的状况下,
inline-block
元素的baseline就是最后一个做为内容存在的元素的baseline
在overflow属性不为visible的状况下,baseline就是margin-box的下边界
在没有内容可是内容区还有高度的状况下,baseline仍是margin-box的下边界。
可替换元素(如img)
无论display设置为inline仍是inline-block,其baseline都为margin-box
在单元格上设置vertical-align:middle
,其内部内容将垂直居中。
::first-letter
和 ::first-line
伪元素 (同第一条行内元素)block、list-item、inline-block等元素如何在其父元素中居中。
最基础的方法是设置精确的padding(父元素上)或margin(子元素上)值使得子元素居中,这里再也不示例。
margin值为 父容器宽/高的50% 减去 自身宽/高的50%:
.center{ width: 20rem;height: 20rem; margin-left:calc(50% - 10rem); margin-top:calc(50% - 10rem); }
注意:inline水平的元素margin/padding设置仅在左右方向上有效。
要居中的块级元素(block)元素设置margin:0 auto
。
注意:对浮动元素、绝对定位和固定定位的元素无效 。(注意:使用绝对定位+偏移量0+margin:auto方法中使用了四个方向的值为0偏移量例外)
附:
注意margin/pading
百分比值参照其 包含块的宽度进行计算
所以使用margin:auto
并不能实现垂直方向上的居中,垂直居中最好不要使用margin/pading
来实现。(固然若是确切知道父容器的高度,使用精确的margin/pading数值来实现再也不此讨论之列)
在父元素上设置定位,再在要居中的子元素上使用绝对定位进行居中。
最基础的方法:计算出要居中的元素宽高与父容器宽高的差值,而后将差值除以2获得精确的值,再用以设置精确的水平和垂直偏移量;
其次是设置水平和垂直偏移量鸽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; }
使用位移transform:translate,将设置了50%偏移的子元素”往回”移动自身宽高的一半:
.wrap { position: relative; } .center { position: absolute; top: 50%;left:50%; transform: translate(-50%,-50%); }
父元素设置相对或绝对定位;要居中的子元素设置绝对定位,全部偏移量为0,外边距为auto:
.wrap{ positon:relative; } .center{ positon:absolute; top:0;bottom:0;left:0;right:0; margin:auto; }
父元素设置为弹性盒子(容器),子元素就成为了弹性元素,利用flex相关属性进行居中。
.wrap{ display:flex; /*使用flex盒子*/ justify-content:center;/*水平轴上居中*/ align-items:center;/*垂直轴上居中*/ }
display:flex
,子元素设置magrin:auto
:.wrap{ display:flex; } .child{ margin: auto; }
注意:
若是有多个弹性子元素,默认状况下弹性子元素会成一横排分布在父元素容器中,由于
flex-direction:row
),使用flex-direction:column
可使子元素垂直排成一列。flex-wrap: nowrap
),使用flex-wrap: wrap
可以使子元素自动折行显示(当一行宽/高度不足容下多个子元素时折行为多行/列)。align-items
和align-content
区别:
align-content
属性只适用于多行子元素(超过一行)的flex容器,若是只有一行子元素,该属性不起做用;align-items
适用于任意行子元素的flex
容器。align-content
是设置一列子元素在整个纵轴上的对其方式;而align-items
是设置每一个子元素在该行的高度范围内的侧轴上的对齐方式(垂直对齐)。align-items
至关于将侧轴高度按行平分,设置的是子元素在该行高度上的对其方式。
object-fit 只能用于可替换元素(replaced element) ,用以
指定替换元素的内容应该如何适应到其使用的高度和宽度肯定的框。
通常用作图片的样式。它有着相似background-image的用法:
.center{ object-fit:fill|cover|contain|none|scale-down; /*其属性值,分别是填充(默认)、包含、覆盖(可能被裁剪)、无变化(保持原状)和等比例缩放*/ }
而object-positon属性默认值是50% 50%
,也就是居中(也就是要求居中的状况不用写这个属性了……),对元素定位控制,相似background-postion。
根据须要布局网格,将要居中的元素“摆放”在网格中间便可。
示例制做3x3的表格内元素居中:
.wrap{ display:grid; grid-template-rows: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr); } .center{ grid-row: 2; grid-column: 2; }
<td>
<th>
标签的align和valign属性已是HTML的废除标签属性,建议不要使用。display:table-cell
模拟其为一个表格,因为不建议使用废除的align和valign标签属性,故而也就vertical-align:middle
垂直居中具备实用性,将元素模拟成表格进行垂直居中意义也不大了,所以建议不要使用。真正的表格,表格内容的居中:
text-align:center
vertical-align:middle