最近参加了百度的前端技术学院,任务4是要求一个元素在父元素中水平和垂直居中,提供的一篇文章对各种情况都进行了分析,很不错,英文也不是那么难懂,毕竟代码还是主体,翻译过来分享出来,翻译内容带有自己的理解  有不对的地方 欢迎拍砖和交流

译文  centering in css :a complete guide   地址 https://css-tricks.com/centering-css-complete-guide/

正文

文章大体分为三部分    水平居中  垂直居中   水平和垂直居中    下面就按照这个思路进行翻译

1)水平居中 

1.1 inline 或者 inline-* 级别的元素如何水平居中

在inline或者 inline-* 需要居中的元素的父元素中应用 text-align:center

text-align 属性规定元素中的文本的水平对齐方式 主要使用的属性值 left right center

        div {
width:100px;
background:red;
text-align: center;
}     <div>sssss</div>

效果

1.2 块级元素的居中

当你有一个一定宽度的块级元素的时候,可以设置它的margin-left margin-right 为auto来实现居中(如果没有宽度的话 它会长铺满父元素的宽度 )

        div {
width:100px;
background:red;
margin:0 auto;
text-align: center;
} <div>sss</div>

效果

这种方式无论你想要居中的元素的宽度是多少都会有效(注意你不能通过float使一个元素居中)

1.3 如何使好几个block元素居中

如果你有两个或者更多的块级元素需要在一行内居中,你就需要修改它们的display属性了 有两种方案  display :inline-block  或者flexbox布局

1.3.1 display:inline-block (关于inline-block的间隙问题 请看大漠写的这篇文章  http://www.jb51.net/css/76707.html )

        #container div {
width:100px;
height:100px;
background: red;
display:inline-block;
margin-right: 10px; }
#container {
text-align: center;
} <div id="container">
  <div></div><div></div><div></div>
  </div>

效果

1.3.2 display:flexbox      使用CSS3的弹性盒子 来进行布局来实现居中

        #container div {
width:100px;
height:100px;
background: red;
display:inline-block;
margin-right: 10px; }
#container {
display:flex;
display:-moz-flex;
display:-webkit-flex;
flex-direction:row; //主轴的方向 默认是水平 row
justify-content:center;//定义了项目在主轴上的对齐方式 flex-start flex-end center space-between space-around (看完这篇文章你会喜欢上flexbox的) } <div id="container">
<div></div><div></div><div></div>
</div>

效果

当然如果你想要多行的块级元素(也就是一个块级元素排布在另一个上面的时候  margin:0 auto 仍然是可行的   )

2)垂直居中

在css中垂直居中是比水平居中更复杂的

2.1 inline或者inline-*级别的元素垂直居中

  2.1.1 单行   有的时候单行的行内元素垂直居中只是因为有一个相等的padding-top 和padding-down (例子大家自己试一下  我认为这种方式不是特别可行  只有当我们对父元素的高度 子元素的高度很清楚的时候 可以使用这种方案 修改起来也存在一定问题)   还好文中给出了下面的方案 也就是提供相等的padding-top 和padding-down不是我们选择的方案的时候 我们可以使一个不换行文本居中通过下面的设置  通过设置父元素的文本的line-height=父元素的高度

        #container {
width:100px;
height:100px;
background: red;
line-height: 100px;
       white-space:nowrap; //文本不换行
} <div id="container">
center
</div>

  2.1.2 多行   多行文本的垂直居中通过设置相同的padding-top padding-down 也是可行的  当这种方式不可行的时候,我们可以将多行文本放置到td 或者有有td表现的元素中(table cell)通过设置vertical-align:middle 来达到目的  例子  table-cell

        #container {
width:100px;
height:100px;
background: red;
display:table;
} #container p {
display: table-cell;
vertical-align: middle;
} <div id="container">
<p>center</p>
</div>

效果

