移動端web前端開發


 

移動端瀏覽器現狀

視口

meta視口標簽

二倍圖

移動端主流方案

移動端技術解決方案

移動端常見布局

       1.流式布局(百分比布局)

       2.flex布局

       3.rem適配布局

    1)rem單位
    2)媒體查詢
    3)less
    4)rem 適配方案

    5)案例1

    6)案例2

 

 

 

移動端瀏覽器現狀:

國內的UC和QQ,百度等手機瀏覽器都是根據Webkit修改過來的內核,國內尚無自主研發的內核,兼容移動端主瀏覽器,處理Webkit內核瀏覽器即可

 

移動端屏幕尺寸

    參考:https://www.material.io/resources/devices/

說明:作為前端開發,不建議糾結dp,dpi,pt,ppi等單位,使用px即可。

 

 

視口

視口( viewport )就是瀏覽器顯示頁面內容的屏幕區域。視口可以分為布局視口、 視覺視口和理想視口

 1.  布局視口layout viewport

  一般移動設備的瀏覽器都默認設置了一個布局視口,用於解決早期的PC端頁面在手機上顯示的問題。

  iOS, Android基本都將這個視口分辨率設置為980px ,所以PC上的網頁大多都能在手機上呈現,不過元素看上去很小,-般默認可以通過手動縮放網頁。

 

2.  視覺視口visual viewport

  字面意思,它是用戶正在看到的網站的區域。注意:是網站的區域。

  我們可以通過縮放去操作視覺視口, 但不會影響布局視口,布局視口仍保持原來的寬度。

 

3.理想視口ideal viewport

為了使網站在移動端有最理想的瀏覽和閱讀寬度而設定

理想視口,對設備來講,是最理想的視口尺寸

需要手動添寫meta視口標簽通知瀏覽器操作

meta視口標簽的主要目的:布局視口的寬度應該與理想視口的寬度一致,簡單理解就是設備有多寬,我們布局的視口就多寬

 

 

meta視口標簽

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

說明:

 (1)只要做移動端適配,就對頁面添加此標簽,此標簽能夠使得頁面不在按照980px進行加載

 (2)必要內容:

width=device-width 設置頁面視口大小和設備尺寸大小相同

user-scalable=no   設置用戶不可對頁面進行放大縮小設置

initial-scale=1.0  設置頁面加載倍率為1倍

 (3)可選內容:

minimum-scale=1.0  設置頁面最小縮小倍率為1.0

maximum-scale=1.0  設置頁面最大放大倍率為1.0

 

 

二倍圖

物理像素&物理像素比

  物理像素點指的是屏幕顯示的最小顆粒,是物理真實存在的。這是廠商在出廠時就設置好了,比如蘋果6\7\8是750* 1334

  我們開發時候的1px不是一定等於1個物理像素的

  PC端頁面, 1個px等於1個物理像素的,但是移動端就不盡相同

  一個px的能顯示的物理像素 點的個數,稱為物理像素比或屏幕像素比

 

例如:iPhone8物理像素寬為750像素,實際占屏幕像素的375像素

 

PC端和早前的手機屏幕/普通手機屏幕: 1CSS像素= 1物理像素的

Retina (視網膜屏幕)是一種顯示技術,可以將把更多的物理像素點壓縮至一塊屏幕里 ,從而達到更高的分辨率,並提高屏幕顯示的細膩程度。

 

多倍圖

  對於一張50px*50px的圖片,在手機Retina屏中打開,按照剛才的物理像素比會放大倍數,這樣會造成圖片模糊

  在標准的viewport設置中,使用倍圖來提高圖片質量,解決在高清設備中的模糊問題

  通常使用二倍圖,因為iPhone 6\7\8的影響,但是現在還存在3倍圖4倍圖的情況,這個看實際開發公司需求

  背景圖片注意縮放問題

 

