亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > CSS > 正文

CSS實現元素居中原理解析

2024-07-11 08:59:32
字體:
來源:轉載
供稿:網友

在 CSS 中要設置元素水平垂直居中是一個非常常見的需求了。但就是這樣一個從理論上來看似乎實現起來極其簡單的,在實踐中,它往往難住了很多人。

讓元素水平居中相對比較簡單:如果它是一個行內元素,就對它的父元素應用 text-align: center;如果它是一個塊級元素,就對它自身應用 margin: auto。

然而如果要對一個元素進行垂直居中,那就沒有那么容易了,有時候光是想想就令人頭皮發麻了。

本文分別從行內元素和塊級元素進行說明,將目前比較流行的實現方式進行匯集并解析實現原理,方便大家查閱。這里要說明一點,每一種方式都不是十全十美的,關鍵要看自己的需求,從而分析出哪種實現方式是最合適的。

行內元素

首先我們先把基礎代碼寫出來:

<div class="main">    <span class="content">我是要居中的行內元素span</span></div>
.main {    width: 300px;    height: 300px;    background-color: #50ba8b;}.content {    background-color: #5b4d4e;    color: #FFFFFF;}

class 為 .main 的 div 包裹這一個 class 為 .content 的行內元素 span,我們的目的就是要讓 .content 元素 在 .main 元素中居中。

水平居中

text-align

行內元素的水平居中比較簡單,我們直接在 .main 中添加 text-align: center; 即可,此時 .main 變為:

.main {    width: 300px;    height: 300px;    background-color: #50ba8b;        text-align: center;  /* 水平居中 */}

實現原理: 設置 text-align 的值為 center ,因為該屬性規定元素中的文本的水平對齊方式,那么設置為 center 則文本就水平居中了。

垂直居中

line-height

行內元素的垂直居中我們分為 一行 和 多行或者圖片等替換元素 來說明。

如果是 一行,那么我們可以使用 line-height 來實現,此時 .main 元素 css 代碼變為:

.main {    width: 300px;    height: 300px; /* 可以不設置 */    background-color: #50ba8b;    line-height: 300px; /* 垂直居中 */}

其實設置了 line-height 就可以讓文本垂直居中,并不需要同時設置 height,這里也是一直存在的一個誤區。

實現原理: 這種方式實現垂直居中運用的是 CSS 中“行距的上下等分機制”,這也說明了為什么該方式只適用于 一行 的文本。

還有一點需要說明是,這種方式實現的垂直居中是“近似”的,并不是完美的垂直居中,因為文字字形的垂直中線位置普遍要比真正的“行框盒子”的垂直中線位置低,而由于我們平時使用的 font-size 比較小,使得這點偏差不容易察覺出來,那么感官上也就看成是垂直居中了。

line-height 及 vertical-align

下面再來說說 多行或者圖片等替換元素 的垂直居中效果實現,這里我們需要同時借助 line-height 和 vertical-align 來實現。

先讓文本換行:

<div class="main">    <span class="content">        我是要居中的行內元素span <br>        我是要居中的行內元素span    </span></div>

再看修改之后的 css 代碼:

.main {    width: 300px;    background-color: #50ba8b;    line-height: 300px;}.content {    display: inline-block;    background-color: #5b4d4e;    color: #FFFFFF;    line-height: 20px;    margin: 0 20px;    vertical-align: middle;}

實現原理:

  • 設置 .content 元素的 display 為 inline-block。作用在于既能重置外部的 line-height 為正常大小,又能保持行內元素特性,從而可以設置 vertical-align 屬性,以及產生一個非常關鍵的“行框盒子”。我們需要的其實并不是這個“行框盒子”,而是每個“行框盒子”都會附帶的一個產物 —— “幽靈空白節點”,即一個寬度為 0,表現如同普通字符的看不見的“節點”。有了這個“幽靈空白節點”,我們的 line-height: 300px; 就有了作用的對象,從而相當于在 .content 元素前面撐起了一個高度為 300px 的寬度為 0 的行內元素。
  • 因為行內元素默認都是基線對齊的,所以我們通過對 .content 元素設置 vertical-align: middle; 來調整多行文本的垂直位置,從而實現我們想要的“垂直居中”效果。這種方式也適用于 圖片等替換元素 的垂直居中效果。當然這里的“垂直居中”也是近似的,這是由于 vertical-align 導致的,具體為什么可以深入了解 vertical-align: middle;。

塊級元素

依然先把基礎代碼寫出來:

<div class="main">    <div class="content">我是要居中的塊級元素div</div></div>
.main {    width: 300px;    height: 300px;    background-color: #50ba8b;}.content {    width: 150px;    height: 150px;    background-color: #5b4d4e;}

class 為 .main 的 div 包裹這一個 class 為 .content 的 塊級元素 div,我們的目的就是要讓 .content 元素 在 .main 元素中居中。

position + margin: auto

實現代碼如下:

.main {    width: 300px;    height: 300px;    background-color: #50ba8b;        /*關鍵代碼*/    position: relative;}.content {    width: 150px;    height: 150px;    background-color: #5b4d4e;    /*關鍵代碼*/    position: absolute;    top: 0;    left: 0;    bottom: 0;    right: 0;    margin: auto;}

實現原理:

  1. 設置 .main 元素為相對定位 position: relative;,這樣其子元素設置絕對定位時就相對它了。
  2. 然后設置 .content 元素為絕對定位 position: absolute; 并設置它的 top、left、bottom、right 都為0,這樣該元素的元素的尺寸表現為“格式化寬度和格式化高度”,和 <div> 的“正常流寬度”一樣,同屬于外部尺寸,也就是尺寸自動填充父級元素的可用尺寸,但由于此時我們設置了 .content 元素的寬高,就限制了元素自動填充,這樣就多出來150px的空間了。
  3. 最后我們設置 .content 元素為 margin: auto; ,此時根據 auto 的計算規則,將上下左右剩余空間全部等分了,自然就居中了。

position + margin-left/top

實現代碼如下:

.main {    width: 300px;    height: 300px;    background-color: #50ba8b;        /*關鍵代碼*/    position: relative;}.content {    width: 150px;    height: 150px;    background-color: #5b4d4e;    /*關鍵代碼*/    position: absolute;    top: 50%;    left: 50%;    margin-left: -75px;    margin-top: -75px;}

實現原理:

  1. 設置 .main 元素為相對定位 position: relative;,這樣其子元素設置絕對定位時就相對它了。
  2. 然后設置 .content 元素為絕對定位 position: absolute; 并設置 top: 50%;、left: 50%;,這樣.content 元素的左上角就位于 .main 元素的中心了。
  3. 最后設置 .content 元素 margin-left: -75px;、margin-top: -75px; 將自身左移及上移寬高的一半,這樣 .content 元素的中心處于 .main 元素的中心處,自然就實現了居中效果。
  4. 這種方法的缺點就是需要固定 .content 元素的寬高。

position + translate

實現代碼如下:

.main {    width: 300px;    height: 300px;    background-color: #50ba8b;        /*關鍵代碼*/    position: relative;}.content {    width: 150px;    height: 150px;    background-color: #5b4d4e;    /*關鍵代碼*/    position: absolute;    top: 50%;    left: 50%;    transform: translate(-50%, -50%);}

實現原理:

  1. 設置 .main 元素為相對定位 position: relative;,這樣其子元素設置絕對定位時就相對它了。
  2. 然后設置 .content 元素為絕對定位 position: absolute; 并設置 top: 50%;、left: 50%;,這樣.content 元素的左上角就位于 .main 元素的中心了。
  3. 最后設置 .content 元素 transform: translate(-50%, -50%); 將自身左移及上移寬高的一半,這樣 .content 元素的中心處于 .main 元素的中心處,自然就實現了居中效果。
  4. 這種方法的好處就是不需要固定 .content 元素的寬高。

Flexbox

實現代碼如下:

.main {    width: 300px;    height: 300px;    background-color: #50ba8b;    /*關鍵代碼*/    display: flex;}.content {    width: 150px;    height: 150px;    background-color: #5b4d4e;    /*關鍵代碼*/    margin: auto;}

實現原理:

  • 設置 .main 元素 display: flex;。
  • 然后設置 .content 元素為 margin: auto; 即可實現居中。
  • 這是毋庸置疑的最佳解決方案,我們不需要設置 .content 元素為絕對定位,margin: auto 自然就可以作用于寬高,而且我們也不需要設置 .content 元素的寬高, 因為Flexbox(伸縮盒)是專門針對這類需求所設計的。
  • 缺點就是目前瀏覽器支持程度相對其它方式會低些。

Flexbox 的另一個好處在于,它還可以將匿名容器(即沒有被標簽包裹的文本節點)垂直居中。比如我們不設置 .main 元素為 display: flex;,而是設置 .content 元素為 display: flex;,并借助 Flexbox 規范所引入的 align-items 和 justify-content 屬性,我們可以讓它內部的文本也實現居中(我們可以對.main 元素使用相同的屬性來使 .content 元素元素居中,但比 margin: auto 方法要更加優雅一些,并且同時起到了回退的作用)。

.content {    width: 150px;    height: 150px;    background-color: #5b4d4e;    /*關鍵代碼*/    display: flex;    align-items: center;    justify-content: center;    margin: auto;}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩久久久久| 国产成人在线一区| 国产精品久久久久久久久久久不卡| 91精品视频在线免费观看| 疯狂蹂躏欧美一区二区精品| 日韩视频在线一区| 国产中文欧美精品| 亚洲视频综合网| 91美女片黄在线观| 国产精品美女久久久久av超清| 国产69精品99久久久久久宅男| 青青草国产精品一区二区| 91国内免费在线视频| 亚洲乱亚洲乱妇无码| 欧美激情免费观看| 久久影院模特热| 亚洲精品视频二区| 国产欧美久久一区二区| 国产成人精品午夜| 国产精品91视频| 成人精品一区二区三区电影免费| www.国产精品一二区| 日韩中文字幕在线看| 欧美巨乳美女视频| 日韩高清电影免费观看完整版| 2024亚洲男人天堂| 九九久久综合网站| 成人免费xxxxx在线观看| 91国产一区在线| 91国在线精品国内播放| 亚洲欧美中文日韩v在线观看| 国产欧美一区二区三区久久人妖| 国产午夜精品免费一区二区三区| 国内精品在线一区| 色偷偷偷综合中文字幕;dd| 精品久久久久久久久久久| 欧美视频裸体精品| 91精品久久久久久久久青青| 国产精品国模在线| 国产剧情久久久久久| 自拍偷拍免费精品| 欧美视频精品一区| 日韩成人av网| 亚洲人午夜色婷婷| 久久99精品久久久久久青青91| 国产精品99导航| 欧美电影第一页| 久久久噜噜噜久久| 欧美日本高清视频| 欧美一级视频在线观看| 51久久精品夜色国产麻豆| 欧美日韩国产一区二区| 亚洲黄页视频免费观看| 精品久久久久久久久久久久久| 最新91在线视频| 欧美日韩在线视频首页| 日韩资源在线观看| 91成人免费观看网站| 午夜精品一区二区三区在线| 狠狠躁夜夜躁人人爽超碰91| 日韩精品在线免费观看| 91精品国产91久久久久久吃药| 国产精品稀缺呦系列在线| 亚洲精品久久久久久久久久久久久| 精品视频偷偷看在线观看| 欧美精品一区二区三区国产精品| 日韩电影大全免费观看2023年上| 欧美性一区二区三区| 热re99久久精品国产66热| 欧美精品日韩三级| 中文字幕在线亚洲| 亚洲国产女人aaa毛片在线| 97av在线影院| 亚洲人成免费电影| 国产一区二区美女视频| 欧美性20hd另类| 亚洲天堂久久av| 91亚洲精品在线观看| 91大神在线播放精品| 91经典在线视频| 亚洲男人天堂2023| 懂色aⅴ精品一区二区三区蜜月| 欧美极品少妇与黑人| 亚洲图片欧美日产| 久久精品成人欧美大片古装| 精品视频中文字幕| 欧美另类极品videosbest最新版本| 日韩经典中文字幕在线观看| 国产亚洲精品久久久久动| 久久久国产精品免费| 97久久久免费福利网址| 中文字幕日韩精品有码视频| 国产一区私人高清影院| 欧美性极品xxxx娇小| 伊人亚洲福利一区二区三区| 国产在线观看精品一区二区三区| 在线播放亚洲激情| 久久在线观看视频| 国产成人在线亚洲欧美| 国产精品欧美日韩| 91成人在线观看国产| 亚洲精品中文字幕有码专区| 久久精品国产96久久久香蕉| 久久99精品视频一区97| 亚洲美女福利视频网站| 欧洲成人午夜免费大片| 欧美高清视频在线播放| 91极品视频在线| 北条麻妃在线一区二区| 日韩精品免费综合视频在线播放| 久久久人成影片一区二区三区观看| 日韩av在线网址| 尤物九九久久国产精品的分类| 丝袜亚洲另类欧美重口| 92版电视剧仙鹤神针在线观看| 欧美色图在线视频| 欧美体内谢she精2性欧美| 日韩免费电影在线观看| 性欧美暴力猛交69hd| 成人激情视频小说免费下载| 国产视频久久久| 国产精品丝袜久久久久久不卡| 国内精品国产三级国产在线专| 国产精品九九久久久久久久| 欧美国产日韩中文字幕在线| 中文字幕免费精品一区| 欧美夫妻性生活xx| 亚洲精品福利在线观看| 日韩高清免费在线| 久久艳片www.17c.com| 自拍偷拍亚洲在线| 精品中文字幕久久久久久| 欧美日韩国产色| 一区二区在线视频| 青青草精品毛片| 日韩av免费在线播放| 国产香蕉精品视频一区二区三区| 亚洲午夜国产成人av电影男同| 亚洲深夜福利在线| 亚洲一级黄色片| 欧日韩不卡在线视频| 81精品国产乱码久久久久久| 中文精品99久久国产香蕉| 日韩成人在线免费观看| 精品久久久久久久中文字幕| 国产精品国产三级国产专播精品人| 日韩成人中文字幕| 亚洲美女动态图120秒| 精品中文字幕在线2019| 欧洲成人在线观看| 欧美性受xxxx白人性爽| 欧美日韩一区二区在线播放| 亚洲美女又黄又爽在线观看| 国产91精品久久久久| 亚洲美女福利视频网站| 在线观看日韩专区| 国内精品视频久久| 欧美亚洲另类视频| 国产精品久在线观看| 久久久www成人免费精品| 久久影视电视剧凤归四时歌| 青青在线视频一区二区三区| 一区二区三区四区精品| 国产精品av电影|