gentlecoder

欲买桂花同载酒,终不似,少年游

  • 主页
  • 随笔
所有文章 友情链接 关于我

gentlecoder

欲买桂花同载酒,终不似,少年游

  • 主页
  • 随笔

在我水了11种水平垂直居中方法之后,我终于明白了

2019-03-31

老生常谈,水平垂直居中。为什么大家都爱水平垂直居中呢?

基本HTML

1
2
3
4
<div class="father">
<div class="child">
</div>
</div>

根据如上结构,通过css实现水平垂直居中。

绝对定位

利用父元素相对定位和子元素绝对定位进行水平垂直居中。根据是否知道子元素宽高,使用数值或者百分比的方式进行定位。

方法1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.father {
width: 100px;
height: 100px;
background-color: grey;
position: relative;
}
.child {
width: 50px;
height: 20px;
background-color: red;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}

通过设置四向为0和margin: auto实现。

方法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.father {
width: 100px;
height: 100px;
background-color: grey;
position: relative;
}
.child {
width: 50px;
height: 20px;
background-color: red;
position: absolute;
left: 50%;
top: 50%;
margin: -10px -25px;
}

通过设置left和top使child左上角位置移动到中间,然后再移动自身宽高一般使child中心至中间。

方法3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.father {
width: 100px;
height: 100px;
background-color: grey;
position: relative;
}
.child {
width: 50px;
height: 20px;
background-color: red;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}

方法4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.father {
width: 100px;
height: 100px;
background-color: grey;
position: relative;
}
.child {
width: 50px;
height: 20px;
background-color: red;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-25px, -10px);
}

总结

这几种方法使用了绝对定位,margin或者transform来使子元素水平垂直居中,根据是否知道具体宽高来使用margin或者transform。

##弹性盒子

方法5

1
2
3
4
5
6
7
8
9
10
11
12
.father {
width: 100px;
height: 100px;
background-color: grey;
display: flex;
}
.child {
width: 50px;
height: 20px;
background-color: red;
margin: auto;
}

方法6

1
2
3
4
5
6
7
8
9
10
11
12
13
.father {
width: 100px;
height: 100px;
background-color: grey;
display: flex;
justify-content: center;
align-items:center;
}
.child {
width: 50px;
height: 20px;
background-color: red;
}

总结

这两种使用了flex弹性盒子布局来实现,随着浏览器兼容性的普及,弹性盒子也越来流行了。

table-cell

方法7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.father {
width: 100px;
height: 100px;
background-color: grey;
display: table-cell;
text-align:center;
vertical-align: middle;
}
.child {
display:inline-block;
width:50px;
height:20px;
background-color: red;
}

使用了table-cell以及行内块元素来实现

行内元素

方法8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.father {
width: 100px;
height: 100px;
background-color: grey;
text-align:center;
}
.child {
display:inline-block;
width:50px;
height:20px;
background-color: red;
vertical-align: middle;
}
.father:after{
content:'';
width:0;
height: 100%;
display: inline-block;
vertical-align: middle;
}

利用伪元素撑开高度垂直居中。

方法9

1
2
3
4
5
6
7
8
9
10
11
12
13
.father {
width: 100px;
line-height: 100px;
background-color: grey;
text-align: center;
}
.child {
display: inline-block;
width: 50px;
height: 20px;
background-color: red;
vertical-align: middle;
}

利用父元素line-height与inline-block子元素vertical-align垂直居中

相对定位

方法10

是不是有点疑惑为啥1、2、3都要用absolute来定位,用relative不行吗?

答案是可以的。😂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.father {
width: 100px;
height: 100px;
background-color: grey;
}
.child {
width: 50px;
height: 20px;
background-color: red;
position: relative;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}

方法11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.father {
width: 100px;
height: 100px;
background-color: grey;
}
.child {
width: 50px;
height: 20px;
background-color: red;
position: relative;
left: 50%;
top: 50%;
transform: translate(-25px, -10px);
}

总结

其实要想水还很再水出方法12、方法13等等,但是主要问题并不在这里,我觉得大家都喜欢问垂直居中问题的主要目的,还是想考验大家对基础css的了解,定位、布局、元素等,比如说相对布局和绝对布局,比如说块级元素和行内元素,比如说margin和padding,比如说百分比的参照者,比如说伪元素的运用,比如说transform用法等等。

最主要考察的是对这些基础实际运用能力和理解能力,并不是说面试官真的想知道你了解多少种垂直居中的方法,他只是想了解一下面试者css的基础罢了。

随手一个方法12

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.father {
width: 100px;
height: 100px;
background-color: grey;
}
.child {
width: 50px;
height: 20px;
background-color: red;
margin: auto;
}
.father:before {
content: "";
width: 0;
height: calc(50% - 10px);
display: block;
vertical-align: middle;
}
赏

谢谢你请我吃糖果

支付宝
微信
  • css

扫一扫,分享到微信

微信分享二维码
关于防抖debounce和截流throttle
关于原型、原型链、和继承
© 2021 gentlecoder
Hexo Theme Yilia by Litten
  • 所有文章
  • 友情链接
  • 关于我

tag:

  • JavaScript
  • 前端
  • vue
  • bootstrap
  • css
  • git
  • html
  • 算法
  • leetcode
  • 正则
  • es6
  • SegmentFault
  • npm
  • nodejs
  • threejs
  • vscode
  • vue-cli
  • vuejs
  • CSS
  • WebAssembly
  • 函数式编程
  • 前端基础

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 浏览器的渲染机制

    2021-01-03

    #前端基础

  • Intersection Observer详解

    2021-01-02

    #JavaScript

  • 初探WebAssembly

    2020-05-25

    #JavaScript#WebAssembly

  • css-虚线边框滚动效果

    2019-05-05

    #css

  • css-字体文本相关

    2019-05-05

    #css

  • git subtree的使用

    2019-04-28

    #git

  • vscode一些配置

    2019-04-24

    #vscode

  • 关于伪元素

    2019-04-21

    #CSS

  • css中的百分比值到底是相对于谁

    2019-04-20

    #css

  • css渐变了解一下

    2019-04-20

  • 原生css中的变量

    2019-04-20

  • es6实现一个sleep函数

    2019-04-18

    #JavaScript

  • segmentfault答题汇总

    2019-04-15

    #SegmentFault

  • JS中this的软绑定

    2019-04-14

    #JavaScript

  • MouseEvent了解一下

    2019-04-13

    #JavaScript

  • 模拟vdom提取dom树中关键信息入json字符串

    2019-04-13

  • 切换页面主题样式研究及less教程

    2019-04-13

    #JavaScript#css#html

  • h5自带拖拽简单教程

    2019-04-13

    #JavaScript#html

  • 日常问题总结

    2019-04-13

    #JavaScript

  • 你不知道的js

    2019-04-13

    #JavaScript

  • setInterval实现打字机效果

    2019-04-10

    #JavaScript

  • 由一道题引申出的事件循环、let ar用法、iife、块级作用域

    2019-04-10

    #JavaScript

  • 你真的了解proxy和defineProperties吗

    2019-04-10

    #JavaScript

  • 关于BFC

    2019-04-10

    #css

  • 手写instance

    2019-04-07

    #JavaScript

  • 实现一个宽高自适应的正方形

    2019-04-07

    #css

  • 位运算符的使用

    2019-04-07

    #JavaScript#算法

  • string方法之padStart、padEnd

    2019-04-07

  • string方法之charAt,charCodeAt和charPointAt

    2019-04-07

  • vdom作用

    2019-04-07

    #JavaScript

  • background熟练掌握了,那么mask呢

    2019-04-07

  • clip-path剪裁出你想要的图形

    2019-04-07

    #css

  • 手写promise,promise.all,promise.race

    2019-04-07

    #JavaScript

  • 如何实现可以使用for...of遍历对象

    2019-04-07

    #JavaScript

  • 手写generator函数自动执行器

    2019-04-07

    #JavaScript

  • 深拷贝了解一下吗

    2019-04-07

    #JavaScript

  • 两种数组去重方法

    2019-04-07

    #JavaScript

  • 少年,函数式编程之reduce了解一下

    2019-04-04

    #JavaScript#函数式编程

  • 少年,函数式编程之管道函数了解一下

    2019-04-02

    #JavaScript#函数式编程

  • 少年,函数式编程之柯里化了解一下

    2019-04-02

    #JavaScript#函数式编程

  • 关于CSS优化需要知道的事

    2019-04-02

    #css

  • 三栏布局-圣杯、双飞翼以及其他

    2019-04-02

    #css

  • 你知道快排吗

    2019-04-01

    #算法

  • js正则相关

    2019-04-01

    #正则

  • 关于防抖debounce和截流throttle

    2019-04-01

    #JavaScript

  • 在我水了11种水平垂直居中方法之后,我终于明白了

    2019-03-31

    #css

  • 关于原型、原型链、和继承

    2019-03-31

    #JavaScript

  • 选择排序

    2019-03-31

    #算法

  • 冒泡排序

    2019-03-31

    #算法

  • leetcode算法 214

    2019-03-30

    #算法#leetcode

  • leetcode算法 5

    2019-03-30

    #算法#leetcode

  • leetcode算法 140

    2019-03-30

    #算法#leetcode

  • leetcode算法 88

    2019-03-29

    #算法#leetcode

  • git删除远程仓库的提交

    2019-03-28

    #git

  • 使用css画一条0.5px的线

    2018-09-28

    #前端#css

  • vue-cli生成的build及config文件夹中文件解读(4)build.js

    2018-04-02

    #前端#vue#vue-cli

  • vue-cli生成的build及config文件夹中文件解读(3)webpack.dev.conf.js

    2018-04-02

    #前端#vue#vue-cli

  • vue-cli生成的build及config文件夹中文件解读(2)webpack.prod.conf.js

    2018-04-02

    #前端#vue#vue-cli

  • vue-cli生成的build及config文件夹中文件解读(1)webpack.base.conf.js

    2018-03-30

    #前端#vue#vue-cli

  • 'nodejs以及npm使用指南'

    2018-03-30

    #前端#npm#nodejs

  • js三种模块化方式对比以及编译打包机制介绍

    2018-03-21

    #JavaScript#前端#es6

  • js object篇-Object.defineProperty()

    2018-03-20

    #JavaScript#前端

  • 'bootstrap-vue使用'

    2018-03-07

    #前端#vue#bootstrap

  • 页面展示html标签和JavaScript代码

    2018-03-06

    #前端#html

  • 'vue简单教程'

    2018-03-02

    #前端#vuejs

  • 'threejs简单教程'

    2018-02-28

    #前端#threejs

gentlecoder,
寻找世界的真相

热爱读书和游戏,
目前是一枚前端

想做一个温柔的人,想做一桌好吃的饭
欲买桂花同载酒,终不似,少年游。