二倍圖說明

  1. 需要一個50*50像素(css像素)的圖片直接放到我們的iphone8里面會放大2倍100*100就會模糊
  2. 采取的是放一個100* 100圖片然后手動的把這個圖片縮小為50*50(css像素)
  3. 准備的圖片比我們實際需要的大小大2倍,這就方式就是2倍圖

 

背景縮放

background-size: contain;   //css3新增

  單位:長度 |百分比Icover Icontain;

  cover把背景圖像擴展至足夠大,以使背景圖像完全覆蓋背景區域。

  contain把圖像圖像擴展至最大尺寸,以使其寬度和高度完全適應內容區域

 

倍圖解釋:@3X 3倍圖;@2X 2倍圖;@1X 1倍圖;

 

二倍精靈圖做法;

  在firework里面把精靈圖等比例縮放為原來的一半

  之后根據大小測量坐標

  注意代碼里面background-size也要寫 :精靈圖原來寬度的一半

 

 

移動端主流方案

 1.  單獨制作移動端頁面(主流)

  通常情況下,網址域名前面加m(mobile)可以打開移動端。通過判斷設備,如果是移動設備打開,則跳到移動端頁面

例如:京東商城手機版、淘寶觸屏版、蘇寧易購手機版...

 

2.  響應式頁面兼容移動端(其次)

  通過判斷屏幕寬度來改變樣式,以適應不同終端。

例如:三星手機官網...

缺點:制作麻煩,需要花很大精力去調兼容性問題

 

移動端技術解決方案

 1.  移動端瀏覽器

  移動端瀏覽器基本以webkit內核為主,因此我們就考慮webkit兼容性問題。

  我們可以放心使用H5標簽和CSS3樣式。

  同時我們瀏覽器的私有前綴我們只需要考慮添加webkit即可

 

2.  CSS初始化normalize.css

  移動端CSS初始化推薦使用normalize.css/

  Normalize.css :保護了有價值的默認值

  Normalize.css :修復了瀏覽器的bug

  Normalize.css :是模塊化的

  Normalize.css :擁有詳細的文檔

官網地址: http://necolas.github.io/normalize.css/

 

3.  CSS3盒子模型box-sizing

  傳統模式寬度計算: 盒子的寬度= CSS中設置的width + border + padding

  CSS3盒子模型: 盒子的寬度= CSS中設置的寬度width里面包含了border和padding

也就是說,我們的CSS3中的盒子模型,padding 和border不會撐大盒子了

/*CSS3盒子模型*/

box-sizing: border-box;

/*傳統盒子模型* /

box-sizing: content-box;

 

傳統or CSS3盒子模型?

  移動端可以全部CSS3盒子模型

  PC端如果完全需要兼容 ,我們就用傳統模式,如果不考慮兼容性,我們就選擇CSS3盒子模型

 

 4.  特殊樣式

/*CSS3盒子模型+/

box-sizing: border-box;

-webkit-box-sizing: border-box;

/*點擊高亮我們需要清除清除 設置為transparent完成透明,適用於iso的鏈接與可點擊元素*/

-webkit-tap-highlight-color: transparent;

/*在移動端瀏覽器默認的外觀ios上加。上這個屬性才能給按鈕和輸入框自定義樣式*/

-webkit-appearance: none;

/大禁用長按頁面時的彈出菜單*/

img,a { -webkit-touch-callout: none;}

 

 

移動端常見布局

 

移動端技術選型

  移動端布局和以前我們學習的PC端有所區別

1.單獨制作移動端頁面(主流)

  流式布局(百分比布局)

  flex彈性布局(強烈推薦)

  less + rem+媒體查詢布局

  混合布局

 

2.  響應式頁面兼容移動端(其次)

  媒體查詢

  bootstrap

 

 

常用布局

1.  流式布局(百分比布局)

  流式布局,就是百分比布局,也稱非固定像素布局。

  通過盒子的寬度設置 成百分比來根據屏幕的寬度來進行伸縮,不受固定像素的限制,內容向兩側填充。

  流式布局方式是移動web開發使用的比較常見的布局方式。

  max-width 最大寬度( max-height最大高度)

  min-width 最小寬度 ( min-height最小高度)

 

