文章目錄
- 盒子模型
- 內容區content
- 內邊距padding
- 邊框border
- 外邊距margin
- 元素的寬度高度
- box-sizing屬性
- content-box:設置的width和height就是內容區的width和height
- border-box:設置的width和height是context + padding + border的width和height
- 彈性布局
- Flex容器的屬性
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
- 項目屬性
- order
- align-self
- flex
- 總結
盒子模型
盒子模型是網頁設計中一種很重要的思維模型,即把網頁中的每個元素都看做是一個盒子。這個盒子模型主要是由四個部分組成:內容區content、內邊距padding、邊框border、外邊距margin。
內容區content
內容區是整個盒子模型的中心,主要是存放內容,內容可以是文本、圖片等資源。主要屬性是:width、height,分別用來指定盒子內容區域的寬度和高度。
內邊距padding
內邊距是內容區和邊框之間的空間,可以通過設置這四種屬性:padding-top、padding-right、padding-bottom、padding-left,分別來設置內容區在上、右、下、左四個方向上與邊框之間的距離
邊框border
邊框是環繞內容區和內邊距的邊界,可以通過設置這幾種屬性:border-style、border-width、border-color,分別來設置邊框的樣式、寬度、和顏色。
外邊距margin
外邊距位于盒子模型的最外圍,通過外邊距可以是盒子之間,也就是元素之間不會緊湊的連接在一塊,是布局中很重要的一個手段。可以通過設置margin-top、margin-right、margin-bottom、margin-left以及他們的簡寫屬性來設置外邊距的寬度(也就是與其他元素之間的距離)
元素的寬度高度
通常設置元素的寬度和高度時,實際上設置的只是元素內容區域的寬度和高度,如剛剛所講,盒子模型是講元素當成一整個盒子,所以元素的實際寬度和高度應該包括以上四個部分之后,即
總寬度:content width + padding-left + padding-right + border-left + border-right + margin-left + margin-right
總高度:content height + padding-top + padding-bottom + border-top + border-bottom + margin-top+ margin-bottom
box-sizing屬性
根據上面元素的寬度和高度,box-sizing屬性用于指定元素的盒子模型的寬高度的計算方式,重新定義的元素的尺寸。該屬性指主要有兩種:content-box和border-box
offsetWidth和offsetHeight是獲取元素中的寬度和高度
content-box:設置的width和height就是內容區的width和height
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>盒子模型</title><style>.d1 {width: 200px;height: 200px;background-color: aqua; /* 背景色 *//* padding:10px 5px 15px 20px; 設置內邊距: 上\右\下\左 */padding: 50px;border:20px solid red; /* 設置邊框 */margin: 10px; /* 設置外邊距:盒子與外邊框的間距 一個值代表上下左右值一樣 */box-sizing: content-box; /* 固定盒子的context的寬高度大小 *//*box-sizing: border-box; !* 固定盒子的context + padding + border的寬高度大小 *!*/}</style>
</head>
<body><div class="d1">哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈</div>
</body>
</html>
瀏覽器顯示如下
可以看出offsetWidth和offsetHeight都是為html中設置的200px
border-box:設置的width和height是context + padding + border的width和height
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>盒子模型</title><style>.d1 {width: 200px;height: 200px;background-color: aqua; /* 背景色 *//* padding:10px 5px 15px 20px; 設置內邊距: 上\右\下\左 */padding: 50px;border:20px solid red; /* 設置邊框 */margin: 10px; /* 設置外邊距:盒子與外邊框的間距 一個值代表上下左右值一樣 *//*box-sizing: content-box; !* 固定盒子的context的寬高度大小 *!*/box-sizing: border-box; /* 固定盒子的context + padding + border的寬高度大小 */}</style>
</head>
<body><div class="d1">哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈</div></body>
</html>
瀏覽器顯示如下
可以看出offsetWidth和offsetHeight都是為html中設置的340px (200px + 50 + 20 + 50 + 20)
彈性布局
彈性布局是CSS3中一種新的布局模式,可以簡便、完整、響應式地實現各種頁面布局,也就是為了滿足不同屏幕大小和設備類型(手機、電腦、平板…)適配問題。
display屬性可以指定html的元素為彈性布局
彈性布局Flex:Flexible box,采用Flex布局的元素,稱為Flex容器,簡稱容器。所有的子元素都是容器成員,稱為Flex項目:Flex item簡稱項目。容器默認存在兩根軸,即水平主軸和垂直的交叉軸。
主軸開始的位置叫做main start,結束的位置叫做main end。
交叉軸開始的位置叫做cross start,結束的位置叫做cross end。
Flex容器的屬性
屬性 | 描述 |
---|---|
flex-direction | 決定主軸上的方向(項目的排列方向) |
flex-wrap | 默認情況下,項目都排列在一根軸線上,如果一根軸線排不下,則flex-wrap屬性決定如何換行 |
flex-flow | 是flex-direction和flex-wrap兩個屬性的簡寫flex-flow: flex-direction flex-wrap; |
justify-content | 用于設置彈性盒子中元素在主軸(橫軸)方向上的對齊方式 |
align-items | 用來設置彈性盒子中元素在側軸(縱軸)方向上的對齊方式 |
align-content | 定義多個軸線的對齊方式,如果項目只有一根軸線,則不起作用 |
flex-direction
flex-direction 屬性用來決定主軸的方向(即項目的排列方向)
值 | 描述 |
---|---|
row | 默認值,主軸沿水平方向從左到右 |
row-reverse | 主軸沿水平方向從右到左 |
column | 主軸沿垂直方向從上到下 |
column-reverse | 主軸沿垂直方向從下到上 |
initial | 將此屬性設置為屬性的默認值 |
inherit | 從父元素繼承此屬性的值 |
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>flex-direction</title><style>#main {border: 1px solid #CCC;padding: 5px;position: relative;}.row, .row_reverse, .column, .column_reverse{display: flex;margin-bottom: 5px;}.row {flex-direction: row;}.row_reverse {flex-direction: row-reverse;}.column {flex-direction: column;}.column_reverse {flex-direction: column-reverse;position: absolute;top: 120px;left: 400px;}.row div, .row_reverse div, .column div, .column_reverse div {width: 100px;height: 100px;border: 1px solid black;}</style>
</head>
<body>
<div id="main"><div class="row"><div>row-A</div><div>row-B</div><div>row-C</div><div>row-D</div><div>row-E</div></div><div class="row_reverse"><div>row_reverse-A</div><div>row_reverse-B</div><div>row_reverse-C</div><div>row_reverse-D</div><div>row_reverse-E</div></div><div class="column"><div>column-A</div><div>column-B</div><div>column-C</div><div>column-D</div><div>column-E</div></div><div class="column_reverse"><div>column_reverse-A</div><div>column_reverse-B</div><div>column_reverse-C</div><div>column_reverse-D</div><div>column_reverse-E</div></div>
</div>
</body>
</html>
網頁效果如下:
flex-wrap
flex-wrap 屬性用來設置當彈性盒子的子元素(項目)超出父容器時是否換行
值 | 描述 |
---|---|
nowrap | 默認值,表示項目不會換行 |
wrap | 表示項目會在需要時換行 |
wrap-reverse | 表示項目會在需要時換行,但會以相反的順序 |
initial | 將此屬性設置為屬性的默認值 |
inherit | 從父元素繼承屬性的值 |
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>flex-wrap</title><style>#main {border: 1px solid #CCC;padding: 5px;}.nowrap, .wrap, .wrap_reverse {display: flex;flex-direction: row;margin-bottom: 15px;}.nowrap {flex-wrap: nowrap;}.wrap {flex-wrap: wrap;}.wrap_reverse {flex-wrap: wrap-reverse;}.nowrap div, .wrap div, .wrap_reverse div {width: 150px;height: 50px;border: 1px solid black;}</style>
</head>
<body>
<div id="main"><div class="nowrap"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div><div>13</div><div>14</div><div>15</div></div><div class="wrap"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div><div>13</div><div>14</div><div>15</div></div><div class="wrap_reverse"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div><div>13</div><div>14</div><div>15</div></div>
</div>
</body>
</html>
網頁效果如下:
flex-flow
flex-flow 屬性是 flex-direction 和 flex-wrap 兩個屬性的簡寫,語法:flex-flow: flex-direction flex-wrap;
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>flex-flow</title><style>.flex_flow {display: flex;flex-flow: row-reverse wrap;}.flex_flow div {width: 150px;height: 60px;margin-bottom: 5px;border: 1px solid black;}</style>
</head>
<body>
<div class="flex_flow"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div><div>13</div><div>14</div><div>15</div>
</div>
</body>
</html>
網頁效果:
justify-content
justify-content 屬性用于設置彈性盒子中元素在主軸(橫軸)方向上的對齊方式
值 | 描述 |
---|---|
flex-start | 默認值,左對齊 |
flex-end | 右對齊 |
center | 居中 |
space-between | 兩端對齊,項目之間的間隔是相等的 |
space-around | 每個項目兩側的間隔相等 |
initial | 將此屬性設置為屬性的默認值 |
inherit | 從父元素繼承屬性的值 |
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>justify-content</title><style>.flex {display: flex;flex-flow: row wrap;margin-top: 10px;}.flex div {width: 60px;height: 60px;margin-bottom: 5px;border: 1px solid black;}.flex-start {background-color: crimson;justify-content: flex-start;}.flex-end {background-color: #ffa500;justify-content: flex-end;}.center {background-color: coral;justify-content: center;}.space-between {background-color: #73AD21;justify-content: space-between;}.space-around {background-color: blue;justify-content: space-around;}</style>
</head>
<body>
<div class="flex flex-start"><div>A</div><div>B</div><div>C</div><div>D</div>
</div>
<div class="flex flex-end"><div>A</div><div>B</div><div>C</div><div>D</div>
</div>
<div class="flex center"><div>A</div><div>B</div><div>C</div><div>D</div>
</div>
<div class="flex space-between"><div>A</div><div>B</div><div>C</div><div>D</div>
</div>
<div class="flex space-around"><div>A</div><div>B</div><div>C</div><div>D</div>
</div>
</body>
</html>
網頁效果:
align-items
align-items 屬性用來設置彈性盒子中元素在側軸(縱軸)方向上的對齊方式
值 | 描述 |
---|---|
stretch | 默認值,項目將被拉伸以適合容器 |
center | 項目位于容器的中央 |
flex-start | 項目位于容器的頂部 |
flex-end | 項目位于容器的底部 |
baseline | 項目與容器的基線對齊 |
initial | 將此屬性設置為屬性的默認值 |
inherit | 從父元素繼承屬性的值 |
align-content
align-content 屬性與 justify-content 屬性類似,可以在彈性盒子的側軸還有多余空間時調整容器內項目的對齊方式
值 | 描述 |
---|---|
stretch | 默認值,將項目拉伸以占據剩余空間 |
center | 項目在容器內居中排布 |
flex-start | 項目在容器的頂部排列 |
flex-end | 項目在容器的底部排列 |
space-between | 多行項目均勻分布在容器中,其中第一行分布在容器的頂部,最后一行分布在容器的底部 |
space-around | 多行項目均勻分布在容器中,并且每行的間距(包括離容器邊緣的間距)都相等 |
initial | 將此屬性設置為屬性的默認值 |
inherit | 從父元素繼承該屬性的值 |
項目屬性
可以通過以下三個屬性來對彈性布局的子元素進行設置
值 | 描述 |
---|---|
order | 用來設置項目在容器中出現的順序 |
align-self | 允許您為某個項目設置不同于其它項目的對齊方式 |
flex | flex 屬性是 flex-grow、flex-shrink 和 flex-basis 三個屬性的簡寫 |
order
order 屬性用來設置項目在容器中出現的順序,可以通過具體的數值來定義項目在容器中的位置,屬性的語法格式:order: number;
:nth-child(n) 選擇器匹配父元素中的第 n 個子元素,元素類型沒有限制
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>order</title><style>.flex {display: flex;flex-flow: row wrap;margin-top: 10px;}.flex div {width: 60px;height: 60px;margin-bottom: 5px;border: 1px solid black;}.flex div:nth-child(1) {order: 5;}.flex div:nth-child(2) {order: 3;}.flex div:nth-child(3) {order: 1;}.flex div:nth-child(4) {order: 2;}.flex div:nth-child(5) {order: 4;}</style>
</head>
<body>
<div class="flex"><div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
</div>
</body>
</html>
網頁效果:
align-self
align-self 屬性允許為某個項目設置不同于其它項目的對齊方式,該屬性可以覆蓋 align-items 屬性的值
值 | 描述 |
---|---|
auto | 默認值,表示元素將繼承其父容器的 align-items 屬性值,如果沒有父容器,則為“stretch” |
stretch | 項目將被拉伸以適合容器 |
center | 項目位于容器的中央 |
flex-start | 項目位于容器的頂部 |
flex-end | 項目位于容器的底部 |
baseline | 項目與容器的基線對齊 |
initial | 將此屬性設置為屬性的默認值 |
inherit | 從父元素繼承屬性的值 |
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>align-self</title><style>.flex {display: flex;flex-flow: row wrap;align-items: flex-end;border: 1px solid #CCC;height: 150px;}.flex div {width: 60px;height: 60px;border: 1px solid black;}.flex div:nth-child(4) {align-self: flex-start;/*項目位于容器的頂部*/}</style>
</head>
<body>
<div class="flex"><div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
</div>
</body>
</html>
網頁效果:
flex
flex 屬性是 flex-grow、flex-shrink 和 flex-basis 三個屬性的簡寫,語法格式:flex: flex-grow flex-shrink flex-basis;
值 | 描述 |
---|---|
flex-grow | (必填參數)一個數字,用來設置項目相對于其他項目的增長量,默認值為 0 |
flex-shrink | (選填參數)一個數字,用來設置項目相對于其他項目的收縮量,默認值為 1 |
flex-basis | (選填參數)項目的長度,合法值為 auto(默認值,表示自動)、inherit(表示從父元素繼承該屬性的值) 或者以具體的值加 “%”、“px”、“em” 等單位的形式 |
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>flex</title><style>.flex {display: flex;flex-flow: row wrap;align-items: flex-end;border: 1px solid #CCC;}.flex div {width: 60px;height: 60px;border: 1px solid black;}.flex div:nth-child(2) {flex:0;}.flex div:nth-child(4) {flex:1 1 auto;}</style>
</head>
<body>
<div class="flex"><div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
</div>
</body>
</html>
網頁效果:
總結
盒子模型是把網頁中的每個元素都看做是一個盒子,是布局中一個很重要的概念,同時彈性布局是為了滿足不同屏幕大小和設備類型(手機、電腦、平板…)適配問題。