提及css佈局,那麼必定得聊聊盒模型,清除浮動,
position
,display
什麼的,但本篇本不是講這些基礎知識的,而是給出各類佈局的解決方案。css
首先咱們來看看水平居中html
<div class="parent"> <div class="child">Demo</div> </div> <style> .child { width: 100px; margin: 0 auto; } </style>
相必是個前端都見過,這定寬的水平居中,咱們還能夠用下面這種來實現不定寬的前端
<div class="parent"> <div class="child">Demo</div> </div> <style> .child { display: table; margin: 0 auto; } </style>
display: table
在表現上相似 block
元素,可是寬度爲內容寬。程序員
<table>
<div class="parent"> <div class="child">Demo</div> </div> <style> .child { display: inline-block; } .parent { text-align: center; } </style>
<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { position: relative; } .child { position: absolute; left: 50%; width: 100px; margin-left: -50px; /* width/2 */ } </style>
transform
,有兼容性更好<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { position: relative; } .child { position: absolute; left: 50%; transform: translateX(-50%); } </style>
transform
爲 CSS3 屬性,有兼容性問題<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { display: flex; justify-content: center; } </style>
flex
有兼容性問題<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { display: table-cell; vertical-align: middle; } </style>
table
)強大的absolute對於這種小問題固然也是很簡單的web
<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { position: relative; } .child { position: absolute; top: 50%; transform: translateY(-50%); } </style>
transform
爲 CSS3 屬性,有兼容性問題同水平居中,這也能夠用margin-top
實現,原理水平居中瀏覽器
若是說absolute
強大,那flex
只是笑笑,由於,他纔是最強的。。。但它有兼容問題佈局
<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { display: flex; align-items: center; } </style>
<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { position: relative; } .child { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } </style>
transform
爲 CSS3 屬性,有兼容性問題<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { text-align: center; display: table-cell; vertical-align: middle; } .child { display: inline-block; } </style>
<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { display: flex; justify-content: center; /* 水平居中 */ align-items: center; /*垂直居中*/ } </style>
##一列定寬,一列自適應性能
<div class="parent"> <div class="left"> <p>left</p> </div> <div class="right"> <p>right</p> <p>right</p> </div> </div> <style> .left { float: left; width: 100px; } .right { margin-left: 100px /*間距可再加入 margin-left */ } </style>
IE 6 中會有3像素的 BUG,解決方法能夠在 .left
加入 margin-left:-3px
固然也有解決這個小bug的方案以下:學習
<div class="parent"> <div class="left"> <p>left</p> </div> <div class="right-fix"> <div class="right"> <p>right</p> <p>right</p> </div> </div> </div> <style> .left { float: left; width: 100px; } .right-fix { float: right; width: 100%; margin-left: -100px; } .right { margin-left: 100px /*間距可再加入 margin-left */ } </style>
此方法不會存在 IE 6 中3像素的 BUG,但 .left
不可選擇, 須要設置 .left {position: relative}
來提升層級。 注意此方法增長了沒必要要的 HTML 文本結構。flex
傲嬌的程序員應該放棄過低版本的瀏覽器。(web前端學習交流羣:328058344 禁止閒聊,非喜勿進!)
<div class="parent"> <div class="left"> <p>left</p> </div> <div class="right"> <p>right</p> <p>right</p> </div> </div> <style> .left { float: left; width: 100px; } .right { overflow: hidden; } </style>
設置 overflow: hidden
會觸發 BFC 模式(Block Formatting Context)塊級格式上下文。BFC是什麼呢。用通俗的來說就是,隨便你在BFC 裏面幹啥,外面都不會受到影響 。此方法樣式簡單但不支持 IE 6
<div class="parent"> <div class="left"> <p>left</p> </div> <div class="right"> <p>right</p> <p>right</p> </div> </div> <style> .parent { display: table; width: 100%; table-layout: fixed; } .left { display: table-cell; width: 100px; } .right { display: table-cell; /*寬度爲剩餘寬度*/ } </style>
table
的顯示特性爲每列的單元格寬度和必定等與表格寬度。 table-layout: fixed
可加速渲染,也是設定佈局優先。table-cell
中不能夠設置 margin
可是能夠經過 padding
來設置間距
<div class="parent"> <div class="left"> <p>left</p> </div> <div class="right"> <p>right</p> <p>right</p> </div> </div> <style> .parent { display: flex; } .left { width: 100px; margin-left: 20px; } .right { flex: 1; } </style>
咱們在學會一列定寬,一列自適應的佈局後也能夠方便的實現 多列定寬,一列自適應 多列不定寬加一列自適應 這裏咱們不一一講解,你們自行嘗試,也能夠鞏固前面學習的
<div class="parent"> <div class="column"> <p>1</p> </div> <div class="column"> <p>2</p> </div> <div class="column"> <p>3</p> </div> <div class="column"> <p>4</p> </div> </div> <style> .parent { margin-left: -20px; } .column { float: left; width: 25%; padding-left: 20px; box-sizing: border-box; } </style>
<div class="parent"> <div class="column"> <p>1</p> </div> <div class="column"> <p>2</p> </div> <div class="column"> <p>3</p> </div> <div class="column"> <p>4</p> </div> </div> <style> .parent { display: flex; } .column { flex: 1; } .column+.column { /* 相鄰兄弟選擇器 */ margin-left: 20px; } </style>
<div class='parent-fix'> <div class="parent"> <div class="column"> <p>1</p> </div> <div class="column"> <p>2</p> </div> <div class="column"> <p>3</p> </div> <div class="column"> <p>4</p> </div> </div> </div> <style> .parent-fix { margin-left: -20px; } .parent { display: table; width: 100%; /*能夠佈局優先,也能夠單元格寬度平分在沒有設置的狀況下*/ table-layout: fixed; } .column { display: table-cell; padding-left: 20px; } </style>
table
的特性爲每列等寬,每行等高能夠用於解決此需求
<div class="parent"> <div class="left"> <p>left</p> </div> <div class="right"> <p>right</p> <p>right</p> </div> </div> <style> .parent { display: table; width: 100%; table-layout: fixed; } .left { display: table-cell; width: 100px; } .right { display: table-cell /*寬度爲剩餘寬度*/ } </style>
<div class="parent"> <div class="left"> <p>left</p> </div> <div class="right"> <p>right</p> <p>right</p> </div> </div> <style> .parent { display: flex; } .left { width: 100px; margin-left: 20px; } .right { flex: 1; } </style>
注意這裏實際上使用了 align-items: stretch
,flex 默認的 align-items
的值爲 stretch
<div class="parent"> <div class="left"> <p>left</p> </div> <div class="right"> <p>right</p> <p>right</p> </div> </div> <style> .parent { overflow: hidden; } .left, .right { padding-bottom: 9999px; margin-bottom: -9999px; } .left { float: left; width: 100px; margin-right: 20px; } .right { overflow: hidden; } </style>
此方法爲僞等高(只有背景顯示高度相等),左右真實的高度其實不相等。 兼容性較好。
到此,咱們瞭解常見的佈局解決方案,這些只是參考,同樣的佈局實現方式多種多樣。主要就使用position
、flex
、table
(從好久好久之前起,咱們就拋棄了table佈局頁面,但display: table;是異常強大)、float
等屬性目前flex
兼容性較差 傲嬌的程序員應該放棄過低版本的瀏覽器