設置視口標簽以及引入初始化樣式

<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">

 

 

常用初始化樣式

body {

    margin: 0 auto;

    min-width: 320px;

    max-width: 640px;

    background: #fff;

    font-size: 14px;

    font-family: -apple-system, Helvetica, sans-serif;

    line-height: 1.5;

    color: #666;

}

 

 2.  flex布局

 

傳統布局與flex布局

傳統布局

    兼容性好

    布局繁瑣

    局限性,不能再移動端很好的布局

 

flex彈性布局

    操作方便,布局極為簡單,移動端應用很廣泛

    PC端瀏覽器支持情況較差

    IE11或更低版本,不支持或僅部分支持

 

建議:

1.如果是PC端頁面布局,我們還是傳統布局。

2.如果是移動端或者不考慮兼容性問題的PC端頁面布局,我們還是使flex彈性布局

 

布局原理

1)  flex是flexible Box的縮寫,為"彈性布局" ,來為盒狀模型提供最大的靈活性,任何一個容器都可以指定為flex布局。

 

2)  當我們為父盒子設為flex布局以后,子元素的float、clear 和vertical-align屬性將失效。

伸縮布局=彈性布局=伸縮盒布局=彈性盒布局=flex布局

 

3)  采用Flex布局的元素,稱為Flex容器( flex container) , 簡稱"容器"。它的所有子元素自動成為容器成員,稱為Flex項目( flex item) , 簡稱"項目"。

 

總結:flex布局原理:就是通過給父盒子添加flex屬性,來控制子盒子的位置和排列方式。

 

常見父項屬性

 

以下由6個屬性是對父元素設置的

display: flex;  //設置為flex布局

flex-direction :設置主軸的方向

說明:主軸默認x軸,水平向右,側軸默認y軸,水平向下;主軸和側軸是變化的,flex-direction設置誰為主軸,剩下的就是側軸。

屬性:row 默認值,從左到右;row-reverse 從右到左;column 從上到下;column- reverse從下到上

 

justify-content :設置主軸上的子元素排列方式

    注意:使用這個屬性之前一定要確定好主軸是哪個

屬性:

  flex-start默認值從頭部開始如果主軸是x軸,則從左到右

  flex-end從尾部開始排列

  center在主軸居中對齊(如果主軸是x軸則水平居中)

  space-around平分剩余空間

  space-between先兩邊貼邊再平分剩余空間(重要)

 

flex-wrap :設置子元素是否換行

    說明:默認情況下,項目都排在一條線(又稱“軸線”). 上。flex-wrap屬性定義, flex布局中默認是不換行的。

屬性:

    nowrap 默認,不換行

    wrap 換行

 

align-items :設置側軸(默認是在y軸)上的子元素排列方式(單行)

    屬性:flex-start 默認值 從上到下;flex-end 從下到上;center 擠在一起居中(垂直居中);stretch 拉伸

 

align-content :設置側軸上的子元素的排列方式(多行)

    說明:設置子項在側軸上的排列方式並且只能用於子項出現換行的情況(多行) , 在單行下是沒有效果的。

屬性值:

  flex-start默認值在側軸的頭部開始排列

  flex-end在側軸的尾部開始排列

  center在側軸中間顯示

  space-around子項在側軸平分剩余空間

  space-between子項在側軸先分布在兩頭,再平分剩余空間

  stretch 設置子項元素高度平分父元素高度

 

align-content和align-items區別

  align-items適用於單行情況下,只有上對齊、下對齊、 居中和拉伸

  align-content適應於換行(多行)的情況下(單行情況下無效),可以設置上對齊、下對齊、 居中、拉伸以及平均分配剩余空間等屬性值。

  總結就是單行找align-items多行找align-content

 

flex-flow :復合屬性,相當於同時設置了flex-direction 和flex-wrap

 

