Flex 伸縮佈局
移動web開發流式佈局
1.0 移動端基礎
1.1瀏覽器現狀
PC端常見瀏覽器:360瀏覽器、谷歌瀏覽器、火狐瀏覽器、QQ瀏覽器、百度瀏覽器、搜狗瀏覽器、IE瀏覽器。
移動端常見瀏覽器:UC瀏覽器,QQ瀏覽器,歐朋瀏覽器,百度手機瀏覽器,360安全瀏覽器,谷歌瀏覽器,搜狗手機瀏覽器,獵豹瀏覽器,以及其他雜牌瀏覽器。
國內的UC和QQ,百度等手機瀏覽器都是根據Webkit修改過來的核心,國內尚無自主研發的核心,就像國內的手機作業系統都是基於Android修改開發的一樣。
總結:相容移動端主流瀏覽器,處理Webkit核心瀏覽器即可。
1.2 手機螢幕的現狀
- 移動端裝置螢幕尺寸非常多,碎片化嚴重。
- Android裝置有多種解析度:480x800, 480x854, 540x960, 720x1280,1080x1920等,還有傳說中的2K,4k屏。
- 近年來iPhone的碎片化也加劇了,其裝置的主要解析度有:640x960, 640x1136, 750x1334, 1242x2208等。
- 作為開發者無需關注這些解析度,因為我們常用的尺寸單位是 px 。
1.3常見移動端螢幕尺寸
1.4移動端除錯方法
- Chrome DevTools(谷歌瀏覽器)的模擬手機除錯
- 搭建本地web伺服器,手機和伺服器一個區域網內,通過手機訪問伺服器
- 使用外網伺服器,直接IP或域名訪問
2.0 視口
視口(viewport)就是瀏覽器顯示頁面內容的螢幕區域。 視口可以分為佈局視口、視覺視口和理想視口
2.1 佈局視口 layout viewport
一般移動裝置的瀏覽器都預設設定了一個佈局視口,用於解決早期的PC端頁面在手機上顯示的問題。
iOS, Android基本都將這個視口解析度設定為 980px,所以PC上的網頁大多都能在手機上呈現,只不過元素看上去很小,一般預設可以通過手動縮放網頁。
2.2視覺視口 visual viewport
字面意思,它是使用者正在看到的網站的區域。注意:是網站的區域。
我們可以通過縮放去操作視覺視口,但不會影響佈局視口,佈局視口仍保持原來的寬度。
2.3理想視口 ideal viewport
為了使網站在移動端有最理想的瀏覽和閱讀寬度而設定
理想視口,對裝置來講,是最理想的視口尺寸
需要手動添寫meta視口標籤通知瀏覽器操作
meta視口標籤的主要目的:佈局視口的寬度應該與理想視口的寬度一致,簡單理解就是裝置有多寬,我們佈局的視口就多寬
總結:我們開發最終會用理想視口,而理想視口就是將佈局視口的寬度修改為視覺視口
2.4meta標籤
最標準的viewport設定
- 視口寬度和裝置保持一致
- 視口的預設縮放比例1.0
- 不允許使用者自行縮放
- 最大允許的縮放比例1.0
- 最小允許的縮放比例1.0
3.0二倍圖
3.1物理畫素&物理畫素比
物理畫素點指的是螢幕顯示的最小顆粒,是物理真實存在的。這是廠商在出廠時就設定好了,比如蘋果6 是 750* 1334
我們開發時候的1px 不是一定等於1個物理畫素的
一個px的能顯示的物理畫素點的個數,稱為物理畫素比或螢幕畫素比
如果把1張100*100的圖片放到手機裡面會按照物理畫素比給我們縮放
lRetina(視網膜螢幕)是一種顯示技術,可以將把更多的物理畫素點壓縮至一塊螢幕裡,從而達到更高的解析度,並提高螢幕顯示的細膩程度。
對於一張 50px * 50px 的圖片,在手機或 Retina 屏中開啟,按照剛才的物理畫素比會放大倍數,這樣會造成圖片模糊
在標準的viewport設定中,使用倍圖來提高圖片質量,解決在高清裝置中的模糊問題
通常使用二倍圖, 因為iPhone 6 的影響背景圖片 注意縮放問題
3.2背景縮放background-size
background-size 屬性規定背景影象的尺寸
background-size: 背景圖片寬度 背景圖片高度;
單位: 長度|百分比|cover|contain;
cover把背景影象擴充套件至足夠大,以使背景影象完全覆蓋背景區域。
contain把影象影象擴充套件至最大尺寸,以使其寬度和高度完全適應內容區域
4.0 移動開發選擇和技術解決方案
4.1移動端主流方案
1.單獨製作移動端頁面(主流)
通常情況下,網址域名前面加 m(mobile)
可以開啟移動端。通過判斷裝置,如果是移動裝置開啟,則跳到移動端頁面。
也就是說,PC端和移動端為兩套網站,pc端是pc斷的樣式,移動端在寫一套,專門針對移動端適配的一套網站
京東pc端:
京東移動端:
2.響應式頁面相容移動端(其次)
響應式網站:即pc和移動端共用一套網站,只不過在不同螢幕下,樣式會自動適配
4.2 移動端技術解決方案
1.移動端瀏覽器相容問題
移動端瀏覽器基本以 webkit 核心為主,因此我們就考慮webkit相容性問題。
我們可以放心使用 H5 標籤和 CSS3 樣式。
同時我們瀏覽器的私有字首我們只需要考慮新增 webkit 即可
2.移動端公共樣式
移動端 CSS 初始化推薦使用 normalize.css/
Normalize.css:保護了有價值的預設值
Normalize.css:修復了瀏覽器的bug
Normalize.css:是模組化的
Normalize.css:擁有詳細的文件
官網地址: http://necolas.github.io/normalize.css/
4.3 移動端大量使用 CSS3盒子模型box-sizin
傳統模式寬度計算:盒子的寬度 = CSS中設定的width + border + padding
CSS3盒子模型: 盒子的寬度= CSS中設定的寬度width 裡面包含了 border 和 padding
也就是說,我們的CSS3中的盒子模型, padding 和 border 不會撐大盒子了
/*CSS3盒子模型*/
box-sizing: border-box;
/*傳統盒子模型*/
box-sizing: content-box;
移動端可以全部CSS3 盒子模型
PC端如果完全需要相容,我們就用傳統模式,如果不考慮相容性,我們就選擇 CSS3 盒子模型
4.4移動端特殊樣式
/*CSS3盒子模型*/
box-sizing: border-box;
-webkit-box-sizing: border-box;
/*點選高亮我們需要清除清除 設定為transparent 完成透明*/
-webkit-tap-highlight-color: transparent;
/*在移動端瀏覽器預設的外觀在iOS上加上這個屬性才能給按鈕和輸入框自定義樣式*/
-webkit-appearance: none;
/*禁用長按頁面時的彈出選單*/
img,a { -webkit-touch-callout: none; }
5.0移動端常見佈局
移動端單獨製作
- 流式佈局(百分比佈局)
- flex 彈性佈局(強烈推薦)
- less+rem+媒體查詢佈局
- 混合佈局
響應式
- 媒體查詢
- bootstarp
流式佈局:
流式佈局,就是百分比佈局,也稱非固定畫素佈局。
通過盒子的寬度設定成百分比來根據螢幕的寬度來進行伸縮,不受固定畫素的限制,內容向兩側填充。
流式佈局方式是移動web開發使用的比較常見的佈局方式。
移動web開發——flex佈局
1.0傳統佈局和flex佈局對比
1.1傳統佈局
- 相容性好
- 佈局繁瑣
- 侷限性,不能再移動端很好的佈局
1.2 flex佈局
- 操作方便,佈局極其簡單,移動端使用比較廣泛
- pc端瀏覽器支援情況比較差
- IE11或更低版本不支援flex或僅支援部分
1.3 建議
- 如果是pc端頁面佈局,還是採用傳統方式
- 如果是移動端或者是不考慮相容的pc則採用flex
2.0 flex佈局原理
- flex 是 flexible Box 的縮寫,意為"彈性佈局",用來為盒狀模型提供最大的靈活性,任何一個容器都可以指定為 flex 佈局。
- 當我們為父盒子設為 flex 佈局以後,子元素的 float、clear 和 vertical-align 屬性將失效。
- flex佈局又叫伸縮佈局 、彈性佈局 、伸縮盒佈局 、彈性盒佈局
- 採用 Flex 佈局的元素,稱為 Flex 容器(flex
container),簡稱"容器"。它的所有子元素自動成為容器成員,稱為 Flex 專案(flex
item),簡稱"專案"。
總結:就是通過給父盒子新增flex屬性,來控制子盒子的位置和排列方式
3.0 父項常見屬性
- flex-direction:設定主軸的方向
- justify-content:設定主軸上的子元素排列方式
- flex-wrap:設定子元素是否換行
- align-content:設定側軸上的子元素的排列方式(多行)
- align-items:設定側軸上的子元素排列方式(單行)
- flex-flow:複合屬性,相當於同時設定了 flex-direction 和 flex-wrap
3.1 flex-direction設定主軸的方向
- 在 flex 佈局中,是分為主軸和側軸兩個方向,同樣的叫法有 : 行和列、x 軸和y 軸
- 預設主軸方向就是 x 軸方向,水平向右
- 預設側軸方向就是 y 軸方向,水平向下
- 注意: 主軸和側軸是會變化的,就看 flex-direction 設定誰為主軸,剩下的就是側軸。而我們的子元素是跟著主軸來排列的
3.2 justify-content 設定主軸上的子元素排列方式
3.3 flex-wrap設定是否換行
- 預設情況下,專案都排在一條線(又稱”軸線”)上。flex-wrap屬性定義,flex佈局中預設是不換行的。
- nowrap 不換行
- wrap 換行
3.4 align-items 設定側軸上的子元素排列方式(單行 )
- 該屬性是控制子項在側軸(預設是y軸)上的排列方式 在子項為單項(單行)的時候使用
- flex-start 從頭部開始
- flex-end 從尾部開始
- center 居中顯示
- stretch 拉伸
3.5 align-content 設定側軸上的子元素的排列方式(多行)
設定子項在側軸上的排列方式 並且只能用於子項出現 換行 的情況(多行),在單行下是沒有效果的。
3.6 align-content 和align-items區別
- align-items 適用於單行情況下, 只有上對齊、下對齊、居中和 拉伸
- align-content適應於換行(多行)的情況下(單行情況下無效), 可以設定 上對齊、下對齊、居中、拉伸以及平均分配剩餘空間等屬性值。
- 總結就是單行找align-items 多行找 align-content
3.7 flex-flow 屬性是 flex-direction 和 flex-wrap 屬性的複合屬性
flex-flow:row wrap;
4.0 flex佈局子項常見屬性
- flex子專案佔的份數
- align-self控制子項自己在側軸的排列方式
- order屬性定義子項的排列順序(前後順序)
4.1 flex 屬性
flex 屬性定義子專案分配剩餘空間,用flex來表示佔多少份數。
.item {
flex: <number>; /* 預設值 0 */
}
4.2 align-self控制子項自己在側軸上的排列方式
align-self 屬性允許單個專案有與其他專案不一樣的對齊方式,可覆蓋 align-items 屬性。
預設值為 auto,表示繼承父元素的 align-items 屬性,如果沒有父元素,則等同於 stretch。
span:nth-child(2) {
/* 設定自己在側軸上的排列方式 */
align-self: flex-end;
}
4.3 order 屬性定義專案的排列順序
數值越小,排列越靠前,預設為0。
注意:和 z-index 不一樣。
.item {
order: <number>;
}
5.0 攜程網首頁案例製作
攜程網連結:http://m.ctrip.com
1.技術選型
方案:我們採取單獨製作移動頁面方案
技術:佈局採取flex佈局
2.搭建相關資料夾
3.設定視口標籤以及引入初始化樣式
<meta name="viewport" content="width=device-width, user-scalable=no,initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="css/normalize.css">
<link rel="stylesheet" href="css/index.css">
4.常用初始化樣式
body {
max-width: 540px;
min-width: 320px;
margin: 0 auto;
font: normal 14px/1.5 Tahoma,"Lucida Grande",Verdana,"Microsoft Yahei",STXihei,hei;
color: #000;
background: #f2f2f2;
overflow-x: hidden;
-webkit-tap-highlight-color: transparent;
}
5.模組名字劃分