1. 程式人生 > >【css】回想下經典的布局

【css】回想下經典的布局

範圍 使用 you 方式 窮舉 add height 設置 蘊含

技術分享

  看到這張圖相信大多數人都很熟悉,這曾經是一種經典的布局方式,一道經典的面試題,但是隨著歲月的流轉,時光的交替(頗有一種“天下風雲出我輩,一入江湖歲月催”的感慨,哈哈),它一步步逐漸退出了歷史舞臺,不過在經典,總是有它經典的含義在裏面,今天筆者就嘗試站在自己認知範圍內,重新詮釋了下經典,實現的手段則是用了各種可能的方式實現這一經典布局:

1、基於BFC的實現

.layout1 {
	height: 100px;
	overflow: hidden
}

.layout1 .l {
	height: 100%;
	width: 100px;
	float: left;
}

.layout1 .m {
	height: 100%;
	margin: 0 200px 0 100px;
}

.layout1 .r {
	height: 100%;
	width: 200px;
	float: right;
}

<div class=‘layout1‘>
	<div class=‘l‘></div>
	<div class=‘r‘></div>
	<div class=‘m‘>layout1</div>
</div>

  圖中的第一個行就是基於此方式實現的,原理很簡單,利用浮動元素脫離文檔流的特性,左邊的左浮動,右邊的有浮動,簡單粗暴。

2、聖杯布局

.layout2 {
	height: 100px;
	overflow: hidden;
	padding: 0 200px 0 100px;
}

.layout2 .m {
	float: left;
	width: 100%;
	height: 100%;
}

.layout2 .l {
	float: left;
	width: 100px;
	margin-left: -100%;
	position: relative;
	left: -100px;
}

.layout2 .r {
	width: 200px;
	margin-left: -200px;
	float: left;
	position: relative;
	right: -200px;
}

<div class=‘layout2‘>
	<div class=‘m‘>layout2</div>
	<div class=‘l‘></div>
	<div class=‘r‘></div>
</div>

  為了保證dom元素的盡快展示,而將最重要的元素放在最前解析,優化用戶體驗,使用負margin和相對定位調整左右元素位置,使用大容器的padding作為調整空間的hack,十分經典的手法;

3、雙飛翼布局

.layout3 {
	height: 100px;
	overflow: hidden;
}

.layout3 .m-wrap {
	width: 100%;
	float: left;
	height: 100%;
}

.layout3 .m {
	margin: 0 200px 0 100px;
}

.layout3 .l {
	float: left;
	width: 100px;
	margin-left: -100%;
}

.layout3 .r {
	float: left;
	width: 200px;
	margin-left: -200px;
}

<div class=‘layout3‘>
	<div class=‘m-wrap‘>
		<div class=‘m‘>layout3</div>
	</div>
	<div class=‘l‘></div>
	<div class=‘r‘></div>
</div>

  與之前的方式基本一致,唯一的不同是添加了一個標簽,而沒有依賴根容器做hack

4、flex實現

.layout4 {
	display: flex;
	height: 100px;
}

.layout4 .l {
	flex: 0 0 auto;
	width: 100px;
}

.layout4 .m {
	flex: 1 1 auto;
}

.layout4 .r {
	flex: 0 0 auto;
	width: 200px;
}

<div class=‘layout4‘>
	<div class=‘l‘></div>
	<div class=‘m‘>layout4</div>
	<div class=‘r‘></div>
</div>

  實現十分簡單,利用伸縮盒模型的特性,只需要開啟中間元素的flex-grow(為了保證縮小時的正常顯示筆者還開啟了flex-shrink)就能個很輕易的實現這種布局,不過為了美觀,筆者並沒有貼上兼容性的代碼。

  想來所有方式似乎都已窮舉?其實不然,還有去年剛出臺的新規則css-grid可以一試,於是

5、css grid

.layout5 {
	height: 100px;
	display: grid;
	grid-template-columns: 100px 1fr 200px;
}

<div class=‘layout5‘>
	<div class=‘l‘></div>
	<div class=‘m‘>layout5</div>
	<div class=‘r‘></div>
</div>

  可以看到,基於css grid的實現是最為便捷的,基於不需要操作grid item,只需要設置容器就可以輕易實現,不過由於是新事物,所以兼容性比較差。

  也難怪這是一種經典的布局,幾乎所有新的布局方式都是很友好的在支持它,從蠻荒時代的要使用各種hack手段來實現,到現代的輕而易舉的實現,也足見其在css發展中的重要地位,現在想來也確實,css3之前的css更多的像是一種工具式的語言,它沒有任何優雅的特性,了無生趣,而到了css3時代,無論從性能上的優化,工程上的提高,都是可圈可點的。

  當然,類似經典的實現在css中還有很多,例如各種垂直居中的方法,與js更新換代的方式不同,舊的技術不斷被新技術替換,而在css領域,這種返古現象卻經常發生,當然也和瀏覽器廠商、各個平臺,復雜的兼容性場景有關,但是其中蘊含的思想就像jQuery那種設計理念,卻不會隨著歲月的流逝而過時,反而在特定的時間上,更是彌足珍貴的。  

【css】回想下經典的布局