常見子項屬性

flex屬性定義好項目分配剩余空間,用flex來表示多少份數

item {

  flex: <number>; /* default 0 */

}

 

align-self控制子項自己在側軸上的排列方式

  說明:align-self屬性允許單個項目有與其他項目不-樣的對齊方式,可覆蓋align-items屬性。默認值為auto ,表示繼承父元素的align-items屬性,如果沒有元素,則等同於stretch。

 

order屬性定義項目的排列順序

  說明:數值越小,排列越靠前,默認為0。

  注意:和z-index不一樣。

 

 3.  rem適配布局

1)rem單位

rem (root em)是一個相對單位 ,類似於em , em是元素字體大小。

不同的是rem的基准是相對於html元素的字體大小

比如,根元素( html )設置font-size= 12px;非根元素設置width:2rem;則換成px表示就是24px。

 

2)媒體查詢

媒體查詢( Media Query )是CSS3新語法。

  使用@media查詢,可以針對不同的媒體類型定義不同的樣式

  @media可以針對不同的屏幕尺寸設置不同的樣式

  當你重置瀏覽器大小的過程中,頁面也會根據瀏覽器的寬度和高度重新渲染頁面

  目前針對很多蘋果手機、Android手機 ,平板等設備都用得到多媒體查詢

 

語法規范

@media mediatype and|not|only(media feature){

  CSS-Code;
}

 

media query語法格式中支持設備類型(mediatype )如下:

  all 適用於所有的設備
  aural適用於語音和音頻合成器
  braille 適用於觸覺反饋設備
  embossed 適用於凸點文字(盲文)和刷設備
  handheld 適用於小型或者手提設備
  print適用於打印機
  projection 適用於投影圖像,如幻燈片
  sceen 適用於計算機顯示器(最常用的一個)
  tty適用於使用固定間距字符格的設備如電傳打字機和終端
  tv適用於電視類設備

 

關鍵字

  關鍵字將媒體類型或多個媒體特性連接到-起做為媒體查詢的條件。

and :可以將多個媒體特性連接到一起,相當於“且”的意思。

not :排除某個媒體類型,相當於“非”的意思,可以省略。

only :指定某個特定的媒體類型,可以省略。

 

媒體特性(media feature)

  每種媒體類型都具體各自不同的特性,根據不同媒體類型的媒體特性設置不同的展示風格。我們了解三個。

注意他們要加小括號包含

width:定義輸出設備中頁面可見區域的寬度

min-width:定義輸出設備中頁面最小可見區域寬度

max-width:定義輸出設備中頁面最大可見區域寬度

 

例如:@media screen and(min-width:1024px){/* 當屏幕小於1024px,發生的事*/

  css語句

}

 

注意:為了防止混亂,媒體查詢我們要按照從小到大或者從大到小的順序來寫,但是我們最喜歡的還是從小到大來寫,這樣代碼更簡潔

 

還有一種引入資源的方式

<link rel="stylesheet" media="mediatype and|not|only(media feature)" href="mystylesheet.css">

 

針對不同的媒體使用不同stylesheets

 

 

3)less

維護css的弊端

CSS是一門非程序式語言,沒有變量、函數、SCOPE (作用域)等概念。

CSS 需要書寫大量看似沒有邏輯的代碼, CSS冗余度是比較高的。

不方便維護及擴展,不利於復用。

CSS沒有很好的計算能力

非前端開發 工程師來講,往往會因為缺少CSS編寫經驗而很難寫出組織良好且易於維護的CSS代碼項目。

 

Less介紹

Less ( Leaner Style Sheets的縮寫)是一門CSS擴展語言,也成為CSS預處理器。

做為CSS的一種形式的擴展,它並沒有減少CSb的功能,而是在現有的CSS語法上,為CSS加入程序式語

言的特性。

它在CSS的語法基礎之上,引入了變量, Mixin(混入) , 運算以及函數等功能,大大簡化了CSS的編寫

