從頭開始 — CSS — 垂直居中

事實上紧唱,每次面試前端必問的問題就是這個评甜。及其常見的需求灰粮,看起來似乎非常簡單,但是實現(xiàn)起來很費勁忍坷,尤其是涉及尺寸不固定的元素粘舟。

本篇文章將介紹比較流行的幾種方法熔脂。

行內(nèi)塊

<body>
    <div id="ghost"></div>
    <span>
        hello
    </span>
</body>
 #ghost {
            display: inline-block;
            height: 20em;
            vertical-align: middle;
        }

本質(zhì)上是利用了內(nèi)聯(lián)元素的 vertical-align 屬性,通過將此屬性置為middle柑肴,同一行內(nèi)的內(nèi)聯(lián)元素都將以設置這一屬性的內(nèi)聯(lián)元素的基線對齊霞揉。

基于inline-block特有的屬性:擁有內(nèi)聯(lián)元素的特性同時可以定義寬高,我們可以設置一個ghost行內(nèi)塊用于定義高度晰骑,再讓其他內(nèi)聯(lián)元素與其對齊零聚,實現(xiàn)垂直居中。

當然我們也可以將其它元素置為行內(nèi)塊些侍,再設置寬度并添加text-align使其水平居中隶症。

總結一下,此方法太過hack岗宣。

絕對定位

子元素固定寬高

<div id="main">
        <div id="child">
            hello
        </div>
</div>
#main {
            background-color: green;
            height: 20em;
            width: 20em;
            position: relative;
}

#child {
            position: absolute;
            background: yellow;
            top: 50%;
            left: 50%;
            height: 10em;
            width: 10em;
            margin-top: -5em;
            margin-left: -5em;
}

顯然蚂会,這種方法的原理是:先利用絕對定位將這個元素的左上角放置與父元素的正中間,再利用負邊距將它向左上移動它本身的一半耗式。

如果借助calc()函數(shù)可以說明得更加清楚:

#child {
    position: absolute;
    top: calc(50%-5em);
    left: calc(50%-5em);
    height: 10em;
    width: 10em;
}

不固定寬高

實際中大多數(shù)時候我們并不知道子元素的實際寬高胁住。

如果你屬性translate()函數(shù),你一定知道當它的參數(shù)為百分比時刊咳,它會按照元素本身的百分比值進行變換彪见,我們可以通過這個方法徹底擺脫對尺寸的依賴!

#child {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
}

看起來已經(jīng)完美解決了娱挨,但是它還有以下的缺陷:

  1. 絕對定位會對整體的布局造成很強烈的影響余指。
  2. 如果居中的元素超過了視窗會被裁剪掉。
  3. 在某些瀏覽器中跷坝,元素可能會被放置在半個像素上造成模糊酵镜。

視口居中

如果我們不采用絕對定位,對子元素設置margin使其左上角置于父元素中點柴钻,再用translate重復上一種方法的操作淮韭,是否可以實現(xiàn)呢?

答案是不可以贴届,因為margin的百分比是以父元素的寬度為基準的靠粪,即便是top和bottom也是! 沒錯毫蚓,很扯占键。

如果僅僅想要垂直于視口,我們可以采用css中相對于視口的單位 vw绍些、vh捞慌、vmin耀鸦、vmax

  • 1vw 表示視口寬度的1%柬批,同理1vh等于視口高度的1%
  • 當視口寬度小于高度時啸澡,1vmin=1vw,否則1vmin=1vh氮帐,另一種情況同理嗅虏。
#child {
            margin:50vh auto 0;
            transform: translateY(-50%);
}

它只能基于視口居中。

Flexbox

flex當然是未來的趨勢上沐,上面的一切都可以理解成為了照顧老舊的瀏覽器的猴戲(雖然translate和視口單位的兼容性也不怎么好)皮服。

<body>
    <div id="main">hello</div>
</body>
#main {
           margin: auto;
        }
 body {
            display: flex;  
        }

啊,很難受参咙。使用flexbox時龄广,margin:auto不僅在水平方向上將元素居中,垂直方向上也是如此蕴侧。

如果你熟悉flex的話择同,其實還有多種實現(xiàn)方式。

body {
            display: flex;  
            justify-content: center;
            align-items:center;
        }

或者對子元素單獨設置交叉軸對齊方式:

body {
            display: flex;  
            justify-content: center;
        }
#main {
            align-self:center;
}
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末净宵,一起剝皮案震驚了整個濱河市敲才,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌择葡,老刑警劉巖紧武,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敏储,居然都是意外死亡阻星,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門已添,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迫横,“玉大人,你說我怎么就攤上這事酝碳》猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵疏哗,是天一觀的道長呛讲。 經(jīng)常有香客問我,道長返奉,這世上最難降的妖魔是什么贝搁? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮芽偏,結果婚禮上雷逆,老公的妹妹穿的比我還像新娘。我一直安慰自己污尉,他們只是感情好膀哲,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布往产。 她就那樣靜靜地躺著,像睡著了一般某宪。 火紅的嫁衣襯著肌膚如雪仿村。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天兴喂,我揣著相機與錄音蔼囊,去河邊找鬼。 笑死衣迷,一個胖子當著我的面吹牛畏鼓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壶谒,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼滴肿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佃迄?” 一聲冷哼從身側響起泼差,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呵俏,沒想到半個月后堆缘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡普碎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年吼肥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麻车。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡缀皱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出动猬,到底是詐尸還是另有隱情啤斗,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布赁咙,位于F島的核電站钮莲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏彼水。R本人自食惡果不足惜崔拥,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凤覆。 院中可真熱鬧链瓦,春花似錦、人聲如沸盯桦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肥卡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間事镣,已是汗流浹背步鉴。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留璃哟,地道東北人氛琢。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像随闪,于是被迫代替她去往敵國和親阳似。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案铐伴? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,737評論 1 92
  • CSS 是什么 css(Cascading Style Sheets)撮奏,層疊樣式表,選擇器{屬性:值当宴;屬性:值}h...
    崔敏嫣閱讀 1,475評論 0 5
  • 一 外部式css樣式 (也可稱為外聯(lián)式)就是把css代碼寫一個單獨的外部文件中畜吊,這個css樣式文件以“.css...
    KunMitnic閱讀 931評論 0 1
  • 高考后離婚綜合癥在新學期的第一天就爆發(fā)了。多年的夫妻們户矢,忍無可忍玲献,無需再忍,平靜又決絕梯浪。捌年。。 男女之間愛情與婚姻的...
    鷺風閱讀 287評論 3 0
  • 本來應該昨天回家的挂洛,在上海參加三天學習實在累礼预、腳疼的走不動,沒能在和女兒約定的時間回家虏劲。中午逆瑞,父女倆去車站接我,...
    武春麗閱讀 368評論 0 0