谈谈CSS实现水平垂直居中布局的方法


本文摘自PHP中文网,作者青灯夜游,侵删。

最近面试的时候,面试官问到了CSS水平垂直居中布局的方式,对于刚入前端没多久的我,无疑是一脸懵逼,闲了赶紧查阅资料分析一波,给各位分享一下,避免落坑。

首先先说明一下html和一些基础css样式,下面就不再赘述!
html

1

2

3

4

5

<body>

        <div class="div1">

            <div class="box  size">垂直水平居中</div>

        </div>

    </body>

公共css代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<style type="text/css">

            /* 公共样式 */

            .div1{

                width: 300px;

                height: 300px;

                border:1px solid aqua;

                 

            }

            .box{

                background: #00FFFF;

            }

            .box.size{

                width:100px;

                height:100px;

            }

</style>

这些css样式在后续介绍中默认带上,不再赘述!

一、 absolute 和 margin auto(常用)

同样居中元素的宽高必须固定,并且需要得知子元素的宽高
这种方式通过设置各个方向的距离都是0,此时再将margin设为auto,就可以在各个方向上居中了

1

2

3

4

5

6

7

8

9

10

11

12

.div1{

                position: relative;

            }

            .box{

                position: absolute;

                top:0;

                left: 0;

                right: 0;

                bottom: 0;

                 

                margin: auto;

            }

二、absolute 和margin(负值)

简单说一下原理,利用了绝对定位,绝对定位的百分比是相对于父元素的宽高,所以我们可以根据这个原理将元素居中显示。但是要注意:绝对定位是基于子元素的左上角来说的,但是要想让子元素居中显示,就要解决这个问题。
此时可以利用margin的负值来实现效果,当外边距为负值时,元素向相反方向定位,这样我们将子元素的外边距设置为子元素的宽高的一半就可以实现了。(PS:缺点就是必须得到子元素的宽高)

1

2

3

4

5

6

7

8

9

10

.div1{

                position: relative;

            }

            .box{

                top: 50%;

                left: 50%;

                position: absolute;

                margin-top: -50px;

                margin-left: -50px;

            }

三、absolute 和 calc

同样需要子元素的宽高固定,并知道宽高,css3具有计算属性。
top的百分比是基于元素左上角减去宽度的一半即可(PS:依赖calc的兼容性)

1

2

3

4

5

6

7

8

9

.div1{

               position: relative;

           }

           .box{

               position: absolute;

               top: calc(50% - 50px );

                /* 减号前后没有空格,该样式不生效*/

               left: calc(50% - 50px );

           }

当我在写这段代码的时候,发现一个有趣的事情,calc(50%-50px)如果减号前后没有空格的话,样式就不会生效,写上空格的话,就会正常生效了,具体原因我也不太清楚emmmmm

下面的方法将不需要知晓子元素的宽高即可设置

html修改为:

1

2

3

4

5

<body>

        <div class="div1">

            <div class="box">水平垂直居中,不需要子元素固定宽高</div>

        </div>

    </body>

公共css如下

1

2

3

4

5

6

7

8

.div1{

            width: 300px;

            height: 300px;

            border: 1px solid red;

        }

        .box{

            background: #00FFFF;

        }

四、flex(常用)

flex是现代的布局方案仅仅需要几行代码即可实现居中效果

1

2

3

4

5

.div1{

                display: flex;

                justify-content: center;

                align-items: center;

            }          

五、line-height

利用行内元素居中属性也可以做到水平垂直居中。把box设置为行内元素,通过text-align就可以实现水平居中vertical-align 也可以在垂直方向做到居中(PS:这种方法需要在子元素中将文字显示重置为想要的效果)

1

2

3

4

5

6

7

8

9

10

11

12

13

.div1{

      line-height: 300px;

      text-align: center;

      font-size: 0px;

  }

  .box{

      font-size: 10px;

      display: inline-block;

      vertical-align: middle;

      line-height:initial;

      /* 修正文字 */

      text-align: left;

  }

六、absolute 和 transform

不需要子元素宽高固定,但是依赖于translate2d的兼容性

1

2

3

4

5

6

7

8

9

.div1{

     position: relative;

 }

 .box{

     position: absolute;

     top: 50%;

     left: 50%;

     transform: translate(-50%,-50%);

 }

七、css-table

css新增的table属性,可以把普通元素改变为table元素的显示效果,也可以实现水平居中

1

2

3

4

5

6

7

8

.div1{

     display:table-cell;

     text-align: center;

     vertical-align: middle;

 }

 .box{

     display:inline-block;

 }

以上就是我总结的一些居中布局的方法了,还有什么其他的欢迎补充!

个人感觉: 我比较喜欢 absolute +margin auto 、flex、absolute 和 transform,移动端最好用flex吧,pc端我喜欢absolute +margin auto

相关教程推荐:CSS视频教程 、CSS3视频教程

以上就是谈谈CSS实现水平垂直居中布局的方法的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

css如何进行单行注释

dw怎么用css做图片轮播

css怎么加滚动条

css中:not用法是什么

css浮动的属性是什么

css的flex怎么根据内容更改高度

你知道怎么利用css实现内凹圆角么

css怎么设置div阴影

css中的url是什么意思

分享div+css前端命名的规则

更多相关阅读请进入《css》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...