,並且降低了CSS的維護成本,就像它的名稱所說的那樣, Less可以讓我們用更少的代碼做更多的事情。

Less中文網址: http://lesscss.cn/

常見的CSS預處理器: Sass、Less、 Stylus

 

Less安裝

①安裝nodejs ,可選擇版本,網址: http://nodejs.cn/download/

②檢查是否安裝成功 ,使用cmd命令( windows是window +r打開運行輸入cmd) --- 輸入“node -v"查看版本即可

③基於nodejs在線安裝Less ,使佣cmd命令“ npm install -g less"即可

④檢查是否安裝成功 ,使用cmd命令"lessc -v” 查看版本即可

 

Less使用

我們首先新建一個后綴名為less的文件,在這個less文件里面書寫less語句。

Less變量:

  變量是指沒有固定的值,可以改變的。因為我們CSS中的一些顏色和數值等經常使用。

語法:@變量名:值;

規范:必須有@為前綴    不能包含特殊字符    不能以數字開頭    大小寫敏感

例如:@color: red;

 

Less編譯:

  本質上,Less 包含一套自定義的語法及一個解析器,用戶根據這些語法定義自己的樣式規則,這些規則 最終會通過解析器,編譯生成對應的 CSS 文件。所以,我們需要把我們的 less文件,編譯生成為css文件,這樣我們的html頁面才能使用

  可以使用開發工具的編譯插件(如:vscodehbuilderx)或者使用像kaola軟件一樣的預處理語言開發工具。

 

Less嵌套:

我們經常用到選擇器的嵌套

#header .logo {

width: 300px;

}

Less 嵌套寫法

#header {

    .logo {

        width: 300px;

    }

}

 

如果遇見 (交集|偽類|偽元素選擇器)

  內層選擇器的前面沒有 & 符號,則它被解析為父選擇器的后代;

  如果有 & 符號,它就被解析為父元素自身或父元素的偽類

a:hover{

    color:red;

}

Less 嵌套寫法

a{

    &:hover{

        color:red;

    }

}

 

Less運算

  任何數字、顏色或者變量都可以參與運算。就是Less提供了加(+)、減(-)、乘(*)、除(/)算術運算。

/*Less 里面寫*/

@witdh: 10px + 5;

div {

    border: @witdh solid red;

}

/*生成的css*/

div {

    border: 15px solid red;

}

/*Less 甚至還可以這樣 */

width: (@width + 5) * 2;

 

注意

  乘號(*)和除號(/)的寫法

  運算符中間左右有個空格隔開 1px + 5

  對於兩個不同的單位的值之間的運算,運算結果的值取第一個值的單位

  如果兩個值之間只有一個值有單位,則運算結果就取該單位

 

4)rem 適配方案

  讓一些不能等比自適應的元素,達到當設備尺寸發生改變的時候,等比例適配當前設備。

  使用媒體查詢根據不同設備按比例設置html的字體大小,然后頁面元素使用rem做尺寸單位,當html字體大小變化元素尺寸也會發生變化,從而達到等比縮放的適配。

 

4.1 rem 實際開發適配方案

① 按照設計稿與設備寬度的比例,動態計算並設置 html 根標簽的 font-size 大小;(媒體查詢)

② CSS 中,設計稿元素的寬、高、相對位置等取值,按照同等比例換算為 rem 為單位的值;

 

4.2 rem 適配方案技術使用(市場主流)

技術方案1

技術方案2(推薦)

less

媒體查詢

rem

flexible.js

rem

 

 

總結:兩種方案現在都存在。方案2 更簡單。

 

4.3 rem 實際開發適配方案1

  rem + 媒體查詢 + less 技術

①  設計稿常見尺寸寬度

設備

常見寬度

iphone  4.5

640px

640px

750px

Android

常見320px、360px、375px、384px、400px、414px、500px、720px

大部分4.7~5寸的安卓設備為720px

一般情況下,我們以一套或兩套效果圖適應大部分的屏幕,放棄極端屏或對其優雅降級,犧牲一些效果 現在基本以750為准。

 

