元素的水平垂直居中

一剧董、背景

在開發(fā)中經(jīng)常遇到這個(gè)問題幢尚,即讓某個(gè)元素的內(nèi)容在水平和垂直方向上都居中,內(nèi)容不僅限于文字翅楼,可能是圖片或其他元素

居中是一個(gè)非澄臼#基礎(chǔ)但又是非常重要的應(yīng)用場(chǎng)景,實(shí)現(xiàn)居中的方法存在很多毅臊,可以將這些方法分成兩個(gè)大類:

  • 居中元素(子元素)的寬高已知
  • 居中元素寬高未知

二理茎、實(shí)現(xiàn)方式

實(shí)現(xiàn)元素水平垂直居中的方式:

  • 利用定位+margin:auto

  • 利用定位+margin:負(fù)值

  • 利用定位+transform

  • table布局

  • flex布局

  • grid布局

利用定位+margin:auto

先上代碼:

<style>
    .father{
        width:500px;
        height:300px;
        border:1px solid #0a3b98;
        position: relative;
    }
    .son{
        width:100px;
        height:40px;
        background: #f0a238;
        position: absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        margin:auto;
    }
</style>
<div class="father">
    <div class="son"></div>
</div>

父級(jí)設(shè)置為相對(duì)定位,子級(jí)絕對(duì)定位 管嬉,并且四個(gè)定位屬性的值都設(shè)置了0皂林,那么這時(shí)候如果子級(jí)沒有設(shè)置寬高,則會(huì)被拉開到和父級(jí)一樣寬高

這里子元素設(shè)置了寬高蚯撩,所以寬高會(huì)按照我們的設(shè)置來顯示础倍,但是實(shí)際上子級(jí)的虛擬占位已經(jīng)撐滿了整個(gè)父級(jí),這時(shí)候再給它一個(gè)margin:auto它就可以上下左右都居中了

利用定位+margin:負(fù)值

絕大多數(shù)情況下胎挎,設(shè)置父元素為相對(duì)定位沟启, 子元素移動(dòng)自身50%實(shí)現(xiàn)水平垂直居中

<style>
    .father {
        position: relative;
        width: 200px;
        height: 200px;
        background: skyblue;
    }
    .son {
        position: absolute;
        top: 50%;
        left: 50%;
        margin-left:-50px;
        margin-top:-50px;
        width: 100px;
        height: 100px;
        background: red;
    }
</style>
<div class="father">
    <div class="son"></div>
</div>

整個(gè)實(shí)現(xiàn)思路如下圖所示:

圖片
  • 初始位置為方塊1的位置
  • 當(dāng)設(shè)置left、top為50%的時(shí)候犹菇,內(nèi)部子元素為方塊2的位置
  • 設(shè)置margin為負(fù)數(shù)時(shí)德迹,使內(nèi)部子元素到方塊3的位置,即中間位置

這種方案不要求父元素的高度揭芍,也就是即使父元素的高度變化了胳搞,仍然可以保持在父元素的垂直居中位置,水平方向上是一樣的操作

但是該方案需要知道子元素自身的寬高沼沈,但是我們可以通過下面transform屬性進(jìn)行移動(dòng)

利用定位+transform

實(shí)現(xiàn)代碼如下:

<style>
    .father {
        position: relative;
        width: 200px;
        height: 200px;
        background: skyblue;
    }
    .son {
        position: absolute;
        top: 50%;
        left: 50%;
  transform: translate(-50%,-50%);
        width: 100px;
        height: 100px;
        background: red;
    }
</style>
<div class="father">
    <div class="son"></div>
</div>

translate(-50%, -50%)將會(huì)將元素位移自己寬度和高度的-50%

這種方法其實(shí)和最上面被否定掉的margin負(fù)值用法一樣流酬,可以說是margin負(fù)值的替代方案,并不需要知道自身元素的寬高

table布局

設(shè)置父元素為display:table-cell列另,子元素設(shè)置 display: inline-block芽腾。利用verticaltext-align可以讓所有的行內(nèi)塊級(jí)元素水平垂直居中

<style>
    .father {
        display: table-cell;
        width: 200px;
        height: 200px;
        background: skyblue;
        vertical-align: middle;
        text-align: center;
    }
    .son {
        display: inline-block;
        width: 100px;
        height: 100px;
        background: red;
    }
