最經典的題目之一?
line-height 單行文字 原理是利用行高來把文字推到中間:
1 2 3 4 5 .box { width : 200px ; height : 200px ; line-height : 200px ; }
缺點是只適用於「一行文字」。
line-height 多行文字 需搭配另外兩個屬性: inline-block
vetical-align
line-height
其實不僅限於文字,它可以適用所有「inline-level」的元素,所以只要把內容用「一個盒子」包起來就好:
HTML:
1 2 3 4 5 6 <div class ="box" > <div class ="content" > Lorem ipsum dolor sit amet consectetur adipisicing elit. Dignissimos ad quo ipsam! Dolor </div > </div >
CSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 .box { margin : auto; width : 200px ; line-height : 200px ; text-align : center; background-color : orange; } .content { display : inline-block; line-height : 1 ; vertical-align : middle; }
缺點是內容只能是 inline-level 元素,然後比較不直覺一點。
padding 利用 padding 來撐開高度:
1 2 3 4 5 .box { width : 200px ; height : 200px ; padding : 30px 0 ; }
缺點是這樣就沒辦法設定高度。
我很常用的做法。
原理是用 absolute
把距離設為離參考點 1/2 的寬高距離,接著用 translate
讓元素往左上方偏移自身 1/2 的寬高:
1 2 3 4 5 6 7 8 .box { width : 200px ; height : 200px ; position : absolute; top : 50% ; left : 50% ; transform : translate (-50% , -50% ); }
暫時想不到有什麼缺點,硬要說的話就是 Code 比較多吧。
absolute + margin auto 有時候會用到的做法。
原理是利用 top
bottom
left
right
來設定元素的「可用空間」,再加上 margin:auto
自動分配「剩餘空間」的特性來達成:
1 2 3 4 5 6 7 8 9 10 .box { position : absolute; top : 0 ; left : 0 ; right : 0 ; bottom : 0 ; margin : auto; width : 200px ; height : 100px ; }
缺點是元素必須設定固定的寬高(% 也 ok)才有效。
Flex + align items Flex 好棒棒!
1 2 3 4 5 6 7 8 9 10 .box { width : 300px ; height : 300px ; padding : 0px 30px ; margin : auto; background-color : orange; display : flex; align-items : center; }
Flex + margin auto Flex 盒子構造跟一般人不太一樣,所以只要對子元素設定 margin:auto
就能透過分配「剩餘空間」來達到垂直置中的效果。
備註:可以回想 absolute + margin 的原理,這個的原理跟它差不多。
HTML:
1 2 3 4 5 6 7 8 <div class ="box" > <div class ="content" > Lorem ipsum dolor sit amet, consectetur adipisicing elit. Totam minus ea laudantium, corporis minima reprehenderit quis voluptatum quiiure! Aliquid, eligendi provident tempora deleniti tempore obcaecati at neque optio nobis. </div > </div >
CSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 .box { box-sizing : border-box; width : 300px ; height : 300px ; background-color : orange; margin : auto; display : flex; } .content { width : 200px ; background-color : black; padding : 20px ; color : white; width : 200px ; margin : auto; }
relative + calc() 只是想介紹一下 calc()
這個屬性,它可以對不同單位做計算:
1 2 3 4 5 6 <div class ="box" > <div class ="content" > Lorem ipsum dolor sit amet, consectetur adipisicing elit. Totam minus ea laudantium, corporis minima reprehenderit quis voluptatum </div > </div >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 .box { width : 300px ; height : 300px ; background-color : orange; margin : auto; } .content { box-sizing : border-box; width : 200px ; background-color : black; padding : 20px ; color : white; position : relative; top : calc ((100% - 200px ) / 2 ); height : 200px ; }
備註:top 跟 bottom 的 %
會相對於父層的 height
,left 跟 right 的 %
會相對於 width
。
簡單說明一下原理,其實重點是要算出 「.content
該離上面多少距離」。
不用想太複雜很簡單,只要知道 .content
的高度就夠了,為什麼?因為只要知道「可用空間」有多大,再把「可用空間 / 2」就是答案了。(把空間分配到左右邊,元素不就在中間了嗎?)
那要怎麼知道「可用空間」有多少? => calc((100% - 200px))
這個翻成白話就是「.box
的高度 - .content
的高度)」,所以最後除以二就是正確的距離了。