Web/03-CSS进阶/如何居中.md
2019-10-05 11:59:34 +08:00

197 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 如何居中(必考)
### 水平居中
1、**行内元素:**(文字、图片等水平居中)
给父亲设置:
```
text-align: center;
```
另外,**让文字的行高 等于 盒子的高度**,可以让单行文本垂直居中。
2、**块级元素:**(让标准流中的盒子水平居中)
给元素设置:(让当前元素在父亲里剧中)
```
//方式一
margin: auto;
方式二
margin: 0 auto;
```
上面的代码, `margin: auto`相当于`margin: auto auto auto auto`。`margin: 0 auto`相当于`margin: 0 auto 0 auto`,四个值分别对应上右下左。
- 垂直方向根据规范margin-top: auto 和 margin-bottom: auto其计算值为0。
- 水平方向:水平方向的 auto其计算值取决于可用空间**剩余空间**)。
参考链接:<https://www.zhihu.com/question/21644198/answer/22392394>
### 垂直居中/水平居中(元素的高度已知)
方法:绝对定位 + margin-top
如果盒子是绝对定位的,此时已经脱标了,`margin:auto`无效。如果还想让其居中(位于父亲的正中间),可以这样做:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
height: 300px; /*高度已知*/
position: relative;
border: 1px solid red;
}
.child {
width: 200px;
height: 100px;
position: absolute;
top: 50%;
left: 50%;
margin-left: -150px;
margin-top: -50px;
border: 1px solid green;
}
</style>
</head>
<body>
<div class="parent">
<div class="child">
一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字一串文字
</div>
</div>
</body>
</html>
```
如上方代码所示我们先让这个高度为100px的盒子上边线居中然后向上移动宽度的一半(50px),就达到了垂直居中的效果。水平居中的原理类似。
效果:
![](http://img.smyhvae.com/20180322_1843.png)
### 垂直居中/水平居中(元素的高度未知)
**方法1**模拟表格法
将父元素设置为display:table然后将子元素也就是要垂直居中显示的元素设置为display:table-cell然后加上vertical-align:middle来实现。
html代码
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.parent {
display: table;
width: 300px;
height: 300px;
border: 10px solid pink;
}
.child {
display: table-cell;
vertical-align: middle; /*指定行内元素inline或表格单元格table-cell元素的垂直对齐方式。*/
height: 200px; /*此处的宽高设置无效*/
width: 200px;
border: 10px solid blue;
}
/*实现的效果:让单元格(.child)里的内容(.content)垂直居中*/
.content {
width: 100px;
height: 100px;
border: 10px solid green;
}
</style>
</head>
<body>
<div class="parent">
<div class="child">
<div class="content">
<p>测试垂直居中效果测试垂直居中效果测试垂直居中效果测试垂直居中效果</p>
</div>
</div>
</div>
</body>
</html>
```
效果:
![](http://img.smyhvae.com/20180322_1833.png)
**方式二:**绝对定位 + `margin:auto`
```css
.element {
position: absolute;
left: 0; top: 0; right: 0; bottom: 0;
margin: auto; /* 有了这个就自动居中了 */
}
```
代码两个关键点:
- 上下左右均0位置定位
- margin: auto
**方式三:**用绝对定位 + translate 位移来做
```css
div {
background-color: red;
position: absolute; 绝对定位的盒子
top: 50%; 首先,让上边线居中
transform: translateY(-50%); 然后利用translate往上走自己宽度的一半【推荐写法】
}
```
**方式四:**flex 布局
```css
.parent{
display: flex;/*Flex布局*/
display: -webkit-flex; /* Safari */
align-items: center;/*设置子元素在侧轴方向上的布局*/
}
```
参考链接:
- [七种方式实现垂直居中](https://jscode.me/t/topic/1936)
- [margin:auto实现绝对定位元素的水平垂直居中](http://www.zhangxinxu.com/wordpress/2013/11/margin-auto-absolute-%E7%BB%9D%E5%AF%B9%E5%AE%9A%E4%BD%8D-%E6%B0%B4%E5%B9%B3%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD/)