当前位置: 首页 > Web前端 > CSS

CSS实现水平和垂直居中的1010种方式(史上最全)

时间:2023-03-30 14:44:24 CSS

划重点,这是面试必答题。很多面试官喜欢问这个问题。我被问过好几次了。实现上图的效果看似很简单,其实暗藏玄机。本文总结了CSS实现水平和垂直居中的方法大概有以下几种。本文将一一介绍。我已将这篇文章组织到一个github存储库中。欢迎加星。只有居中元素固定宽高适用absolute+negativemarginabsolute+marginautoabsolute+calc先做一些准备工作。假设HTML代码如下,一共有两个元素,父元素和子元素123123

wp是类名父元素的,box是子元素的类名,因为有固定宽度和可变宽度的区别,size用来表示指定宽度,下面都是要用到的效果公开的代码主要是设置颜色、宽高注意:后面不再重复这段常用代码,只给出相应的提示/*publiccode*/.wp{border:1pxsolidred;宽度:300px;height:300px;}.box{背景:绿色;}.box.size{宽度:100px;height:100px;}/*常用代码*/绝对定位的百分比是相对于父元素的宽高,子元素可以通过它,但是绝对定位是以子元素的左上角为基准元素。想要的效果是子元素的中心显示在中心。为了纠正这个问题,您可以使用负值的保证金。负边距可以使元素的位置在相反的方向。通过指定子元素的外边距为子元素宽度一半的负值,可以实现子元素居中,css代码如下/*这里是上面的通用代码*//*这里是上面的通用代码*//*定位代码*/.wp{position:relative;}.box{position:absolute;;顶部:50%;左:50%;保证金-l转移:-50px;margin-top:-50px;}这是我平时使用的方式。这种方式更容易理解,兼容性好。缺点是需要知道子元素的宽高。点击查看完整DEMOabsolute+marginauto该方法还要求居中元素的宽高必须固定。HTML代码如下123123
这个方法设置的距离都是0,此时如果margin是设置为自动,它可以在各个方向居中。.wp{位置:相对;}.box{位置:绝对;;顶部:0;左:0;右:0;底部:0;margin:auto;}这个方法也很兼容,缺点是需要知道子元素的宽高点击查看完整DEMOabsolute+calc这个方法也需要固定居中元素的宽高,所以我们给盒子添加一个sizeclass,HTML代码如下123123感谢css3带来的计算的属性。既然top的百分比是基于元素的左上角,那么减去一半的width就够了。代码如下/*此处引用上面的通用代码*//*此处引用上面的通用代码*//*定位代码*/.wp{position:relative;}.box{position:absolute;;顶部:计算(50%-50px);left:calc(50%-50px);}这个方法的兼容性取决于calc的兼容性。缺点是需要知道子元素的宽高。点击查看完整DEMOabsolute+transformorabsolute定位,但是这种方法不需要子元素固定宽高,所以sizeclass就不用了,HTML代码如下<分区class="box">123123修复了绝对定位的问题,也可以使用css3新的transform,transform的translate属性也可以设置一个百分比,是相对于自身的width和height,所以可以说translate设置为-50%,就可以居中了。代码如下/*这里是上面的公开代码*//*这里是上面的公开代码*//*定位代码*/.wp{position:relative;}.box{position:absolute;顶部:50%;左:50%;transform:translate(-50%,-50%);}这个方法的兼容性取决于translate2d的兼容性。点击查看完整DEMOlineheight利用内联元素的centering属性也可以实现水平居中和垂直居中。HTML代码如下123123设置框为内联元素,通过text-align可以实现水平居中,但是很多同学可能不知道vertical-align也可以用来实现垂直方向居中,代码如下/*这里是上面的公共代码*//*这里是上面的公共代码*//*定位代码*/.wp{行高:300px;文本对齐:居中;字体大小:0px;}.box{字体大小:16px;显示:内联块;垂直对齐:中间;行高:初始;文本对齐:左;/*修改文字*/}该方法需要将子元素中的文字显示重置为想要的效果。点击查看完整DEMOwriting-mode想必很多同学都同意我也不知道writing-mode属性,感谢张新旭老师的反馈。简单来说,writing-mode可以改变文字的显示方向。例如,您可以使用writing-mode使文本垂直显示。水平方向垂直方向.div2{writing-mode:vertical-lr;}显示效果如下:水平方向和垂直方向更神奇所有水平方向的css属性都会变成垂直方向的属性,比如text-align,可以通过writing-mode和text-align实现水平和垂直居中,但是有点troublesome123123/*此处引用上面的公开代码*//*这里参考上面的公共代码*//*定位代码*/.wp{writing-mode:vertical-lr;text-align:center;}.wp-inner{书写模式:horizo??ntal-tb;显示:内联块;文本对齐:居中;宽度:100%;}.box{显示:内联块;保证金:自动;text-align:left;}这个方法实现和理解起来有点复杂。点击查看完整DEMOtableTable曾经用于页面布局,现在没人做了,但是table也可以实现水平和垂直居中,但是会增加很多冗余代码123123
tabel单元格中的内容自然垂直居中,只需添加只是一个水平居中的property.wp{text-align:center;}.box{display:inline-block;}这个方法是代码太冗余了,也不是table的正确用法。点击查看完整DEMOcss-tablecss新增的table属性可以让我们将普通的元素变成逼真的表格元素效果。通过此功能,还可以实现水平和垂直居中。123123通过下面的css属性可以让div和table一样显示.wp{display:table-cell;文本对齐:居中;vertical-align:middle;}.box{display:inline-block;}这个方法原理和table一样,但是没有那么多冗余代码,兼容性也不错。单击以查看完整的DEMO。flexflex作为现代布局解决方案,颠覆了以往的体验,只需几行代码就可以优雅地达到这个水平。垂直居中123123.wp{display:flex;证明内容:居中;align-items:center;}目前在移动端可以使用flex,PC端需要检查业务的兼容性。单击以查看完整的DEMOgrid。感谢@一直姐提供的解决方案。新的cssgridlayout因为兼容性不好,一直没怎么关注。,水平垂直居中也可以通过grid123123.wp{display:grid;}.box{align-self:中心;justify-self:center;}代码量也很少,但是兼容性不如flex,不推荐使用。单击以查看完整的DEMO摘要,并比较下面每种方法的优缺点。又到了一些同学讲汉字怎么写的时候了。简单总结就是PC端有兼容性需求,宽高是固定的。推荐绝对+负边距。PC端有兼容性需求,宽高不固定。建议css-table不兼容Flexibility要求,移动端推荐flex推荐flextips:flex兼容方案请看这里《移动端flex布局实战》方法居中元素固定宽高固定PC兼容移动端兼容absolute+negativemargin是ie6+,chrome4+,firefox2+Android2.3+,iOS6+absolute+marginauto是ie6+,chrome4+,firefox2+Android2.3+,iOS6+absolute+calc是ie9+,chrome19+,firefox4+Android4.4+,iOS6+absolute+transform不是ie9+,chrome4+,firefox3.5+Android3+,iOS6+writing-modeorie6+,chrome4+,firefox3.5+android2.3+,iOS5.1+lineheightorie6+,chrome4+,firefox2+android2.3+,iOS6+tableorie6+,chrome4+,firefox2+android2.3+,iOS6+css-table没有ie8+,chrome4+,firefox2+android2.3+,iOS6+flex没有ie10+,chrome4+,firefox2+android2.3+,iOS6+grid没有ie10+,chrome57+,firefox52+android6+、iOS10.3+最近发现很多同学对css不够重视,which实际上是不正确的。比如下面这几个简单的问题,好多同学都看不懂,我也很无语。123123.red{color:red}.blue{color:blue}当问到两者的颜色是什么div是,只有40%的同学能答对,这40%里还有很多同学不知道为什么,希望这些同学好好学习CSS的基础知识。这里有几本我想推荐给你的CSS书籍:CSSDesignGuide(最好的入门书)GraphicalCSS3(CSS3最佳入门)CSSWorld(CSSAdvanced)CSS揭秘(CSSExpert)喜欢看网络资料的同学,可以看看MDN上的这篇CSS入门教程。强烈推荐。英语好的同学推荐阅读英文版原网址:http://yanhaijing.com/css/2018/01/17/horizo??ntal-vertical-center/最后推荐一下我的新书《React状态管理与同构实战》,前沿同构技术深度解读,感谢支持京东:https://item.jd.com/12403508.html当当网:http://product.dangdang.com/25308679.html