1. 程式人生 > >CSStask1-建立九宮格

CSStask1-建立九宮格

目標:建立一個九宮格

任務要求:

  1. 要求九個正方形在頁面上三三排列,使用div標籤,border擁有圓角屬性,背景顏色為#ff5a00;
  2. 要求只能使用class選擇器,不能使用id選擇器
  3. 要求九宮格大小隨螢幕寬度改變,
  4. 要求配置伺服器,讓頁面在PC和手機上都可以瀏覽;

任務解析:這個題目乍一看非常簡單,細細分析下來實則有點難度。需要的知識技能如下:

  1. 瞭解CSS的盒子模型、浮動屬性;
  2. 如何實現九宮格大小自適應;
  3. Nginx伺服器的配置;

任務完成:

完成HTML頁面的設計,CSS樣式的初步設計
<body>
	<div class="wrap">
		<div></div>
		<div></div>
		<div></div>
		<div></div>
		<div></div>
		<div></div>
		<div></div>
		<div></div>
		<div></div>
	</div>
</body>
body {margin: 0;}
.wrap {padding: 40px 0 0 40px;}
.wrap div {
	width: 394px;
	height: 394px;
	margin: 0 40px 40px 0;
	background: #ff5a00;
	border-radius: 10px;
	float: left;
}

       現在頁面可以顯示九宮格了,通過Chrome瀏覽器的開發者工具進行除錯發現,九宮格的大小無論在PC端還是手機上都不能進行調整,也就是自適應,這是因為我們在設定div的大小時採用了畫素單位,雖然它是一個相對單位,但是並不能改變大小;為了能夠自適應,我們捨棄px,轉而使用%這個更加靈活的相對單位。

我們將畫素單位全部改為百分比單位
body {margin: 0;}
.wrap {padding: 3% 0 0 3%;}
.wrap div {
	width: 30%;
	height: 30%;
	margin: 0 3% 3% 0;
	background: #ff5a00;
	border-radius: 1%;
	float: left;
}

重新整理頁面,一片空白,為什麼元素都不見了呢?

我們知道百分比是相對於父級元素來說的,此例中我們設定的div的父級元素為wrap,但是wrap本身並沒有設定寬高,於是我們想去給wrap設定寬高來讓div顯示出來,可是設定多少呢?

我們知道,wrap實際上應該是有寬度的,所以div也應該有寬度,它繼承了父級body的寬度,但高度怎麼設定呢?

本來,wrap的高度是依賴於它的子級元素div的,當所有子級元素div的寬高設定好之後,wrap的高度自然就定下來了,但是問題在於:現在div的高度依賴wrap,而wrap的高度又依賴於div,所以就形成了一片空白的頁面。實際上也不是一片空白,如果我們給wrap和div都設定一個可見顏色的border,便可以發現此時的div高度為0,這就陷入無限迴圈了,可怎麼辦呢?

到了這兒,熟悉CSS盒子模型的同學就知道,div的邊框border中除了content是依賴於內容存在之外,還有一個padding屬性,注意padding是包含在border之內的,也就是div的background屬性中的color屬性同樣會作用於padding。我們不能設定div的高度,但是別忘了div的height=content+padding+border+margin,所以我們可以通過設定div的padd屬性來讓它看起來有高。

body {margin: 0;}
.wrap {padding: 3% 0 0 3%;}
.wrap div {
	width: 30%;
	padding-top: 30%;
	margin: 0 3% 3% 0;
	background: #ff5a00;
	border-radius: 1%;
	float: left;
}

現在好了,九宮格又重新出現了,哎,你可能會發現九宮格的圓角看起來比第一次的10px小了很多啊?

其實是這樣的,我們的百分比是相對於wrap的寬高而言的,而圓角屬性border-radius的百分比是相對於div來說的,div的寬高是wrap的30%,所以如果你想讓圓角屬性也可以自適應的話,就相應的改一下就ok啦。其實如果不改的話,設定為10px也是沒有大問題的,除非你在很小的頁面上去瀏覽,否則差別很小。

現在為了能在各種裝置上檢視網頁,我們需要在head中加上下面這個meta:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

這就是所謂的viewport,具體可以看下面的解釋:viewport

問題回顧:

1.我們對wrap下的div佈局的時候,其寬度設定為30%,margin設定為3%,理論上總寬度=30% * 3 +3% * 4 =102%,為何從頁面來看,並沒有超出頁面邊緣?

2.div之間的margin屬性不會重疊;

3.div如果要設定百分比高度,只有在父級元素明確了高度之後才能設定成功;

4.新增viewport的意義在哪裡,如果不加會有什麼後果?

5.對於本例中實現九宮格的方法有無改進的地方?或者有無其他更好的方法?