对css居中的一点思考

在学习前端的过程中,发现元素和文本的水平居中和垂直居中,是经常会出现的问题,在实际工作中也会经常碰到。居中的技巧有很多,原以为自己掌握了这些技巧就行了,但在编写代码的过程中,发现有时候技巧管用,有时候不管用,于是就将每个知道的方案都试一遍,找到合适的。这种情况究其原因是对居中的认识不够深入,只是停留在实现需求的水平上。为了更好的加深对居中的理解,搜集和阅读相关资料,并将所得总结在此。

居中是什么

居中故名思意就是将物体放置在其容器的中间,在css中居中就是指元素、文本、图片等相对其容器或父元素或浏览器窗口能够居中显示。而根据显示方式的不同,又分为水平居中,垂直居中,水平垂直居中。下面就分情况对居中进行讨论。

水平居中

水平居中我们常见的一种解决方案就是设置text-align:center,然而我们会发现这种方式有时候有效,有时候却没有效果。这是因为我们在使用相关方法的时候并没有对块级元素和行内元素进行区分,不同类型的元素其居中方法是不同的:

当元素为行内元素时(如文本,链接)

当需要居中的元素为行内元素时,你可以通过在其父元素(必须是块级元素)设置如下css样式:

.parent {
     text-align:center;
}

示例代码
这种方法对display设置为inline、inline-block、inline-table、inline-flex的元素都有效。

块级元素居中

对于一个块级元素你可以通过设置其margin属性,来达到水平居中的效果。你可以将其margin-left和margin-right设置为auto:

.center{
    margin:0 auto;
}

这样浏览器就会根据元素的宽度自动为元素左右两边设定等宽的margin,来达到水平居中的效果。这里需要注意的是元素需要设定width属性,否则元素的宽度会自动充满父元素,就不存在相对父元素水平居中一说了。
示例代码
这里需要注意的是这种方法对设置float属性的块级元素是没有效果的,浮动元素的居中这里有一个解决方案,但是该方法的布局比较混乱,子元素脱出父元素,并不推荐。
另外有一个tricks,能够实现如下图中

文字环绕图片居中的效果,具体参见这篇文章

当有多个块级元素时

当你需要对多个块级元素进行居中显示时,如果块级元素如下垂直排列:

vertical.png
vertical.png
,那么简单的设置margin:0 auto;就可以轻松实现。
但如果如下排列:
horizontal.png
horizontal.png

那么就可以使用display:inline-block将多个块元素单行显示,同时由于inline的缘故,可以在父元素设置text-align:center将多个块元素居中,当然也可以将元素设置为display:flex; justify-content: center;达到居中效果。详细代码示例

垂直居中

垂直居中相比于水平居中,就复杂一些,还是分块级与行内进行讨论。

inline或inline-block元素

单行垂直居中的情况

当父元素没有设定宽度,而是根据内容自适应时,简单的设置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

使用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%);
}

完整代码

使用flexbox

想要水平垂直居中,你需要设置两个居中属性

.parent {
  display: flex;
  justify-content: center;
  align-items: center;
}

完整代码

原文链接:
https://css-tricks.com/centering-css-complete-guide/

相关文章:
https://css-tricks.com/float-center/

http://www.zhangxinxu.com/wordpress/2009/11/css%E8%A1%8C%E9%AB%98line-height%E7%9A%84%E4%B8%80%E4%BA%9B%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E5%8F%8A%E5%BA%94%E7%94%A8/

居中代码生成工具:http://howtocenterincss.com/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,630评论 1 92
  • 收听音频,戳链接,旧号itclan已暂停使用,欢迎关注微信itclanCoder公众号可收听更多音频 前言 关于网...
    itclanCoder阅读 8,101评论 3 30
  • 一 外部式css样式 (也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css...
    KunMitnic阅读 888评论 0 1
  • 本文主要是起笔记的作用,内容来自慕课网. 认识CSS样式 CSS全称为“层叠样式表 (Cascading Styl...
    0o冻僵的企鹅o0阅读 2,550评论 0 30
  • 事业并不等于生活。他们是两个独立的概念。 事业,能否在这个世界生存下去,取决于它是否能够发挥自身的核心职能:找到并...
    爱一茶江泳阅读 766评论 0 1