当前位置: 首页 > 科技观察

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

时间:2023-03-12 05:53:58 科技观察

CSS实现水平和垂直居中的1010种方式(史上最全)实现上图效果看似很简单,其实暗藏玄机。本文总结了CSS实现水平和垂直居中的方法。大致有以下几种。本文将一一介绍。我把这篇文章整理成一个github仓库。欢迎大家star。absolute+negativemarginabsolute+marginautoabsolute+calc只适用于固定宽高居中的元素absolute+transformlineheight为固定宽高absolute+transformlineheightwriting-modetablecss-tableflexgridabsolute+negativemargin以此来实现上面的效果,我们先做一些准备工作,假设HTML代码如下,一共有两个元素,父元素和子元素123123

wp是父元素的类名,box是子元素的类名,因为固定宽度和可变宽度是有区别的,size是用来表示指定宽度的,下面是所有效果使用的通用代码,主要是设置颜色和宽高注意:此通用代码后面不再赘述,只会给出相应的提示/*publiccode*/.wp{border:1pxsolidred;width:300px;height:300px;}.box{background:green;}.box.size{width:100px;height:100px;}/*常用代码*/绝对定位的百分比是相对于父元素的宽高。该特性允许子元素居中显示,但绝对定位是基于子元素的左上角。想要的效果是子元素的中心居中表明为了纠正这个问题,可以使用外边距的负值。负外边距可以将元素定位在相反的方向。通过将子元素的外边距指定为子元素宽度的一半的负值,可以使子元素居中。css代码如下50%;left:50%;margin-left:-50px;margin-top:-50px;}这是我比较常用的方法。这种方式比较容易理解,兼容性好。缺点是需要知道子元素的宽高点击查看完整DEMOabsolute+marginauto这种方法也需要固定居中元素的宽高,HTML代码如下123123
这样每个方向的距离都设置为0,此时如果margin设置为auto,就可以全方位居中/*这里引用上面的公开代码*//*这里引用上面的公开代码*//*定位代码*/.wp{position:relative;}.box{position:absolute;;top:0;left:0;right:0;bottom:0;margin:auto;}这个方法也很兼容,但是缺点是需要知道子元素的宽高,点击查看完整DEMOabsolute+calc该方法还要求居中元素的宽高必须固定,所以我们给盒子添加一个sizeclass,HTML代码如下123123感谢css3带来了calculated属性,由于top的百分比是基于元素的左上角,那么只要减去一半的width,代码如下/*参考上面common代码在这里*//*参考上面常用代码在这里*//*定位代码*/.wp{position:relative;}.box{position:absolute;;top:calc(50%-50px);left:calc(50%-50px);}这种方式的兼容性取决于calc的兼容性,缺点是需要知道子元素的宽高点击查看完整DEMOAbsolute+transform依然是绝对定位,但是这种方式不需要固定子元素的宽度和高度,因此不再需要尺寸类。HTML代码如下123123解决绝对定位问题,也可以使用css3的新transform,translatetransform的属性还可以设置一个百分比,这个百分比是相对于自身的宽高的,所以可以设置translate为-50%,就可以居中了,代码如下/*这里参考上面的公开代码*//*这里引用上面的公共代码*//*定位代码*/.wp{position:relative;}.box{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);}该方法兼容性取决于translate2dCompatibility点击查看完整DEMOlineheight也可以通过行内元素的居中属性实现水平和垂直居中。HTML代码如下123123设置box为Inline元素可以通过text-align水平居中,但是很多同学可能不知道那vertical-align也可以在垂直方向居中。代码如下/*这里引用上面的公开代码*//*这里引用上面的公开代码*//*定位代码*/.wp{line-height:300px;text-align:center;font-size:0px;}.box{font-size:16px;display:inline-block;vertical-align:middle;line-height:initial;text-align:left;/*修改文字*/}该方法需要重新设置子元素中的文本显示达到预期效果。点击查看完整DEMOwriting-Mode想必很多同学跟我一样不知道writing-mode属性。感谢张新旭老师的反馈。简单来说,writing-mode可以改变文字的显示方向。例如,你可以使用writing-mode让文字显示垂直。horizo??ntaldirectionverticaldirection.div2{writing-mode:vertical-lr;}显示效果如下:水平方向和垂直方向更加惊人。direction的css属性会变成垂直方向的属性,比如text-align,水平和垂直方向的居中可以通过writing-mode和text-align来实现,但是有点麻烦123123/*这里引用上面的公开代码*//*这里引用上面的公开代码*//*定位代码*/.wp{writing-mode:vertical-lr;text-align:center;}.wp-inner{writing-mode:horizo??ntal-tb;display:inline-block;text-align:center;width:100%;}.box{display:inline-block;margin:auto;text-align:left;}这种方法实现和理解起来有点复杂。单击以查看完整的演示表。页面布局,现在没人做,但是表格也可以实现水平和垂直居中,但是会增加很多冗余代码123123
tabel单元格中的内容自然垂直居中,只需添加水平居中属性即可。wp{text-align:center;}.box{display:inline-block;}这种方法是代码过于冗余,不是table的正确用法。点击查看完整DEMOcss-tablecss新增的table属性可以让我们把普通元素变成table元素实际效果,通过这个特性还可以实现水平和垂直居中123123下面通过css属性,可以让div和表格一样显示。wp{display:table-cell;text-align:center;vertical-align:middle;}.box{display:inline-block;}这个方法和table原理一样,但是没有那么多冗余代码,兼容性也不错。点击查看完整DEMOflexflex是一款颠覆以往经验的现代布局解决方案,仅需几行代码即可优雅实现水平和垂直居中123123.wp{display:flex;justify-content:center;align-items:center;}目前移动端可以使用flex,PC端需要检查自身业务的兼容性。单击以查看完整的DEMOgrid。感谢@一组姐提供的解决方案,一个新的css网站Grid布局,因为兼容性不是很好,一直没怎么关注,水平和垂直居中也可以通过grid.wp{显示:flex;调整内容:中心;对齐项目:中心;}.wp{显示:网格;}.box{align-self:center;justify-self:center;}代码量也很少,但是兼容性不如flex,不推荐使用。单击以查看完整的DEMO摘要,并比较下面每种方法的优缺点。是时候让一位同学告诉你怎么写汉字了。简单总结就是PC端有兼容性需求,宽高是固定的。推荐绝对+负边距。要求,推荐使用flex。移动端建议使用Flex。Tips:关于flex兼容性解决方案,请看这里《移动端flex布局实战》方法CenteringelementsFixedwidthandheightFixedPCcompatibilityMobilecompatibilityabsolute+negativemarginisie6+,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-mode无ie6+,chrome4+,firefox3.5+Android2.3+,iOS5.1+lineheight无ie6+,chrome4+,firefox2+Android2.3+,iOS6+table无ie6+,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关注不够。这其实是不正确的。比如下面这几个简单的问题,好多同学都看不懂,我也无语了123123.red{color:red}.blue{color:blue}问的是两个div的颜色,但是只有40%的同学能答对,而这40%的同学很多都不知道为什么。希望这些同学能够好好学习CSS的基础知识。这里推荐几本CSS书籍给你。*CSS3简介)CSSWorld(CSSAdvanced)CSS揭秘(CSSExpert)喜欢看网络资料的同学,可以看看MDN上的这篇CSS入门教程。强烈推荐。英语好的同学推荐阅读英文原版链接:http://yanhaijing.com/css/2018/01/17/horizo??ntal-vertical-center/