CSS学习笔记-元素水平垂直居中(多图,流量党慎点)

前言

布局中经常会遇到元素水平居中的需求,今天根据以前的学习笔记📒以及看过的一些技术博客做个元素水平居中的小结。

正文

图片的水平垂直居中

<div class="container">
    <img src="">//图片地址为http://static.jsbin.com/images/dave.min.svg
</div> 
.container{
    height:300px;
    width:300px;
    background:yellow;
    text-align:center;
    vertical-align:middle;
    display:table-cell; 
}
img{
    background-color: #333;
    height:230px;
    width:230px;
}


这种方法是通过设置display为table-cell,然后设置text-align、vertical-align为center来实现图片位于父容器中的水平垂直居中,但是缺点是父div无法通过设置margin:0 auto来水平居中。

下面来一个使图片能在父元素中水平垂直居中,父元素也能水平居中的方法。
使用padding或margin填充

.container{
    margin: 80px auto;
    width: 300px;
    height: 300px;
    background-color: yellow;
}
img{
    width: 100px;
    height: 100px;
    padding: 100px; //margin:100px;也可以。
}

该方法是设置好img的长宽,然后和父容器之间长宽的差距用padding来弥补。效果见下图。

此方法是参考了大搜车前端博客中的一篇CSS布局的博文,作者是覃业博,原文是针对父div嵌套子div来到达水平垂直居中的目的,我这里div包裹的子元素img,和子元素是div的样式设置有些许不一样。

文字的水平垂直居中

<div class="container">
      文字水平居中
</div>
.container{
    line-height:300px;
    width:300px;
    line-height:300px;
    background:yellow;
    text-align:center;
    margin:0 auto;
}


文字的水平垂直居中在于line-height+line-height同高,然后text-align:center

利用float和元素设置偏移来水平垂直居中

先上代码:

<div class="super-element">  
  <div class="layout-helper">
    <div class="sub-element">呵呵呵呵呵呵呵呵呵呵呵呵<br>呵呵呵呵呵呵呵呵呵呵呵呵呵呵<br>呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵呵</div>
  </div>
</div> 
.super-element{
    width: 100%;
    height: 400px;
    background-color: #ccc;
}

.layout-helper{
    float: left;
/*  display:inline-block; */    
    position: relative;
    background:pink;
    left: 50%;
    top: 50%;
}

.sub-element{
    position: relative;
    left: -50%;
    -webkit-transform:translateY(-50%);
    transform:translateY(-50%);
    background-color: #333;
    color: #fff;
}

效果图:


该方法参考大搜车前端博客中的一篇CSS布局的博文,中心思路就是将需要居中的元素sub-element的父元素layout-helper设置top、left偏移50%,然后设置float使layout-helper缩紧宽度, 再设置sub-element的left为-50%,此时sub-element在水平方向就居中了,而在垂直方向上因为sub-element的父元素layout-helper高度是不确定的,所以给sub-element设置top:-50%因计算不出而无效,此时用到了transform:translateY(-50%);将sub-element偏移-50%,就达到了居中的效果。以上使layout-helper缩紧宽度设置display:inline-block同样可以达到效果。但是如果sub-element内容一多,就会超出父元素,设置super-element为overflow:auto;就会出现以下效果。

针对这个bug,原文作者覃业博也有一个解决方案,利用元素超出父元素的左边不会产生滚动条的特性,但是我没怎么悟透把他那个方案应用到上面这个实例当中,感兴趣的人请戳大搜车前端博客中的一篇CSS布局的博文,个人觉得把super-element设置overflow:hidden也可以,sub-element再长也就两边顶格。

还有一种通过设置添加占位div和设置占位div的margin-bottom:-50%来使元素居中的方案,先上图:

<div class="super-element">  
  <div class="layout-helper"></div>
  <div class="sub-element"></div>
</div>  
.super-element{
    width: 400px;
    height: 400px;
    margin:0 auto;
    background-color:pink;
}
.layout-helper{
    width: 100%;
    height: 50%;
    margin-bottom:-50px;
}
.sub-element{
    position: relative;
    left: 50%;
    transform:translateX(-50%);
    width: 100px;
    height:100px;
    background-color:yellow;
}

效果图:


其思想就是在super-element中设置一个占super-element宽100%和高50%的div块,我这里命名layout-helper,然后设置它的margin-bottom为sub-element高度的一半,后面接着的sub-element就垂直居中了,然后再设置sub-element的position:relative;left:50%;transform:translateX(-50%);水平也居中了。这里有个注意点,super-element的高度需要确定,这样才能使layout-helper的heigh:50%有效,还有layout-helper的margin-bottom设置的负高度为sub-element高度的一半。这种水平垂直居中方式兼容性较好。

此外还有一种使用定位和margin-top+margin-left为负子元素长宽来垂直水平居中的方法。上图:

 <div class="super-ele">
   <div class="sub-ele">
 </div>
.super-ele{
    position:relative;
    width:300px;
    height:300px;
    margin:100px auto;
    background:pink;
}

.sub-ele{
    position:absolute;
    width:100px;
    height:100px;
    background:yellow;
    top:50%;
    left:50%;
    margin-top:-50px;
    margin-left:-50px;
}

这种方法也是要设置子元素长和宽并且在设置margin-top、margin-left的时候去匹配子元素长宽的一半。

结尾

元素水平居中的技巧还有很多,还有使用Flex的方法,今天先到这里,等我悟透了再慢慢填补文章,以上实例如有错误存在,欢迎各位及时指出。

参考:大搜车前端博客中的一篇CSS布局的博文

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

推荐阅读更多精彩内容