racte margin 居中 失效_总结下CSS水平居中的方法

自从用了flex以后就很少再研究布局问题了,不过最近在上网课,又复习了很多居中的小技巧,在这里总结下。

首先说说水平居中:

  1. 文本居中

这是最简单的居中方式,只需要在父元素设置text-align:center即可

CSS:

.

HTML:

<

最终效果:

a5cb23ff-6a13-eb11-8da9-e4434bdf6706.png

这个方法适合做标题栏。

虽然是文本居中,但实际上指的是子元素中的行内元素居中,那么行内元素除了上面的文本,还可以是行内块级元素,文本不能指定固定宽高,行内块级元素能指定宽高,这样我们就可以实现行内块级元素居中。

保持上面的CSS不动,修改html如下

<div class="container1">
    <div style="display: inline-block; width:100px; height: 50px; background:green"></div>
  </div>

最终效果:

adcb23ff-6a13-eb11-8da9-e4434bdf6706.png

但缺点是,子元素会继承父元素的text-align,所以在子元素中要记得消除这个属性。


2. 块级元素居中

这要分是否是固定宽度,如果是元素固定宽度的话,我们可以使用margin来达到居中的目的。

.

HTML代码如下:

<

最终效果:

b2cb23ff-6a13-eb11-8da9-e4434bdf6706.png

那么他的缺点也很明显,就是必须指定苦丁宽度才能配合margin:auto达到居中,所以宽度不能自适应内容。

如果宽度是由子元素决定的,即父元素宽度不确定,由子元素内容撑开。那么我们可以使用absolute布局来达到居中的目的。

由于absolute元素可以在父元素内通过上下左右的距离来自由移动,我们的思想是:先让元素的左侧距离父元素的50%处,此时元素最左侧和父元素的中心对齐,那么元素是偏右的,我们必须要让子元素的中心与父元素的中心对齐,我们需要让元素向左平移自身一半,由于元素自身宽度不确定,所以不能写死,我们需要使用translate来平移,因为translate中的百分比总是基于自身。

CSS代码:

.

HTML:

<

最终效果:

b5cb23ff-6a13-eb11-8da9-e4434bdf6706.png

但是我们发现,我需要在父元素container身上设置一个高度,比如100px,这是为什么的?

因为我们使用absolute后,该元素会脱离父元素,你可以想象成从父元素体内飞离出来,悬浮在父元素上方,父元素不能包裹该元素,从而该元素不能将父元素撑开,所以就导致父元素不设置高度的话,高度将为0,就不能自适应了。同样水平方向也是。这也是此方法的缺点。


那么上述方法或多或少都有这个那个问题,有什么事完美的吗?

当然必须有了,那就是flex布局,flex真是最伟大的一个css属性,真的是解决了太多的痛点了。

下面我们来看看使用flex有多么的简单。

首先当我们对父元素应用flex后,并设置一个flex主方向(flex-direction,默认水平)后,子元素的宽度将变为包裹内容或者已经设置死的宽度。而且子元素float,absolute,fixed将失效

什么叫包裹内容,即宽度是子元素撑开的宽度,大家知道,默认情况下,块级元素div宽度可是100%父元素的宽度哦。

然后我们有两种方法:

方法一:针对父元素设置 justify-content: center;

CSS:

.container4 {
      display: flex;
      justify-content: center; /* 调整flex主方向上子元素的位置 */
 }

.flex-center-in-parent {
      background-color: lightblue;
      height: 50px;
}

HTML:

<

最终效果:

b9cb23ff-6a13-eb11-8da9-e4434bdf6706.png

而且此时子元素既可以是固定宽度,又可以是不固定宽度,无论怎样都能居中。

更棒的是父元素高度能被子元素撑开,父元素高度也能自适应了。

即便子元素有多个,也会乖乖向中心靠拢哦!

c2cb23ff-6a13-eb11-8da9-e4434bdf6706.png

方法二:父元素不动,子元素设置margin:auto:

CSS:

.

HTML:

<

最终效果:

c4cb23ff-6a13-eb11-8da9-e4434bdf6706.png

这样我们也达到了和方法一同样的效果。

但是多个元素会怎样呢?

经过我的观察,原来margin:auto指的是在剩余空间中居中,由于上述父元素只有一个子元素,剩余空间刚好是父元素宽度,才造成了在父元素居中的“障眼法”,但是当子元素不止一个可就不一样咯,比如下面:

c6cb23ff-6a13-eb11-8da9-e4434bdf6706.png

毕竟我们使用flex布局,就必须时时刻刻与“剩余空间”打交道,或是居中,或是填满,又或者空间不够如何收缩等等。

使用flex是最好的布局方法,如果非要说缺点呢?我只能想到不兼容IE,不过现在谁还兼容IE啊,何必那精力和人力,不值得。

好了,今天就总结到这里了,希望对大家有帮助。其实还有一些方法能够水平居中,比如table,grid等,这里就不再多赘述了,毕竟方法万千,选一个适合自己的才是最重要的。如果本文有说错的地方,还请多多指正。喜欢记得点赞哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值