我: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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...