CSS垂直居中的另类实现代码详解(不走寻常路)

所属分类: 网页制作 / CSS 阅读数: 704
收藏 0 赞 0 分享

前言

众所周知,“css如何实现元素垂直居中?”已经是一个老生常谈的问题了,这个问题目前已经有了许多解决方案,这些方案也都有各自适用的场景以及优缺点,大致如下:

  • flex布局
  • grid布局
  • table布局
  • line-height搭配height
  • position搭配margin
  • position搭配transform
  • ...

那么今天我们就来理解其中一种有效但不常被使用的方案的原理,它就是:伪元素:before搭配vertical-align:middle实现元素垂直居中,先来看一下具体的代码实现:

<style type="text/css">
  .parent {
    display: inline-block;
    width: 300px;
    height: 300px;
    font-size: 0;
    background: #80848f;
    text-align: center;
  }
  .parent:before {
    display: inline-block;
    width: 20px;
    height: 100%;
    content: '';
    background: #ff9900;
    vertical-align: middle;
  }
  .child {
    display: inline-block;
    width: 50px;
    height: 50px;
    background: #19be6b;
    vertical-align: middle;
  }
</style>
<div class="parent">
  <div class="child">child</div>
</div>

上面的代码运行结果是这样的:

相信代码大家已经很熟悉了,但是你真正理解其中的原理吗?下面我们就看一下它是如何怎样一步步实现垂直居中的

分析

首先我们要知道一个关键知识点,那就是:父元素基线(baseline)的位置是可以改变的,它不是固定的,记住这一点很重要
接着,我们精简一下代码,去掉关键部分

<style type="text/css">
  .parent {
    display: inline-block;
    width: 300px;
    height: 300px;
    /* font-size: 0; */
    background: #80848f;
    text-align: center;
  }
  .parent:before {
    display: inline-block;
    width: 20px;
    height: 100%;
    content: '';
    background: #ff9900;
    /* vertical-align: middle; */
  }
  .child {
    display: inline-block;
    width: 50px;
    height: 50px;
    background: #19be6b;
    /* vertical-align: middle; */
  }
</style>
<div class="parent">
  <div class="child">child</div>
</div>

我们将font-size:0vertical-align:middle注释后,运行结果如下:

从图中不难看出,对于:before伪元素(以下简称伪元素)来说,加与不加vertical-align:middle,结果都是一样的,在垂直方向它始终会占满父元素;但对于.child元素情况就不同了,它在垂直方向的位置发生了改变,那么这是为什么呢?
其实伪元素在此处的作用就是为了改变(或者叫重新定义)父元素baseline的位置,我们来回顾一下vertical-align:middle在MDN文档中的定义

middle: 使元素的中部与父元素的基线加上父元素x-height的一半对齐

那么,对比我们的示例:

  • 伪元素的中部就是它垂直方向的中点,这不难理解
  • 父元素的基线我们暂且不管它在哪里,我们只要记住它是可以改变的就足够了
  • x-height的一半,因为我们在父元素中将font-size置为0,所以x-height(小写x字母的高度)的一半也是0,即没有高度

这样一下,就相当于伪元素的中点只要与父元素的基线对齐就可以了,因为x-height是0,所以加与不加无所谓;再加上Css中元素默认是左上方对齐的,对于这个限制,也就是说当伪元素加上vertical-align:middle后,默认情况下它是不会超出父元素的范围显示的,那么这时伪元素高度已确定:父元素高度的100%,中点也已确定
接下来伪元素就会对父元素说:我垂直方向的中点已经确定了,变是不可能变的,这辈子都不可能变,但我的中点想和你的基线对齐,你自己看着办吧
然后父元素妥协了,将它自身的基线移动到与伪元素中点水平对齐的位置,到此父元素基线的位置也已确定,近似其高度的一半
最后.child元素添加了自己的vertical-align:middle,按照middle: 使元素的中部与父元素的基线加上父元素x-height的一半对齐这句定义,.child元素的font-size由于继承关系也是0,所以它的中点也就自然而然与早已确定的父元素基线对齐,从而实现垂直居中,到此结束

