本文主要是介绍css揭秘--笔记--垂直居中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
css揭秘第40个小技巧
整篇文章所使用的的结构代码如下:
<main><h1>an i center yet </h1><p>center me !please</p>
<main>
1 基于绝对定位的解决方案
main{
position:absolete;
top:50%;
left:50%;
height:6em;
width:18em;
margin-top:-3em;
margin-left:-9em;
}
这段代码所做的事情相信有css基础的同学都了解,这里不做过多的解释。在网上就能找到这种解决方案。用calc()函数还能再优化一下
main{
position:absolete;
top:calc(50%-3em);
left:calc(50%-9em);
height:6em;
width:18em;
}
现在我们实现了垂直居中的效果,但是这种实现方式有一个很明显的缺点事宽度和高度是固定的,有时候和我们的需求冲突,所以我们需要再优化一下,要能适配不同内容。
main{
position:absolete;
top:50%;
left:50%;
height:6em;
width:18em;
transform:translate(50%,50%);
}
原理: margin的百分比是以其父元素的尺寸为基准进行解析的,
translate变形函数是以其自身的宽度和高度进行转换的。
现在我们完美的实现了垂直居中
上面这个方法有一些地方需要注意的
1. 我们有时不能使用绝对定义,因为它对整个布局的影响太强烈
2. 如果需要居中的元素在高度上超过了视口,那么他的顶部会被视口剪切掉
3. 3在某些浏览器上,这个方法可能会导致元素的显示有一些模糊,因为元素可能会放置在半个像素上面,这个问题可以用transform-style:preserve-3d来修复。
2基于视口单位的解决方案
main{
width:18em;
height:6em;
margin:50vh auto 0;
transform:translate(50%);
}
vh是css3定义的一套新的单位,称为视口相关的长度单位。有兴趣的同学可以自行上网搜索学习。
这个技巧的实用性相当有限,因为他只适用于视口相关的情况下。
3基于FlexBox的解决方案
这无疑是最好的解决办法了,因为flexbox是专门为这类需求设计的,我们只需为父元素设置display:flex;再给这个元素自身设置margin:auto;
body{
display:flex;
}
main{
margin:auto;
}
当我们适用flexbox时,margin:auto;不仅在水平方向居中,垂直方向也是一样,还有一点,我们甚至不需要制定任何的宽度,这个居中元素非配的宽度等于max-content。
有不知道max-content的同学可以看 张鑫旭写的文章,里面详细的介绍了max-content,min-content等属性
http://www.zhangxinxu.com/wordpress/2016/05/css3-width-max-contnet-min-content-fit-content/
这篇关于css揭秘--笔记--垂直居中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!