CSS實現元素水平垂直居中—喜歡對稱美,這病沒得治

来源:http://www.cnblogs.com/star91/archive/2016/07/31/5723802.html
-Advertisement-
Play Games

[TOC] 在CSS中對元素進行 水平居中 是非常簡單的:如果它是一個行內元素,就對它的父元素應用 ;如果它是一個塊級元素,就對它自身應用 。然而要對一個元素進行垂直居中,就有點束手無策了,本文介紹了幾種常用的垂直居中方法以供參考! 一、表格佈局法 利用表格的vertical align屬性,當然首 ...


[TOC]
在CSS中對元素進行水平居中是非常簡單的:如果它是一個行內元素,就對它的父元素應用text-align:center;如果它是一個塊級元素,就對它自身應用margin:auto。然而要對一個元素進行垂直居中,就有點束手無策了,本文介紹了幾種常用的垂直居中方法以供參考!

一、表格佈局法

利用表格的vertical-align屬性,當然首先將顯示方式設置為表格,如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">

        .wrap{
            display:table;
            width: 400px;
            height: 200px;
            border: 1px solid red;
        }
        .cell{            
            display:table-cell;
            /*讓其內容也水平居中*/
            text-align: center;
            vertical-align:middle;
        }
        .content{
            border: 1px solid green;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="cell">
            <div class="content">
                看,我又居中沒?
            </div>
        </div>
    </div>
    
</body>
</html>

這種方法需要在要居中的元素外層再添加一層包裹,如上面的.cell,好處是不用知道需要居中的元素是什麼東西,比如上面的.content標簽,在css中未對其位置進行任何設置。

二、基於行內塊的解決方案(來自於第二篇參考文獻)

這種方法確實講究技巧,在實際實施中估計也不常用,但還是有必要介紹一下。具體思路是在包裹元素內設置一個“ghost”元素,使其高度為包裹元素的100%,然後同時設置“ghost”元素和居中元素vertical-align:middle.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .wrap{
            width: 400px;
            height: 200px;
            border: 1px solid red;
            text-align: center;
        }
        .wrap:before{
            content: '';
            display: inline-block;
            height: 100%;
            vertical-align: middle;
        }
        .content{
            display: inline-block;
            vertical-align: middle;
            width: 150px;
            height: 50px;
            border: 1px solid green;
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="content">
            看,我居中沒?
        </div>    
    </div>    
</body>
</html>

三、基於絕對定位的解決方案

1.絕對定位+負的外邊距
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .wrap{
            position: relative;
            width: 400px;
            height: 200px;
            border: 1px solid red;
        }
        .content{
            position: absolute;
            top: 50%;
            left: 50%;
            width: 100px;
            height: 50px;
            margin-top: -25px;
            margin-left: -50px;
            border: 1px solid green;
        }

    </style>
</head>
<body>
    <div class="wrap">
        <div class="content">
            看,我居中沒?
        </div>    
    </div>    
</body>
</html>

使用這種方法要求居中的元素具有固定的寬度和高度。

上面的方法本質上做了這樣幾件事情:先把要居中的元素的左上角放在已定位祖先元素的正中心,然後再利用負外邊距把它向左、向上移動(移動距離相當於自身寬高的一半),從而把元素的正中心放置在祖先元素的正中心。藉助CSS3中強大的calc()函數(當然實際實施過程中要考慮瀏覽器的相容性),.content的樣式還可以設置成:

<style type="text/css">
        .wrap{
            position: relative;
            width: 400px;
            height: 200px;
            border: 1px solid red;
        }
        .content{
            position: absolute;
            top: calc(50% - 25px);
            left: calc(50% - 50px);
            width: 100px;
            height: 50px;
            border: 1px solid green;
        }

    </style>

註意:表達式中有“+”和“-”時,其前後必須要有空格,如"widht: calc(12%+5em)"這種沒有空格的寫法是錯誤的calc函數的具體用法可以參考:
CSS3的calc()使用

2.絕對定位+margin:auto

實現原理:利用css定位規則,設置左右、上下方向定位為0,margin為auto,讓css根據定位計算margin值,用hack的方式實現居中。居中塊的尺寸需要固定。

寸需要可控

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .wrap{
            position: relative;
            width: 400px;
            height: 200px;
            border: 1px solid red;
        }
        .content{
            position: absolute;
            width: 150px;
            height: 50px;
            margin: auto;
            top:0;left: 0;bottom: 0;right: 0;
            border: 1px solid green;        
        }

    </style>
</head>
<body>
    <div class="wrap">
        <div class="content">
            看,我居中沒?
        </div>    
    </div>    
</body>
</html>

上面提到的兩種絕對定位的方案最大的局限就是它要求元素的寬度和高度固定。下麵介紹的第三種基於絕對定位的方案則不會出現這個問題,對於需要居中的元素寬高是否固定沒有硬性要求,這樣居中元素的尺寸就由其內容確定了。

3.絕對定位+transform反向偏移

還是上面的例子將內部元素的設置負的外邊距的那兩句改成

<style type="text/css">
        .wrap{
            position: relative;
            width: 400px;
            height: 200px;
            border: 1px solid red;
        }
        .content{
            position: absolute;
            top: 50%;
            left:50% ;
            border: 1px solid green;
            transform: translate(-50%,-50%);
        }

    </style>

使用這種方法對於居中元素寬高沒有要求的原因是在translate()變形函數中使用百分比時,是以這個元素本身的寬度和高度為基準進行換算和移動的。

當然了,使用基於絕對定位的方法一定要先知道你要居中的對象是哪一個,這樣才能對其設置絕對定位,這是與表格佈局法明顯不同的地方。

四、基於視口單位的解決方案(僅適用於基於視口的居中)

假如不想使用絕對定位,仍然可以採用translate()技巧來讓元素以其自身寬高一半進行偏移,但是如果使用絕對定位,也就無法使用left和top使元素左上角位於容器正中心。
我們的第一反應很可能是用margin屬性的百分比來實現。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">    
        .content{
            border: 1px solid green;
            margin: 50% auto 0;
            transform: translateY(-50%);
        }
    </style>
</head>
<body>
    <div class="content">
        看,我居中沒?
    </div>    
</body>
</html>

實際上的結果卻如上圖所示,元素到了視口的下方。原因在於margin的百分比是以父元素的寬度作為基準的。在《CSS揭秘》這本大作中提到了一種方法可以正確使元素基於視口居中,該方法採用視口單位vh作為長度單位。1vh表示視口單位的1%。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">    
        .content{
            border: 1px solid green;
            width: 150px;
            margin: 50vh auto 0;
            transform: translateY(-50%);
        }
    </style>
</head>
<body>
    <div class="content">
        看,我居中沒?
    </div>    
</body>
</html>

五、基於使用css3彈性佈局(Flexbox)的解決方案

css3的伸縮盒佈局簡直是一切佈局的救星,遺憾的是,很多老瀏覽器不支持,哎哎哎哎!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .wrap{
            display: flex;
            width: 400px;
            height: 200px;
            border: 1px solid red;
        }
        .content{
            margin: auto;
            border: 1px solid green;
            
        }
    </style>
</head>
<body>
    <div class="wrap">
        <div class="content">
            看,我居中沒?
        </div>    
    </div>    
</body>
</html>

想讓.content居中就是這麼簡單,使包裹元素display: flex;要居中的元素margin: auto;這樣水平和垂直方向都居中了,而且對於居中元素的寬高也沒有要求。

Flexbox還有另一個好處在於,它可以在不知道需要居中的元素是什麼的情況下使居中元素居中,就像方法一的效果一樣,具體實現是藉助:align-items和justify-content仍然用上面的例子.

<style type="text/css">
        .wrap{
            display: flex;
            align-items: center;
            justify-content: center;
            width: 400px;
            height: 200px;
            border: 1px solid red;
        }
        .content{
            border: 1px solid green;        
        }
    </style>

實現效果相同。

五、單行文本時的居中

可以利用line-height屬性與元素高度相同

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .content{        
            width: 150px;
            height: 100px;
            line-height: 100px;
            text-align: center;
            border: 1px solid green;        
        }

    </style>
</head>
<body>    
    <div class="content">
        看,我居中沒?
    </div>    
</body>
</html>

參考:
CSS揭秘(英文原版:CSS Secrets)
Centering in the Unknown


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

-Advertisement-
Play Games
更多相關文章
  • 本人是一名.net程式員..... 你一個.net coder 看什麼jQuery 源碼啊? 原因嗎,很簡單。技多不壓身嗎(麻蛋,前端工作好高...羡慕)。 我一直都很喜歡JavaScript,廢話不多說了,直接切入正題。 最近看了好幾篇jQuery 源碼的文章,對於jQuery的無new構建 很是 ...
  • JS對象的比較 由於JS是解釋執行的語言,那麼代碼中出現函數與對象如果重覆執行,會創建多個副本 在開發中會引入各種框架和庫,自定義的成員越多,出現命名衝突的幾率越大 在開發中會有多個構造函數,,每一個構造函數有很多方法,就會變得不容易維護 原型相關的概念 關於面向對象的概念 類 class 在js中 ...
  • HTML簡介 HyperText Markup Language:超文本標記語言 HyperText:超文本(文本 + 圖片 + 視頻 + 音頻 + 鏈接) Markup Language:標記語言 網站的三大元素 圖片,超鏈接,文字 HTML基本結構 標準網頁的HTML標簽 1.HTML文檔聲明: ...
  • 1、表單驗證<form></form> (1).非空驗證(去空格) (2).對比驗證(跟一個值對比) (3).範圍驗證(根據一個範圍進行判斷) (4).固定格式驗證:電話號碼,身份證號,郵箱,信用卡號等的驗證;需要用到正則表達式來進行驗證。 (5).其它驗證 2、正則表達式 用符號來描述書寫規則:/ ...
  • 1.無序列表 HTML <ul> 元素代表多項的無序列表,即無數值排序項的集合,且它們在列表中的順序是沒有意義的。通常情況下,無序列表項的頭部可以是幾種形式,如一個點,一個圓形或方形。通過設置<ul>元素的type屬性來改變無序列表頭部的形式。 無序列表和有序列表都使用<li>標簽來定義單列。 2. ...
  • DOM 操作 訪問與樹關係(節點) 訪問父節點: parentNode 訪問上一個兄弟節點: previousSibling 訪問下一個兄弟節點: nextSibling 訪問第一個屬性節點: attributes[ 1 ] 訪問第一個子節點:fristChild 或 childNodes[ 0 ] ...
  • /*! jQuery v1.8.3 jquery.com | jquery.org/license */ (function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}fun ...
  • 代碼: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...