在学习前端的过程当中,发现元素和文本的水平居中和垂直居中,是常常会出现的问题,在实际工做中也会常常碰到。居中的技巧有不少,但在编写代码的过程当中,发现有时候技巧管用,有时候无论用,因而就将每一个知道的方案都试一遍,找到合适的。这种状况究其缘由是对居中的认识不够深刻,只是停留在实现需求的水平上。为了更好的加深对居中的理解,搜集和阅读相关资料,发现不错的文章将其整理出来。原文参考:https://css-tricks.com/center...css
居中故名思意就是将物体放置在其容器的中间,在css中居中就是指元素、文本、图片等相对其容器或父元素或浏览器窗口可以居中显示。而根据显示方式的不一样,又分为水平居中,垂直居中,水平垂直居中。下面就分状况对居中进行讨论。html
水平居中咱们常见的一种解决方案就是设置text-align:center
,然而咱们会发现这种方式有时候有效,有时候却没有效果。这是由于咱们在使用相关方法的时候并无对块级元素和行内元素进行区分,不一样类型的元素其居中方法是不一样的:前端
当须要居中的元素为行内元素时,你能够经过在其父元素(必须是块级元素)设置以下css样式:浏览器
.parent { text-align:center; }
示例代码
这种方法对display设置为inline、inline-block、inline-table、inline-flex的元素都有效。ide
对于一个块级元素你能够经过设置其margin属性,来达到水平居中的效果。你能够将其margin-left和margin-right设置为auto:wordpress
.center{ margin:0 auto; }
这样浏览器就会根据元素的宽度自动为元素左右两边设定等宽的margin,来达到水平居中的效果。这里须要注意的是元素须要设定width属性,不然元素的宽度会自动充满父元素,就不存在相对父元素水平居中一说了。
示例代码
这里须要注意的是这种方法对设置float属性的块级元素是没有效果的,浮动元素的居中这里有一个解决方案,可是该方法的布局比较混乱,子元素脱出父元素,并不推荐。
另外有一个tricks,可以实现以下图中工具
文字环绕图片居中的效果,具体参见这篇文章。布局
当你须要对多个块级元素进行居中显示时,若是块级元素以下垂直排列:学习
,那么简单的设置margin:0 auto;
就能够轻松实现。
但若是以下排列:flex
那么就可使用display:inline-block
将多个块元素单行显示,同时因为inline的缘故,能够在父元素设置text-align:center
将多个块元素居中,固然也能够将元素设置为display:flex; justify-content: center;
达到居中效果。详细代码示例
垂直居中相比于水平居中,就复杂一些,仍是分块级与行内进行讨论。
当父元素没有设定宽度,而是根据内容自适应时,简单的设置padding就能够达到垂直居中的效果,如:
css: .p{ border: 1px solid yellow;padding: 80px;} .p a{ background-color: black; color: white; border: 2px solid red; padding: 30px; /*相同的上下内距实现垂直居中*/ } html: <div class="p"> <a href="#">asldkjflkadfk</a> </div>
在某些状况下设置padding并不能知足需求,而你又须要将一段单行显示的文本居中,这时你能够将line-height和height属性设置为等高来达到目的:
html: <main><div>I'm a centered line.</div></main> css: main { background: white; margin: 20px 0; padding: 40px; } main div { background: black; color: white; height: 100px; /*行高与line-height相同*/ line-height: 100px; padding: 20px; width: 50%; white-space: nowrap; }
示例代码
关于line-height,有许多须要了解和注意的地方,想详细了解为何这么这种方法能够实现垂直居中,能够参见这篇文章
设置padding一样可使多行文本居中,但有时当文本出如今表格单元格里或其余状况也会使该方法无效。这时会用到vertical-align属性,
示例代码
更多关于vertical—align的信息,能够点击这里和这篇
须要指出的是只有一个元素属于inline或是inline-block(table-cell也能够理解为inline-block水平)水平,其身上的vertical-align属性才会起做用
若是table—like不行,也许你能够试一下flex-parent, 一个flex-child能够很轻易的在flex-parent里垂直居中:
.flex-center-vertically { display: flex; justify-content: center; flex-direction: column; height: 400px; }
示例代码
须要注意的是父容器必须有一个固定的高度。
若是上述2中方法都不可行,你就须要借助伪元素,也就是在父容器里添加一个高度占满整个父元素的伪元素,文本就居中显示在里面。
.ghost-center { position: relative; } .ghost-center::before { content: " "; display: inline-block; height: 100%; width: 1%; vertical-align: middle; } .ghost-center p { display: inline-block; vertical-align: middle; }
若是你知道元素的高度,那么你能够这样实现垂直居中:
.parent { position: relative; } .child { position: absolute; top: 50%; height: 100px; margin-top: -50px; /* account for padding and border if not using box-sizing: border-box; */ /*这里可使用transform:translate(-50%)实现一样的效果*/ }
上述代码是经过定位的方式,来实现垂直居中,子元素参照父元素进行绝对定位,相对于父元素的上边缘向下移动50%(父元素高度的50%),而后经过margin-top元素将子元素向上拉自身的50%,达到最终的居中。
完整示例代码
当元素高度未知时能够以下,本质原理与上述类似:
.parent { position: relative; } .child { position: absolute; top: 50%; transform: translateY(-50%); }
使用flexbox无疑是种简单有效的解决方案:
.parent { display: flex; flex-direction: column; justify-content: center; }
你能够将上述方法进行合理的组合,来达到水平垂直居中,总结一下,可分为以下三种状况:
在经过将元素定位50%/50%后,再设置一个高度和宽度一半大小的负值给 margin,可以很好的居中,而且支持大多数浏览器:
.parent { position: relative; } .child { width: 300px; height: 100px; padding: 20px; position: absolute; top: 50%; left: 50%; margin: -70px 0 0 -170px; }
当你不知道宽高时,你可使用transform属性,设置translate(-50%)
,这里的50%是相对与元素自己的宽高。
.parent { position: relative; } .child { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
想要水平垂直居中,你须要设置两个居中属性
.parent { display: flex; justify-content: center; align-items: center; }
相关文章:
https://css-tricks.com/float-...
http://www.zhangxinxu.com/wor...
居中代码生成工具:http://howtocenterincss.com/