</style>
<div class="father">
    <div class="son"></div>
</div>

flex彈性布局

還是看看實(shí)現(xiàn)的整體代碼:

<style>
   .father {
       display: flex;
       justify-content: center;
       align-items: center;
       width: 200px;
       height: 200px;
       background: skyblue;
   }
   .son {
       width: 100px;
       height: 100px;
       background: red;
   }
</style>
<div class="father">
   <div class="son"></div>
</div>

css3中了flex布局,可以非常簡(jiǎn)單實(shí)現(xiàn)垂直水平居中

這里可以簡(jiǎn)單看看flex布局的關(guān)鍵屬性作用:

  • display: flex時(shí)页衙,表示該容器內(nèi)部的元素將按照flex進(jìn)行布局

  • align-items: center表示這些元素將相對(duì)于本容器水平居中

  • justify-content: center也是同樣的道理垂直居中

grid網(wǎng)格布局

<style>
    .father {
            display: grid;
            align-items:center;
            justify-content: center;
            width: 200px;
            height: 200px;
            background: skyblue;

        }
        .son {
            width: 10px;
            height: 10px;
            border: 1px solid red
        }
</style>
<div class="father">
    <div class="son"></div>
</div>

這里看到摊滔,gird網(wǎng)格布局和flex彈性布局都簡(jiǎn)單粗暴

小結(jié)

上述方法中阴绢,不知道元素寬高大小仍能實(shí)現(xiàn)水平垂直居中的方法有:

  • 利用定位+margin:auto

  • 利用定位+transform

  • 利用定位+margin:負(fù)值

  • flex布局

  • grid布局

三、總結(jié)

根據(jù)元素標(biāo)簽的性質(zhì)艰躺,可以分為:

  • 內(nèi)聯(lián)元素居中布局
  • 塊級(jí)元素居中布局

內(nèi)聯(lián)元素居中布局

水平居中

  • 行內(nèi)元素可設(shè)置:text-align: center
  • flex布局設(shè)置父元素:display: flex; justify-content: center

垂直居中

  • 單行文本父元素確認(rèn)高度:height === line-height
  • 多行文本父元素確認(rèn)高度:disaply: table-cell; vertical-align: middle

塊級(jí)元素居中布局

水平居中

  • 定寬: margin: 0 auto
  • 絕對(duì)定位+left:50%+margin:負(fù)自身一半

垂直居中

  • position: absolute設(shè)置left呻袭、top、margin-left腺兴、margin-top(定高)
  • display: table-cell
  • transform: translate(x, y)
  • flex(不定高左电,不定寬)
  • grid(不定高,不定寬)页响,兼容性相對(duì)比較差
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篓足,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闰蚕,更是在濱河造成了極大的恐慌栈拖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件没陡,死亡現(xiàn)場(chǎng)離奇詭異涩哟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盼玄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門贴彼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人埃儿,你說我怎么就攤上這事锻弓。” “怎么了蝌箍?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長暴心。 經(jīng)常有香客問我妓盲,道長,這世上最難降的妖魔是什么专普? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任悯衬,我火速辦了婚禮,結(jié)果婚禮上檀夹,老公的妹妹穿的比我還像新娘筋粗。我一直安慰自己,他們只是感情好炸渡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布娜亿。 她就那樣靜靜地躺著,像睡著了一般蚌堵。 火紅的嫁衣襯著肌膚如雪买决。 梳的紋絲不亂的頭發(fā)上沛婴,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音督赤,去河邊找鬼嘁灯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛躲舌,可吹牛的內(nèi)容都是我干的丑婿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼没卸,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼羹奉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起办悟,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤尘奏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后病蛉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炫加,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年铺然,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俗孝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡魄健,死狀恐怖赋铝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沽瘦,我是刑警寧澤革骨,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站析恋,受9級(jí)特大地震影響良哲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜助隧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一筑凫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧并村,春花似錦巍实、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膝昆,卻和暖如春瓦盛,著一層夾襖步出監(jiān)牢的瞬間洗显,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工原环, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挠唆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓嘱吗,卻偏偏與公主長得像玄组,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谒麦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容