问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

CSS实现水平垂直居中的几种方法介绍

发布网友 发布时间:2022-04-28 11:29

我来回答

2个回答

懂视网 时间:2022-04-28 16:21

本篇文章给大家带来的内容是关于值得收藏的CSS实现水平垂直居中的10种方式总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

划重点,这是一道面试必考题,很多面试官都喜欢问这个问题,我就被问过好几次了

2345截图20180914141343.png

要实现上图的效果看似很简单,实则暗藏玄机,本文总结了一下CSS实现水平垂直居中的方式大概有下面这些,本文将逐一介绍一下

仅居中元素定宽高适用

  • absolute + 负margin

  • absolute + margin auto

  • absolute + calc

  • 居中元素不定宽高

  • absolute + transform

  • lineheight

  • writing-mode

  • table

  • css-table

  • flex

  • grid

  • absolute + 负margin

    为了实现上面的效果先来做些准备工作,假设HTML代码如下,总共两个元素,父元素和子元素

    <div class="wp">
     <div class="box size">123123</div>
    </div>

    wp是父元素的类名,box是子元素的类名,因为有定宽和不定宽的区别,size用来表示指定宽度,下面是所有效果都要用到的公共代码,主要是设置颜色和宽高

    注意:后面不在重复这段公共代码,只会给出相应提示

    /* 公共代码 */
    .wp {
     border: 1px solid red;
     width: 300px;
     height: 300px;
    }
    
    .box {
     background: green; 
    }
    
    .box.size{
     width: 100px;
     height: 100px;
    }
    /* 公共代码 */

    绝对定位的百分比是相对于父元素的宽高,通过这个特性可以让子元素的居中显示,但绝对定位是基于子元素的左上角,期望的效果是子元素的中心居中显示

    为了修正这个问题,可以借助外边距的负值,负的外边距可以让元素向相反方向定位,通过指定子元素的外边距为子元素宽度一半的负值,就可以让子元素居中了,css代码如下

    /* 此处引用上面的公共代码 */
    /* 此处引用上面的公共代码 */
    
    /* 定位代码 */
    .wp {
     position: relative;
    }
    .box {
     position: absolute;;
     top: 50%;
     left: 50%;
     margin-left: -50px;
     margin-top: -50px;
    }

    这是我比较常用的方式,这种方式比较好理解,兼容性也很好,缺点是需要知道子元素的宽高

    点击查看完整DEMO

    absolute + margin auto

    这种方式也要求居中元素的宽高必须固定,HTML代码如下

    <div class="wp">
     <div class="box size">123123</div>
    </div>

    这种方式通过设置各个方向的距离都是0,此时再讲margin设为auto,就可以在各个方向上居中了

    /* 此处引用上面的公共代码 */
    /* 此处引用上面的公共代码 */
    
    /* 定位代码 */
    .wp {
     position: relative;
    }
    .box {
     position: absolute;;
     top: 0;
     left: 0;
     right: 0;
     bottom: 0;
     margin: auto;
    }

    这种方法兼容性也很好,缺点是需要知道子元素的宽高

    点击查看完整DEMO

    absolute + calc

    这种方式也要求居中元素的宽高必须固定,所以我们为box增加size类,HTML代码如下

    <div class="wp">
     <div class="box size">123123</div>
    </div>

    感谢css3带来了计算属性,既然top的百分比是基于元素的左上角,那么在减去宽度的一半就好了,代码如下

    /* 此处引用上面的公共代码 */
    /* 此处引用上面的公共代码 */
    
    /* 定位代码 */
    .wp {
     position: relative;
    }
    .box {
     position: absolute;;
     top: calc(50% - 50px);
     left: calc(50% - 50px);
    }

    这种方法兼容性依赖calc的兼容性,缺点是需要知道子元素的宽高

    点击查看完整DEMO

    absolute + transform

    还是绝对定位,但这个方法不需要子元素固定宽高,所以不再需要size类了,HTML代码如下

    <div class="wp">
     <div class="box size">123123</div>
    </div>

    修复绝对定位的问题,还可以使用css3新增的transform,transform的translate属性也可以设置百分比,其是相对于自身的宽和高,所以可以讲translate设置为-50%,就可以做到居中了,代码如下

    /* 此处引用上面的公共代码 */
    /* 此处引用上面的公共代码 */
    
    /* 定位代码 */
    .wp {
     position: relative;
    }
    .box {
     position: absolute;
     top: 50%;
     left: 50%;
     transform: translate(-50%, -50%);
    }

    这种方法兼容性依赖translate2d的兼容性

    点击查看完整DEMO

    lineheight

    利用行内元素居中属性也可以做到水平垂直居中,HTML代码如下

    <div class="wp">
     <div class="box size">123123</div>
    </div>

    把box设置为行内元素,通过text-align就可以做到水平居中,但很多同学可能不知道通过通过vertical-align也可以在垂直方向做到居中,代码如下

    /* 此处引用上面的公共代码 */
    /* 此处引用上面的公共代码 */
    
    /* 定位代码 */
    .wp {
     line-height: 300px;
     text-align: center;
     font-size: 0px;
    }
    .box {
     font-size: 16px;
     display: inline-block;
     vertical-align: middle;
     line-height: initial;
     text-align: left; /* 修正文字 */
    }

    这种方法需要在子元素中将文字显示重置为想要的效果

    点击查看完整DEMO

    writing-mode

    很多同学一定和我一样不知道writing-mode属性,感谢@张鑫旭老师的反馈,简单来说writing-mode可以改变文字的显示方向,比如可以通过writing-mode让文字的显示变为垂直方向

    <div class="div1">水平方向</div>
    <div class="div2">垂直方向</div>
    .div2 {
     writing-mode: vertical-lr;
    }

    显示效果如下:

    水平方向
    垂
    直
    方
    向

    更神奇的是所有水平方向上的css属性,都会变为垂直方向上的属性,比如text-align,通过writing-modetext-align就可以做到水平和垂直方向的居中了,只不过要稍微麻烦一点

    <div class="wp">
     <div class="wp-inner">
     <div class="box">123123</div>
     </div>
    </div>
    /* 此处引用上面的公共代码 */
    /* 此处引用上面的公共代码 */
    
    /* 定位代码 */
    .wp {
     writing-mode: vertical-lr;
     text-align: center;
    }
    .wp-inner {
     writing-mode: horizontal-tb;
     display: inline-block;
     text-align: center;
     width: 100%;
    }
    .box {
     display: inline-block;
     margin: auto;
     text-align: left;
    }

    这种方法实现起来和理解起来都稍微有些复杂

    点击查看完整DEMO

    table

    曾经table被用来做页面布局,现在没人这么做了,但table也能够实现水平垂直居中,但是会增加很多冗余代码

    <table>
     <tbody>
     <tr>
      <td class="wp">
      <div class="box">123123</div>
      </td>
     </tr>
     </tbody>
    </table>

    tabel单元格中的内容天然就是垂直居中的,只要添加一个水平居中属性就好了

    .wp {
     text-align: center;
    }
    .box {
     display: inline-block;
    }

    这种方法就是代码太冗余,而且也不是table的正确用法

    点击查看完整DEMO

    css-table

    css新增的table属性,可以让我们把普通元素,变为table元素的现实效果,通过这个特性也可以实现水平垂直居中

    <div class="wp">
     <div class="box">123123</div>
    </div>

    下面通过css属性,可以让p显示的和table一样

    .wp {
     display: table-cell;
     text-align: center;
     vertical-align: middle;
    }
    .box {
     display: inline-block;
    }

    这种方法和table一样的原理,但却没有那么多冗余代码,兼容性也还不错

    点击查看完整DEMO

    flex

    flex作为现代的布局方案,颠覆了过去的经验,只需几行代码就可以优雅的做到水平垂直居中

    <div class="wp">
     <div class="box">123123</div>
    </div>
    .wp {
     display: flex;
     justify-content: center;
     align-items: center;
    }

    目前在移动端已经完全可以使用flex了,PC端需要看自己业务的兼容性情况

    点击查看完整DEMO

    grid

    感谢@一丝姐 反馈的这个方案,css新出的网格布局,由于兼容性不太好,一直没太关注,通过grid也可以实现水平垂直居中

    <div class="wp">
     <div class="box">123123</div>
    </div>
    .wp {
     display: grid;
    }
    .box {
     align-self: center;
     justify-self: center;
    }

    代码量也很少,但兼容性不如flex,不推荐使用

    点击查看完整DEMO

    总结

    下面对比下各个方式的优缺点,肯定又双叒叕该有同学说回字的写法了,简单总结下

  • PC端有兼容性要求,宽高固定,推荐absolute + 负margin

  • PC端有兼容要求,宽高不固定,推荐css-table

  • PC端无兼容性要求,推荐flex

  • 移动端推荐使用flex

  • 小贴士:

    方法居中元素定宽高固定PC兼容性移动端兼容性
    absolute + 负marginie6+, chrome4+, firefox2+安卓2.3+, iOS6+
    absolute + margin autoie6+, chrome4+, firefox2+安卓2.3+, iOS6+
    absolute + calcie9+, chrome19+, firefox4+安卓4.4+, iOS6+
    absolute + transformie9+, chrome4+, firefox3.5+安卓3+, iOS6+
    writing-modeie6+, chrome4+, firefox3.5+安卓2.3+, iOS5.1+
    lineheightie6+, chrome4+, firefox2+安卓2.3+, iOS6+
    tableie6+, chrome4+, firefox2+安卓2.3+, iOS6+
    css-tableie8+, chrome4+, firefox2+安卓2.3+, iOS6+
    flexie10+, chrome4+, firefox2+安卓2.3+, iOS6+
    gridie10+, chrome57+, firefox52+安卓6+, iOS10.3+

    最近发现很多同学都对css不够重视,这其实是不正确的,比如下面的这么简单的问题都有那么多同学不会,我也是很无语

    <div class="red blue">123</div>
    <div class="blue red">123</div>
    .red {
     color: red
    }
    
    .blue {
     color: blue
    }

    热心网友 时间:2022-04-28 13:29

    不用给你多种方法了,自从我知道一种方法后就懒得用其他方式来实现水平垂直居中了,这种方法最大的优点就是可以宽度高度自适应,当然,设置固定宽高也可以;

    <div style="position:absolute;left:50%; top:50%; transform:translate(-50%,-50%);">内容内容</div>

    如果是水平垂直居中与某个div,那么在父级上加一下position:relative;即可

    另外再介绍一个特殊的水平居中方法,就是利用table中td默认为垂直居中的特性,把div放入td中再设置水平居中即可

    <table border="0" cellpadding="0" cellspacing="0" width="100%">
     <tr>
      <td style=" height:500px; background:red;">
       <div style="text-align:center; background:blue; width:300px; margin:0 auto;">内容内容</div>
      </td>
     </tr>
    </table>

    其他方法也懒得多说了,局限性太强,其实通常你全部使用第一种方法就足够你实现所有效果了

    CSS实现水平垂直居中的几种方法介绍

    固定高度实现水平垂直居中方法一最常用的方法是使用height + line-height的方式,设置同样的值,配合text-align的使用,即可实现文本的水平垂直居中对齐Hello World!.container { width: 300px; height: 300px; line-height: 300px; text-align: center; border: 1px solid red;}缺点:固定高度,无法...

    css样式如何设置div元素水平垂直居中的三种方法

    1.建立txt文档,更改后缀名为html,如图:2.右击html文件,选择用记事本打开,如图:3.讲解第一种div绝对定位水平垂直居中【CSS3使用transform】, transform中translate偏移的百分比值是相对于自身大小的,无论绝对定位元素的尺寸是多少,其都是水平垂直居中显示的,但问题是兼容性不好。IE9+以及其他现代浏...

    CSS如何实现垂直水平居中

    CSS实现垂直水平居中的三种方案1.容器内元素display:inline/inline-block这种情况就比较容易了,直接设置容器的text-align就可以实现内容元素的水平居中,设置垂直居中的话要设置容器的高度,然后设置容易的line-height===height就可以,如下: this is text .container{ text-align: center; height: ...

    css 如何水平垂直居中一个行内块元素?

    您可以使用以下方法之一来水平垂直居中一个行内块元素:1. 利用绝对定位实现元素垂直,水平居中显示。2. 利用margin: 0 auto实现块级元素水平居中。3. 根据margin: auto 实现居中。4. 利用text-align: center;实现块级元素内部的行内元素水平居中。5. 利用vertical-align: middle; 实现垂直居中。6. ...

    CSS3如何实现元素水平居中、垂直居中

    父元素高度确定的单行文本 垂直居中的方法是通过 设置父元素的height和line-height高度一致来实现的 说到竖直居中,css 中有一个用于竖直居中的属性 vertical-align,但这个样式只有在父元素为 td 或 th 时,才会生效 父元素高度确定的多行文本1 使用 插入 table (包括tbody、tr、td)标签,同时设置 ...

    CSS垂直居中的8种方法

    通过display:flex实现CSS垂直居中的方法是给父元素display:flex;而子元素align-self:center; 这个跟CSS水平居中的原理是一样的,只是在flex-direction上有所差别,一个是row(默认值),另外一个是column。通过伪元素:before实现CSS垂直居中。 具体方式是为父元素添加伪元素:before,使得子元素实现垂直居中。

    css居中的几种方式_html/css_WEB-ITnose

    1.margin 这种方式只能实现固定宽度的块级元素水平居中,如果该元素没有设置宽度或者不是块级元素,则不会生效。/*以div元素为例*/div{ width: 100px; height: 100px; margin: auto; /*或者margin: 0 auto;*/} 2.line-height 将单行文字line-height值设置为其父元素高度可以实现该行文字的垂...

    如何使文字在div中水平和垂直居中的css代码

    1. 使用Flex布局 CSS的Flex布局是一种强大的布局方式,可以轻松地实现元素在容器中的灵活布局。为了实现文字在div中的居中,可以将该div的display属性设置为flex。这样,该div就会变成一个弹性容器。2. 水平居中 在弹性容器中,要实现水平居中,可以使用`justify-content: center;`属性。这个属性决定了弹性...

    css垂直居中怎么设置

    通过display:flex实现CSS垂直居中的方法是给父元素display:flex;而子元素align-self:center;这个跟CSS水平居中的原理是一样的,只是在flex-direction上有所差别,一个是row(默认值),另外一个是column。3、通过伪元素:before实现CSS垂直居中。具体方式是为父元素添加伪元素:before,使得子元素实现垂直居中。

    CSS水平居中与垂直居中的总结

    1. 设置 margin: 0 auto;单行文本垂直居中,通过设置行高为父元素高度(父元素高度已知)。图片垂直居中,设置上下padding(父元素高估不设置)。图片垂直居中,下边这种方法会有一定偏差(父元素高估不设置)。图片垂直居中,图片作为背景。1. 若元素是行内块级元素, 基本思想是使用display: inline-block...

    水平垂直居中的几种方法 div水平垂直居中的方法 前端水平垂直居中的方法 css实现元素水平垂直居中 垂直和水平方向居中怎么设置 怎么垂直水平居中 水平垂直居中 水平及垂直居中怎么弄 让div水平垂直居中
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    燕京啤酒(桂林漓泉)股份有限公司公司简介 儿童沙眼症状 巴西龟眼睛红肿,流鼻涕 炒勺子肉制作过程 奥迪Q3Q3打开电源,不开发动机,机舱里面有风扇在转,是什么情况? 明锐发动机机舱过热正常吗? 酒吧装酒是什么意思呀? 万智牌 规则 问题 出去玩带点什么吃的好呢 出去玩应该带什么吃的好 新浪微博110004封几天 怎么知道微博被禁言时长? 做梦梦见海豚 说明什么啊 四大名著中的成语 晚上梦到海豚代表啥 源于历史古事的词语 加和旦可组成仕么字,并组词 梦见两只海豚被杀,没见血 带有程字的成语 男宝宝出生日期2020年2月12日上午10点6分,姓朱,取什么名字好? 形容往来的成语 抬字开头的成语接龙 今年出生的男孩取什么名字好?各位帮帮忙 享打头的成语接龙 梦见海豚,想知道是什么寓意。 关于从速火急的词语 今年生男宝宝取什么名字好 梦见自己生了两个海豚 今年出生的男宝宝取什么名字好? 比喻日夜赶路的成语 腾讯会议能放歌吗? 腾讯会议开会的时候开音乐如何让听众听到? 用手机上安装的腾讯会议软件播放手机中的视频时,为什么远程开会时对方只看到画面,都听不到声音? 祝氏昌辈女孩怎么取名? 祝姓小女孩,属蛇,缺火怎么取名? 祝姓宝宝取名字,第二个字是永,求第三个字! win7网络设置禁用关闭如何打开 冬天的谚语有哪些 关于冬季的谚语有哪些 关于冬天的一句谚语 冬天的谚语大全 形容冬天的谚语 关于冬的谚语 冬天天气谚语 冬天的格言谚语 冬天的歇后语 描写冬天寒冷的俗语 描写冬天的歇后语和谚语 电脑如何强制退出当前应用 怎么强制关闭当前程序