CSS 不定宽高的盒子水平垂直居中


在平时练习的时候经常会碰到盒子需要定位的问题,一般都是使用 margin:auto 就可以实现盒子的定位了.

有同学说在面试的时候碰人家问了这道题,说实话,突然还有点懵,我想没有宽高的盒子看都看不见,何谈定位,其实是我片面了,里面可以写一些内容把盒子撑开.具体看下面:

1.flex

可能大家第一个想到的就是使用弹性盒模型了,弹性盒模型是一个非常好的布局方案,也不会有很多的兼容的问题,我们只需要两个关键的属性就可以实现:

  • justify-content
  • align-items
    具体如下(省略了部分代码):
   <div class="container">
        <p>i want to eat</p>
    </div>
        .container {
            width: 200px;
            height: 200px;
            border :1px solid #5588aa;

            display: flex;
            justify-content: center;
            align-items: center;
        }

2.flex + margin

这是flex方法的一个延伸,将父元素设置为flex,子元素设置属性margin : auto,也可实现居中.

    <div class="container">
        <p>i want to eat</p>
    </div>
        .container {
            width: 200px;
            height: 200px;
            border :1px solid #5588aa;
            display: flex;
        }

3. transform +absolute

这个通常用来设置图片的垂直水平居中

<div class="wrapper">
   <img src="test.png">
</div>
    .container {
    	width: 300px;
    	height: 300px;
    	border: 1px solid #ccc;
    	position: relative;
	}

  img {
    	position: absolute;
    	left: 50%;
    	top: 50%;
    	transform: translate(-50%, -50%);
	}

4. grid

格布局让我们能够按行或列来对齐元素。 然而在布局上,网格比表格更可能做到或更简单。

<div class="wrapper">
    <img src="test.png">
</div>
        .container {
            display: grid;
            width: 200px;
            height: 200px;
            border :1px solid #5588aa;
        }

        p {
            align-self: center;
            justify-self: center;
        }

5. table-cell

利用 table 的单元格居中效果展示。与 flex 一样,需要写在父级元素上。

<div class="wrapper">
    <img src="test.png">
</div>
        .container {
            display: table-cell;
            vertical-align: middle;
            text-align: center;
            width: 200px;
            height: 200px;
            border :1px solid #5588aa;
        }

6. ::after

可以实现图片的居中

水平方向很好理解。垂直方向,可以理解为 ::after 把 img 往下拉到了中间。

<div class="container">
    <img src="test.png">
</div>
        .container {
            width: 200px;
            height: 200px;
            border: 1px solid #ccc;
            text-align: center;
        }

        .container::after {
            content: '';
            display: inline-block;
            vertical-align: middle;
            height:100%;
            background-color: blue;
        }

        img {
            vertical-align: middle;
        }

7 ::before

另一种是配合 font-size: 0实现居中
font-size: 0; 的神秘之处在于,可以消除标签之间的间隙

<div class="container">
    <img src="test.png">
</div>
        .container {
            width: 200px;
            height: 200px;
            border: 1px solid #ccc;
            text-align: center;
            font-size: 0;
        }

        .container::before {
            content: '';
            display: inline-block;
            vertical-align: middle;
            height:100%;
            font-size: 14px;
        }

        img {
            vertical-align: middle;
            font-size : 14px;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值