CSS垂直居中之現(xiàn)代CSS 解決方案

對于最流行的表格布局法和行內(nèi)塊法不去考慮,只考慮用最新的現(xiàn)代CSS去實現(xiàn)

  • 基于絕對定位的解決方案

1.早期解決方法:
main {
    position: absolute;
    top: calc(50% - 3em);
    left: calc(50% - 9em);
    width: 18em;
    height: 6em;
}

顯然這個方法最大的局限在于它要求元素的寬高時固定的,而通常情況,對那些需要居中的元素來說其尺寸往往由其內(nèi)容決定的。

2.translate()變形函數(shù)
mian {
   position: absolute;
   top: 50%;
   left: 50%;
   transform: translate(-50%,-50%);
}

缺點:

  • 有時我們不能選用絕對定位,對布局影響太強(qiáng)烈
  • 如果需要居中的元素已經(jīng)在高度上超過視口,那么他的頂部就會被視口裁切掉
  • 某些瀏覽器,該方法會導(dǎo)致元素的顯示有些模糊,因為元素可能被放置在半個像素上,這個問題可以用transform-style:preserve-3d來修復(fù),但是hack味道過重
3.基于視口單位的解決方案

CSS3中定位了一套新的單位,稱之為視口相關(guān)的長度單位。

  • vw是與視圖寬度有關(guān)的,1vw是視口寬度的1%,而不是100%
  • 與vw類似,1vh表示視口高度的1%
  • 當(dāng)視口寬度小于高度時,1vmin等于1vw。否則等于1vh
  • 當(dāng)視口寬度大于高度時,1vmax等于1vw,否則等于1vh
main {
   width: 18em;
   padding: 1em 1.5em;
   margin: 50vh auto 0;
   transform: translateY(-50%);
}

缺點: 只適用于視圖居中的場景

4.基于flexbox的解決方案

這是毋庸置疑的最佳解決方案,因為flex box(伸縮盒)是專門針對這種需求設(shè)計的。
我們只需兩行聲明即可:獻(xiàn)給這個待居中的父元素設(shè)置display:flex, 再給這個元素自身設(shè)置我們熟悉的不能再熟悉的margin:auto。

body{
   display: flex;
   min-height: 100vh;
   margin: 0;
}
main {
   margin: auto;
}

注意: 當(dāng)我們使用Flexbox時,margin:auto不僅在水瓶方向?qū)⒃鼐又?,垂直方向上也是如此?br> 還有一點,我們甚至不需要指定任何寬度:這個居中元素分配的寬度等于max-content(之前博客提到過的max-content)。


Flexbox好處在于: 它可以將匿名容器(即沒有被標(biāo)簽包裹的文本節(jié)點)垂直居中。
HTML:

<main>
   <h1>Am I centered yet?</h1> 
  <p>Center me, please!</p>
</main>

CSS:

* { margin: 0 }
body { 
   display: flex; 
   min-height: 100vh;
}
main { 
   padding: 1em 2em; 
   margin: auto;
   box-sizing: border-box; 
   background: #655; 
   color: white;
   text-align: center;
}
h1 {
   margin-bottom: .2em; 
   font-size: 150%;
}
body { 
   background: #fb3;
   font: 100%/1.5 sans-serif;
}

/** * Vertical centering - Flexbox solution for text */
body { 
display: flex;
 align-items: center;
 min-height: 100%; 
margin: 0;
}
html { 
height: 100% 
}
main { 
display: flex;
justify-content: center; 
align-items: center; 
width: 18em;
height: 10em; 
padding: 1em 1.5em; 
margin: 0 auto; 
box-sizing: border-box; 
background: #655;
color: white;
text-align: center;
}
h1 { margin: 0 0 .2em; font-size: 150%;}
p { margin: 0;}
body { background: #fb3; font: 100%/1.5 sans-serif;}
Flex 垂直居中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 14,155評論 1 92
  • 44年前我們就把人類送上月球了,但現(xiàn)在我們?nèi)匀粺o法在CSS中實現(xiàn)垂直居中。 在CSS中對元素進(jìn)行水平居中是非常簡單...
    康斌閱讀 16,047評論 9 28
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 2,119評論 0 2
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    love2013閱讀 2,438評論 0 11
  • 江夏學(xué)子華府雍, 天南地北齊相融。 都把求學(xué)問前程, 聚緣時空相巧同。
    爾琊閱讀 203評論 0 1

友情鏈接更多精彩內(nèi)容