浅谈position、table-cell、flex-box三种垂直(水平)居中技巧

本文介绍了三种网页元素垂直居中的方法:使用position属性的经典方案、利用display:table-cell属性实现自适应布局以及采用flex-box进行弹性布局。每种方法都有详细的代码示例和适用场景说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、首先是喜闻乐见的position方法,经典且万能,用法如下:

 1 父元素{
 2     position:relative;
 3 }
 4 子元素{
 5     position:absolute;
 6     top:50%;
 7     left:50%;
 8     margin-top:/*该元素height*0.5的负值*/;
 9     margin-left:/*该元素width*0.5的负值*/;
10 }

   不需要水平居中可以去掉left和margin-left。

 划重点需要父元素和子元素都定义宽高自适应是不可能自适应的,这辈子都不可能自适应的

 

 

二、 display:table-cell能够使大小不固定的元素实现垂直居中布局,先来一发用法:

 

父元素{
    display:table-cell;
    vertical-align:middle;
}
子元素{
    vertical-align:middle;
}

 

  table-cell布局除了常见的实现不同宽高的图片垂直居中,还能做到自适应两栏布局(评论区等):

  代码如下:

HTML部分:

<div class="wrap">
        <div class="img">
            <img src="http://img5.imgtn.bdimg.com/it/u=416202619,4025660570&fm=26&gp=0.jpg" width="80px" height="80px" alt="">
        </div>
        <div class="text">
            <p>文字部分 </p>
        </div>
    </div>

CSS部分:

<style type="text/css">
        .wrap{
            display: table-row;
        }
        .img{
            display: table-cell;
            vertical-align: middle;
            text-align: center;
            width: 100px;
            border: 1px solid #000;
        }
        .text{
            display: table-cell;
            width: 300px;
            border: 1px solid #000;
            padding: 10px;
        }
        .wrap div+div{
            border-left: none;
        }
</style>

 

  另外table-cell还能自动使多个子元素等宽分布,不需要自己计算宽度:

  代码如下:

        ul{
            list-style-type:none;
            display: table;
            width: 250px;
            padding: 0;
        }
        li{
            display: table-cell;
            text-align: center;
        }
        li+li{
           border-left: 1px solid #000;
        }

 

划重点:1、IE6/7不支持; 2、table-cell不支持margin属性(但支持padding),就很僵硬; 3、尽量不要和浮动/定位同时用,会破坏它的css属性。

 

 

三、如果你用ie我们就做不成朋友之弹性布局神器flex-box,用法如下:

父元素{
    display:flex /* 行内元素用inline-flex */
    align-items:center;/*当主轴为水平方向(默认)*/ 
}

  原理是使flex-box的子元素(伸缩项目)沿着侧轴方向(当默认flex-direction:row时,侧轴就是垂直方向)居中对齐。

  使用flex-wrap,还可以使伸缩容器里的内容折叠显示:

  当调整视口宽度缩小到480px时:

  代码如下:

<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        *{margin: 0;padding: 0;}
        #box{
            display: flex;
            flex-wrap: wrap;
            justify-content:center;/* 主轴方向居中对齐*/
            align-items: center;/* 侧轴方向居中对齐*/
            padding: 50px;
            font-size: 2.5em;
            font-weight: bold;
            text-align: center;
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <div id="box">
        <p class="item1">超好吃的</p>
        <p class="item2"></p>
        <p class="item3">麻辣小龙虾</p>
    </div>
</body>

  浏览器兼容情况:

低版本浏览器兼容性解决:

 
display: -moz-box; /* 低版本firefox */

display:-webkit-box;/* IOS 6-,safari 3.1-6 */

------

display: -ms-flexbox; /* IE10  */
display: -webkit-flex; /* Chrome 21+, Safari 6.1+, iOS Safari 7+, Opera 15/16 */

display: -moz-flex; /* 较低版本firefox */
display: flex; /*IE11,  Chrome29+, FireFox 20+ */

参考:

  兼容:

https://zhuanlan.zhihu.com/p/21640023

http://www.cnblogs.com/iriszhang/p/6102524.html

  flex-box的兼容性bug解决:

http://www.w3cplus.com/css3/normalizing-cross-browser-flexbox-bugs.html

转载于:https://www.cnblogs.com/guoyingjie/p/7217548.html

### 实现 div 元素垂直水平居中的 CSS 方法 以下是几种常见的实现 div 元素垂直水平居中的方法: #### 1. 使用表格布局 (Table Layout) 通过将父容器设置为 `display: table`,并将子元素设置为 `display: table-cell` 和 `vertical-align: middle` 来实现垂直居中。同时利用 `text-align: center` 完成水平居中。 ```html <div class="box1"> <div class="box2">我要水平垂直居中</div> </div> <style> .box1 { width: 400px; height: 400px; background-color: yellow; text-align: center; /* 水平居中 */ display: table; /* 设置为表格显示模式 */ } .box2 { background-color: red; display: table-cell; /* 子元素作为单元格 */ vertical-align: middle; /* 垂直居中 */ } </style> ``` 这种方法适用于静态高度宽度的情况[^2]。 --- #### 2. 使用弹性盒子模型 (Flexbox) Flexbox 是一种强大的布局工具,可以通过简单的属性组合轻松实现垂直水平居中。 ```html <div class="container"> <div class="item">我要水平垂直居中</div> </div> <style> .container { display: flex; /* 启用 Flexbox */ justify-content: center;/* 主轴方向上居中(水平) */ align-items: center; /* 交叉轴方向上居中(垂直) */ width: 400px; height: 400px; background-color: yellow; } .item { background-color: red; } </style> ``` 这种方式简单直观,适合现代浏览器环境下的开发需求[^4]。 --- #### 3. 使用绝对定位与变换 (Absolute Positioning and Transform) 通过结合 `position: absolute` 和 `transform` 属性来动态调整位置,从而达到精确的中心对齐效果。 ```html <div class="parent"> <div class="child">我要水平垂直居中</div> </div> <style> .parent { position: relative; /* 创建相对定位上下文 */ width: 400px; height: 400px; background-color: yellow; } .child { position: absolute; /* 绝对定位 */ top: 50%; /* 移动到顶部中间 */ left: 50%; /* 移动到左侧中间 */ transform: translate(-50%, -50%);/* 抵消自身的宽高偏移量 */ background-color: red; } </style> ``` 该方案兼容性较好,在旧版浏览器中也能正常工作。 --- #### 4. 使用网格布局 (Grid Layout) CSS Grid 提供了一种更现代化的方式来进行二维空间内的布局控制。 ```html <div class="grid-container"> <div class="grid-item">我要水平垂直居中</div> </div> <style> .grid-container { display: grid; /* 启用网格布局 */ place-items: center; /* 自动完成行列双向居中 */ width: 400px; height: 400px; background-color: yellow; } .grid-item { background-color: red; } </style> ``` 这是目前最简洁的方法之一,尤其适合复杂的多维布局场景。 --- #### 总结 以上四种方法各有优劣: - **表格布局**:语义清晰但灵活性较低。 - **Flexbox**:语法简单易懂,推荐用于单向或多项目排列。 - **绝对定位加变换**:兼容性强,适配老旧设备。 - **Grid 布局**:功能强大,特别适合复杂页面结构设计。 具体选择取决于实际应用场景以及目标用户的浏览器支持情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值