第 52 题:怎么让一个 div 水平垂直居中
<div class="parent"> <div class="child"></div> </div>
方案一
div.parent { display: flex; justify-content: center; align-items: center; }
方案二
div.parent { position: relative; } div.child { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } /* 或者 */ div.child { width: 50px; height: 10px; position: absolute; top: 50%; left: 50%; margin-left: -25px; margin-top: -5px; } /* 或 */ div.child { width: 50px; height: 10px; position: absolute; left: 0; top: 0; right: 0; bottom: 0; margin: auto; }
方案三
div.parent { display: grid; } div.child { justify-self: center; align-self: center; }
方案四
div.parent { font-size: 0; text-align: center; &::before { content: ""; display: inline-block; width: 0; height: 100%; vertical-align: middle; } } div.child{ display: inline-block; vertical-align: middle; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(27)
table-cell 是不支持设置 width: 100%; 想让
.parent
和 其容器宽度一致最好设置一个dispaly: table;
父容器。@zeroone001 在 parent 有宽高的时候, child 已经垂直居中了
不行
display: table-cell; 这个居中不了,必须要第三个元素在child里面
100%高度的 after 加上 inline-block
楼上大神们指出的很全了,
我指出一点:
使用 margin-left 和 margin-top, 相对的是父元素,
transform: translate 相对的自身,
这是他们的一点区别,实际上我是想问一下,他们还有没有其他的区别 ,望后续大神指出;
前端小白,有错勿怪,感谢指正
方法2 只能水平居中,方法3导致div.parent宽度和div.parent宽度一样,且设置width样式无效
这个设置table-cell 的盒子会占满父盒子,里面的文字才能居中。
.child{width:fit-content;margin:0 auto}
demohttps://jsbin.com/bakufew/edit?html,css,console,output
能说一下这种实现方式的原理吗
这个我前几天刚在张鑫旭的《CSS世界》里面第一次看到,原理就是(基于我个人的理解):设置inline-block和vertical-align:middle后,里面的元素会基于中间的文字准线居中对齐(学生时代的英语本子里面写字母,都是4条线形成三个空白区域,文字的对齐就是根据这几条线的)vertical-align更多信息可以看看张鑫旭博文;
然后,由于伪类是position:static(默认)的,那么伪类撑开了父元素的基准线(高度是100%),使得此时文字的基准线就是整个div.parent的中心了,另外vertical-align只影响inline或者inline-block的,所以div.child设置vertical-align就能居中了。
以上是我个人的理解,有很多表达不清楚的地方,更详细的内容还是推荐张鑫旭的博文。
提个建议,可以在每一种实现上写一下思想和场景
margin是给自己加个外边框,是相对自身原来的位置来变化吧
学无止境~
div.parent {
position: relative;
}
div.child {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
margin: auto;
}
在73题的IFC中有人提到了IFC的应用场景:垂直居中项应该就是这种方式的实现原理
1、使用绝对定位
2、不使用绝对定位,使用flex
3、使用table-cell,display为table-cell同时使用verticalAlign: middle会让元素垂直居中
居中的几种方式:https://css-tricks.com/centering-css-complete-guide/
我总结的方法:https://juejin.im/post/5ca1a585f265da30dc7ac3f7
需要再补充一个@cleverboy32
同理:
div.parent{ display:grid; } div.child{ margin:auto; }
水平垂直居中有好多种实现方式,主要就分为两类不定宽高和定宽高
以在body下插入一个div为例
使用定位+margin
使用定位+transfrom
不定宽高的方法基本都适用于定宽高的情况
这里把div的宽高按照内容展开
使用定位+transform同样是适用的
还有一些其他的方法比如使用父容器使用flex,grid,table
这两个楼上也提到了,是可以实现的,但是在实际应用中,
因为改变了父容器的display,在多个子节点反而不好用了
补充一个,使用 table-cell 的方式:
楼上总结的差不多了。再加一种