②動態設置 html 標簽 font-size 大小

l  假設設計稿是750px

l  假設我們把整個屏幕划分為15等份(划分標准不一可以是20份也可以是10等份)

l  每一份作為html字體大小,這里就是50px

l  那么在320px設備的時候,字體大小為320/15 就是 21.33px

l  用我們頁面元素的大小 除以不同的 html 字體大小會發現他們比例還是相同的

l  比如我們以 750為標准設計稿

l  一個100*100像素的頁面元素 在 750屏幕下, 就是 100 / 50  轉換為rem  是 2rem * 2 rem  比例是 1比1

l  320屏幕下, html 字體大小為 21.33   則 2rem =  42.66px  此時寬和高都是 42.66  但是 寬和高的比例還是 1比1

l  但是已經能實現不同屏幕下 頁面元素盒子等比例縮放的效果

 

③元素大小取值方法

  最后的公式: 頁面元素的rem值 =  頁面元素值(px) /  (屏幕寬度 /  划分的份數)

  屏幕寬度/划分的份數 就是 html font-size 的大小

  或者: 頁面元素的rem值 =  頁面元素值(px) /  html font-size 字體大

 

4.4 rem 實際開發適配方案2

l  簡潔高效的rem適配方案flexible.js

l  手機淘寶團隊出的簡潔高效移動端適配庫

l  我們再也不需要在寫不同屏幕的媒體查詢,因為里面js做了處理

l  它的原理是把當前設備划分為10等份,但是不同設備下,比例還是一致的。

l  我們要做的,就是確定好我們當前設備的html 文字大小就可以了

l  比如當前設計稿是 750px,那么我們只需要把 html 文字大小設置為75px(750px / 10) 就可以

l  里面頁面元素rem值:頁面元素的px 值 /  75 

l  剩余的,讓flexible.js來去算

 

github地址:https://github.com/amfe/lib-flexible

 

 

5)案例1:

5.1. 技術選型

方案:我們采取單獨制作移動頁面方案

技術:布局采取rem適配布局(less + rem  + 媒體查詢)

設計圖: 本設計圖采用750px 設計尺寸

 

5.2. 搭建相關文件夾結構

 

 

 

5.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">

 

5. 4. 設置公共common.less文件

①新建common.less 設置好最常見的屏幕尺寸,利用媒體查詢設置不同的html字體大小,因為除了首頁其他頁面也需要

②我們關心的尺寸有 320px、36v0px、375px、384px、400px、414px、424px、480px、540px、720px、750px

③划分的份數我們定為 15等份

④因為我們pc端也可以打開我們移動端首頁,我們默認html字體大小為50px,注意這句話寫到最上面

 

5.5. 新建index.less文件
① 新建index.less 這里面寫首頁的樣式

② 將剛才設置好的 common.less 引入到index.less里面 語法如下:

  // 在 index.less 中導入 common.less 文件
  @import “common”
③ 生成index.css 引入到 index.html 里面

 

5.6. body樣式

body { 
    min-width: 320px;
    width:15rem;
    margin: 0 auto;
    line-height: 1.5;
    font-family: Arial,Helvetica;
    background: #F2F2F2;
}

 

6)案例2:

6.1. 技術選型

方案:我們采取單獨制作移動頁面方案

技術:布局采取rem適配布局2(flexible.js +  rem)

設計圖: 本設計圖采用750px 設計尺寸

 

6.2. 搭建相關文件夾結構

 

 

6.3. 設置視口標簽以及引入初始化樣式還有js文件

<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">

 

頁面需要引入這個js文件

在 index.html 中 引入 flexible.js 這個文件

<script src=“js/flexible.js”> </script>

 

6.4. body樣式

body {

    min-width: 320px;

    width:10rem;

    margin: 0 auto;

    line-height: 1.5;

    font-family: Arial,Helvetica;

    background: #F2F2F2;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM