我:CSS垂直居中還有什麼另類方法?求職者:不太瞭解了

来源:https://www.cnblogs.com/coderhf/archive/2020/07/08/13267227.html
-Advertisement-
Play Games

今天面試了一個前端實習生,我問了一個比較簡單的問題,就是css如何實現元素垂直居中的問題,但是要說出多種方案。其實他說的不錯,基本上說到了flex佈局,grid佈局等下麵提到的佈局。還不錯,但是這幾種都是已經經常用的,老生常談,但是我想聽到他說一種用的比較少的解決方案,瞭解一下他學習的深度和廣度。但 ...


今天面試了一個前端實習生,我問了一個比較簡單的問題,就是css如何實現元素垂直居中的問題,但是要說出多種方案。其實他說的不錯,基本上說到了flex佈局,grid佈局等下麵提到的佈局。還不錯,但是這幾種都是已經經常用的,老生常談,但是我想聽到他說一種用的比較少的解決方案,瞭解一下他學習的深度和廣度。但是很遺憾他沒有說出來。

今天就給大家講一講這個解決方案吧

眾所周知,“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

  • 父元素基線的位置可改變

只要理解了原理,我們就不用死記硬背代碼,也不會忘記如何實現;文中如有錯誤,歡迎指正~

對於垂直居中這種常見問題,哪種方案是你的最愛呢,歡迎留言討論~

 

對了,小編為大家準備了一套2020最新的web前端資料,需要點擊下方鏈接獲取方式

學習前端,你掌握這些。二線也能輕鬆拿8K以上

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我是風箏,公眾號「古時的風箏」。 文章會收錄在 JavaNewBee 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裡面。 沒別的意思,今天就是為了給你推薦幾款 MySQL 客戶端,這幾款客戶端有一個共通點,那就是好用而且免費。 “害,我看也就是平平無奇嘛!” 然後,轉身趕緊下載體驗一下 ...
  • 本文更新於2019-09-22,使用MySQL 5.7,操作系統為Deepin 15.4。 鎖 鎖概述 MyISAM和MEMORY存儲引擎使用表級鎖。BDB存儲引擎進使用頁級鎖,但也支持表級鎖。InnoDB存儲引擎預設使用行級鎖,也支持表級鎖。 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生 ...
  • 腳本文件是utf-8,mysql資料庫utf-8; 運行mysql文件,在navicat打開,中文註釋亂碼 解決方法如下: 5.5和5.6版本修複中文亂碼後,運行mysql刪除腳本,資料庫存在遺漏的數據表 (遺漏數據表中存在主外鍵關係) 1.查詢資料庫的編碼格式 show variables lik ...
  • 教程 Flutter 和桌面應用的最新進展 譯】Flutter vs React Native vs Native:深度性能比較 Flutter 中的圖文混排與原理解析 告別 Flutter Channel,調用 Native API 僅需一行代碼! Flutter 核心原理與混合開發模式 我們用 ...
  • AJAX Asynchronous Javascript And XML"(非同步 JavaScript 和 XML),是指一種創建互動式網頁應用的網頁開發技術。通過在後臺與伺服器進行少量數據交換,Ajax 可以使網頁實現非同步更新。意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。傳統的 ...
  • ​互聯網的高速發展促使互聯網企業對於網站等頁面的用戶體驗要求也越來越高,導致網站開發難度越來越大,於是一個新興職業應運而生——web前端工程師。因為互聯網時代的高速發展,公司企業的迫切需求web前端工程師,web人才成為各大公司名企爭搶的“香餑餑”。 ...
  • 簡介 http-server是一個簡單的零配置命令行http伺服器。 它足夠強大,足以用於生產用途,但它既簡單又易於破解,可用於測試,本地開發和學習 應用場景 1、區域網訪問靜態頁面 訪問本地電腦中的文件都是基於file協議,如果要開放我們的本地文件給區域網人員訪問,是不能使用file協議。得用h ...
  • 今天為什麼要給大家講解這個東西呢,因為css這部分,尤其是數值這部分感覺非常簡單,但是尤其是簡單的,卻很多人根本就沒有弄懂。所以今天就來講一下css的數值問題吧。大家還是好好聽一下吧。 width height 百分比 當元素的height、width設置為百分比時,分別基於包含它的塊級對象的高度、 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...