如果使用table-cell你觉得不好 那你仍然可以使用flexbox   这个例子同文中之前的flexbox水平居中  只是垂直居中需要使用属性/*justify-content* 写错了/2016.3.18  align-items 规定元素在交叉轴的排列方向

在上面的方案中 只有父元素有高度(px %等等)的时候,垂直居中才会生效

当以上的方案都不可行的时候,你可以在父容器中插入一个带有100%height的元素 然后让需要垂直居中的元素跟这个元素去对齐(感觉这个有点黑科技 )

        #container {
width:240px;
height:100px;
background: red;
position: relative; }
#container::before {
content: " ";
display: inline-block;
height: 100%;
width: 1%;
vertical-align: middle;
}
#container p {
display: inline-block;
vertical-align: middle;
width:190px; //在它的例子中子元素设置了宽度 如果没有宽度的限制 子元素超出父元素的宽度 就会被挤下来
} <div id="container">
<p>centersadsd asdasda sasdas sadasdasd</p>
</div>

效果如下

2.2 块级元素垂直居中

  2.2.1 知道块级元素的高度  很多情况下我们是无法预知元素的高度的  比如宽度的变化的时候,随着文本的重新排布,高度会发生变化 关于文本的一些设置也会影响到元素的高度等等原因,但是当你的确了解一个元素的高度的时候,可以使用下面的方式去垂直居中

        #container {
width:300px;
height:100px;
background: red;
position: relative;
}
#container p {
position: absolute;
top:50%;
height:40px;
margin-top:-20px;
background: green;
} <div id="container">
<p>centersadsd asdasda sasdas sadasdasd</p>
</div>

这种方案的实现思路是通过子元素的绝对定位到父元素高度50%的位置 在通过margin-top 为-50%自己本身的告诉 来达到处置居中的方式

效果

  2.2.2 不知道元素的高度  通过transform 移动在Y轴的距离为本身的50% 原理上跟知道高度的类似

        #container {
width:300px;
height:100px;
background: red;
position: relative;
}
#container p {
position: absolute;
top:50%;
transform:translateY(-50%);
-webkit-transform:translateY(-50%);
background: green;
} <div id="container">
<p>centersadsd asdasda sasdas sadasdasd</p>
</div>

效果

  2.2.3  你仍然可以使用flexbox来实现上面的垂直居中

3)水平和垂直居中

简单的说你可以组合上面的水平和垂直的居中方案来实现你想要的居中 但是可以分为如下的3中类型

  3.1.1 有固定的高度和宽度的元素水平和垂直居中   同上面的固定高度的垂直居中  水平可以定位到50%父元素宽度 margin-left 50%自己的宽度来水平居中

  3.1.2 没有固定高度和宽度的元素的水平居中    同上面的没有高度的垂直居中 水平定位到50%父元素的宽度  transform:translateX(-50%) 来达到水平居中

  3.1.3 别忘了 你还有flexbox

4)结论

你使用CSS是可以达到居中的

感想:关于居中这个问题,自己一直没有好好的考虑过或者说深入的研究过,只是碰 比如在之前的项目中将vertical-align属性使用在块级元素上等  这次算是小小的学习一下 flexbox提供了功能强大的居中方案  可以尝试

css居中完全指南(翻译)的更多相关文章

  1. CSS居中完全指南——构建CSS居中决策树

    CSS居中完全指南--构建CSS居中决策树 本文总结CSS居中,包括水平居中和垂直居中.本文相当于CSS决策树,下次再遇到CSS居中问题时有章可循. 参考Centering in CSS: A Com ...

  2. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  3. CSS居中demo

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  4. css居中那点事儿

    css居中那点事儿 在css中对元素进行水平居中是非常简单的,然而使元素垂直居中就不是一件简单的事情了,多年以来,垂直居中已经成为了CSS领域的圣杯,因为它是极其常见的需求,但是在实践中却不是一件简单 ...

  5. css居中学习笔记

    css居中学习笔记 一.水平居中 以下面的代码为例: <body> <div class="parent"> <div class="chi ...

  6. CSS居中完全解决方案

    上次面试面试官问到了,问了个定宽局中和不定宽局中,下来我把所有有关CSS居中都总结了一下 原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 水平居中 行内元素 把行内元素 ...

  7. 理解CSS居中

    我想很多在前端学习或者开发过程中,肯定会遇到如何让你的元素居中的问题,网上google肯定会有很多的解决方法.今天我就个人的项目与学习经验谈谈个人理解css如何让元素居中. 要理解css的居中,首先必 ...

  8. CSS 居中大全【转】

    我看最近微博流行 CSS 居中技术,老外码农争相写相关的文章,一篇赛一篇的长啊,我把几篇归纳总结了一下,算是笔记. 孔乙己曾说:“茴香豆的回字有四种写法”,万一哪天有个面试官问你:“居中一共有几种写法 ...

  9. CSS居中的实现用法实例

    转载的一篇文章,讲解css内容居中的. 网上有关css 居中的文章不胜枚举,不过大多没有做系统的总结.这里分享的这篇有关css居中的文章,个人感觉不错,值得收藏. 一.水平居中1,将元素水平居中(us ...

随机推荐

  1. 深入理解CSS定位中的堆叠z-index

    × 目录 [1]定义 [2]堆叠规则 [3]堆叠上下文[4]兼容 前面的话 对于所有定位,最后都不免遇到两个元素试图放在同一位置上的情况.显然,其中一个必须盖住另一个.但,如何控制哪个元素放在上层,这 ...

  2. 可视化工具solo show-----Processing Prefuse show

    继上篇<可视化工具solo show>罗列出一些主要基于Java开发的软件.插件之后,又仔细揣摩了下哪些可以为我所用. 一番端详之后,准备挑出其中Processing和Prefuse两位大 ...

  3. CSS 魔法系列:纯 CSS 绘制各种图形《系列五》

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  4. 没有R.java问题找不到getActionBar()方法

    android项目,可是项目中没有重要的R.java,并且报错,说是找不到getActionBar()方法,上网寻找原因,终于寻得解决方法:    1.解决项目中没有R.java问题.在Eclipse ...

  5. Cordova webapp实战开发:(7)如何通过简单的方法做到,不重新发布APP来修复bug、增加功能、或者躲开苹果的一些严格审核?

    到<Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?>为止,我们已经大体学会了如何使用Cordova了,那些都是使用Cordova的开发者必备的技能. ...

  6. JS包装对象

    一.包装对象 var s = "hello word"; s.len = 4; var t = s.len; //=>undefined 原因由于s是一个字符串,在执行第二行 ...

  7. 【分享】学长的安利来了~~O(∩_∩)O

    前言:应栋哥要求,学长把演讲稿稍微整理下发布出来,这可以算是一篇安利文,也可以说是一篇经历文吧.作为一个确确实实从软工里收获到挺多东西的过来人,学长希望可以通过学长的经历来让你们对软工更加期待. 安利 ...

  8. 【UWP】批量修改图标尺寸

    UWP开发中项目用到的图标资源非常多,通常每一种图标都有几种不同的尺寸,一般来说,我的项目所有Package.appxmanifest用到的图标就有40个,通常这些图标都是一样的,只是尺寸大小不一而已 ...

  9. 用c#开发微信 (4) 基于Senparc.Weixin框架的接收事件推送处理 (源码下载)

    本文讲述使用Senparc.Weixin框架来快速处理各种接收事件推送.这里的消息指的是传统的微信公众平台消息交互,微信用户向公众号发送消息后,公众号回复消息给微信用户.包括以下类型: 1 subsc ...

  10. 炉石传说 C# 开发笔记

    最近在大连的同事强力推荐我玩 炉石传说,一个卡牌游戏.加上五一放一个很长很长的假期,为了磨练自己,决定尝试开发一个C#的炉石传说. 这件事情有人已经干过了,开发了一个网页版的炉石,但是貌似不能玩... ...