总结

其实该种垂直居中方式的原理主要有以下几个要点:

  • Css中元素默认是左上方对齐的
  • 伪元素高度与父元素保持统一
  • 父元素将font-size置为0,进而x-height也被置为0
  • 父元素基线的位置可改变

到此这篇关于CSS垂直居中的另类实现的文章就介绍到这了,更多相关css 垂直居中内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

更多精彩内容其他人还在看

CSS入门教程:计算CSS盒模型宽和高

 出处:当我们布局一个网页的时候,经常会遇到这样的一种情况,那就是最终网页成型的宽度或是高度会超出我们预先的计算,其实就就是所谓的CSS的盒模型造成的。 #test{margin:10px;padding:10px;width:100px;height:100px;}
收藏 0 赞 0 分享

在IE流览器中正确显示PNG透明图片

  png图片有很好的品质。阴影效果也不会有杂边,很流畅。如果插入网页的话可以给网站内容增色不少!更重要的是在不增加图片容量大小的情况下提高了页面的图片的质量。对于有复杂背景,如:在有颜色过度背景上插入不规则边框的图片带来极大很便利!   但目前IE中对于插入
收藏 0 赞 0 分享

CSS教程:DIV底部放置文字

  css对文字的布局上没有靠容器底部对齐的参数,目前使用的一个不错的方法也比较好.就是用position属性来解决,看下面的代码,用position的相对和绝对定位功能也轻松的实现了,文字靠近div低部对齐,并且靠近的距离还可以精确到像素,自己可以调节,是不是很不错呢?
收藏 0 赞 0 分享

如何用CSS让文字居于div的底部

  这个问题是别人提出的,因为css对文字的布局上没有靠容器底部对齐的参数,(或许有但是我没有发现)不过目前我使用的一个不错的方法也比较好.就是用position属性来解决,看下面的代码,我用position的相对和绝对定位功能也轻松的实现了,文字靠近div低部对齐,并且靠近
收藏 0 赞 0 分享

从A页面连接到B页面后并直接把B页面的隐藏层显示

  这个效果实现的是,在B页面里有两个层,一个显示层,我们暂定名c层,一个是隐藏层,我们暂定名d层,单独进B页面的时候,c层显示,d层隐藏,然而从A页面连接到B页面的时候,则是让d层显示,c层隐藏,我觉得这个效果对网页设计者以后会有很大帮助,现在把代码发出来,
收藏 0 赞 0 分享

CSS样式表定义标签li前面样式

定义LI前面的小点样式 view plaincopy to clipboardprint? 语法: list-style-type : disc | circle | square | decimal | lower-roman | upper-roman | lowe
收藏 0 赞 0 分享

符合标准的div css制作的弹出菜单

本文介绍了五款符合标准的div css制作的弹出菜单,而且不含有js的. NO.1最基本的:二级dropdown弹出菜单 <!DOCTYPE html PUB
收藏 0 赞 0 分享

CSS实现在文章每段后面加入带连接的隐藏文字

代码主要理解3个参数:createElement、createTextNode、appendChild。这3个js参数分别是创建元素、创建字符、追加节点。代码原理:循环页面段落标签<p>,创建连接元素<a>,创建要显示的连接字符,用SetAttribute
收藏 0 赞 0 分享

CSS:浏览器特定选择器介绍

当你想在一个浏览器里改变样式而不像在其他浏览器中改变时,这些选择器很有用。 IE6以下 *html{} IE 7 以下 *:first-child html {} * html {} 只对IE 7 *:first-child html {} 只对IE 7
收藏 0 赞 0 分享

WEB标准学习,认识两种网页声明的含义

即网页标准推出来以后,我们时常会看到两种不同的网页的声明,一个是Dhtml,一个是Xhtml。如下所示: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "ht
收藏 0 赞 0 分享
查看更多