移動端頁面開發(新手須知)
移動端頁面開發
移動客戶端的開發型別(站在前端立場上來說),主要是三種:
Native App(原生APP),也就是完全使用移動裝置系統語言寫的客戶端,iPhone iPad就是純Object-C,安卓就是純JAVA, 是效能最棒的開發方式,但靈活性不好。
Web App, 就是在移動瀏覽器裡開啟的,純HTML+CSS+JS,說白了就是個網頁,只不過非常的富應用,比如手機瀏覽器訪問的GMAIL。就是在瀏覽器裡開啟的頁面。IOS支援可以在桌面建立訪問的快捷方式,但是說到底還是開啟Safari跑。而且對裝置硬體的介面什麼的挺薄弱。
Hybrid App.[HTML5 in mobile devices] 。實際上是使用原生寫了一個容器,然後使用HTML+CSS+JS來實現使用者介面和互動。Web App的短處便可以克服(因為自己寫的容器可以輔助暴露偏底層的介面,比如本地儲存或者麥克風控制之類),同時比起純原生的java或者object-c開發靈活性要高(更新可以更快更迅速,也不依賴於市場,因為說白了,就是自己下載更新網頁資源。)實際上這種方式已經不限於移動端。豌豆莢其實是個pc端的hybrid
app。
就目前來說,我們只需要考慮webkit核心的瀏覽器和chrome,uc,qq,小米手機瀏覽器就好了。移動端更新換代比pc快多了,相容性問題會越來越少。但移動裝置的尺寸不同,移動端需要做大量的適配工作。
一.移動端彈性佈局適配
1.邏輯解析度和物理解析度
眾所周知,手機螢幕解析度是手機的重要引數之一。
大家都知道移動端裝置螢幕尺寸非常多,碎片化嚴重。尤其是Android,你會聽到很多種解析度:480×800, 480×854, 540×960, 720×1280, 1080×1920,而且還有傳說中的2K屏、4K、5k等。近年來iPhone的碎片化也加劇了:640×960, 640×1136, 750×1334, 1242×2208。
俗話說物理解析度是硬體所支援的,邏輯解析度是軟體可以達到的。
物理尺寸是指螢幕的實際大小。大的螢幕同時必須要配備高解析度,也就是在這個尺寸下可以顯示多少個畫素,顯示的畫素越多,可以表現的餘地自然越大。而真正決定顯示效果的,是邏輯畫素尺寸。
我們在viewport中,獲取到的,如"width-device",是邏輯畫素。所以我們的適配是針對邏輯畫素尺寸的。
dpi,表示的是每英寸所擁有的畫素(pixel)數目,數值越高,即代表顯示屏能夠以越高的密度顯示影象。當達到人眼的極限解析度時,喬幫主給它取了一個很高階的名字——Retina。
2.rem
em單位是相對於父節點的font-size。CSS3新增了一個相對單位rem(root em,根em)。
這個單位與em有什麼區別呢?區別在於使用rem為元素設定字型大小時,仍然是相對大小,但相對的只是HTML根元素。這個單位可謂集相對大小和絕對大小的優點於一身,通過它既可以做到只修改根元素就成比例地調整所有字型大小,又可以避免字型大小逐層複合的連鎖反應。目前,除了IE8及更早版本外,所有瀏覽器均已支援rem。對於不支援它的瀏覽器,應對方法也很簡單,就是多寫一個絕對單位的宣告。這些瀏覽器會忽略用rem設定的字型大小。
3.建立媒體查詢
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
meta標籤表示:強制讓文件的寬度與裝置的寬度保持1:1,並且文件最大的寬度比例是1.0,且不允許使用者點選螢幕放大瀏覽;
媒體查詢還有很多引數,這裡不再細述。
4.適配方案
我們採用rem進行移動端的適配。根據設計稿定高寬設計出來頁面,然後轉換為rem單位。
第一種:CSS
@media only screen and (max-width: 320px), only screen and (max-device-width:320px) {
html {
font-size:10px;
}
}
@media only screen and (max-width: 640px), only screen and (max-device-width:640px) {
html {
font-size:20px;
}
}
.test-div{width: 10rem;}
那麼這個.test-div的寬度在320px的解析度下會是10 * 10 = 100px, 在640下是10 * 20 = 200px,從而達到了彈性縮放的目的。
但是這樣做還是有2個問題:
①隨著各種新手機的釋出,解析度也碎片化了,我們無法預知將來會出現的解析度寬度,我們不可能把所有要相容的解析度寫到css裡。
②這樣寫只能做到頁面適配不同的寬度,對於那種在各種螢幕上都要在一螢幕內顯示的頁面,就沒有辦法適配了。
第二種:CSS+js
比較理想解決適配的問題就得靠js了,思路非常簡單,判斷一下當前終端的寬度和設計稿寬度的比例,計算出需要縮放的倍數,然後根據這個倍數值改變html的字型大小即可。
如果需要橫豎屏都適配,那麼根據終端寬高比例較小的那一個來計算。用通俗的語言來說,如果終端螢幕比設計稿更加寬矮一些,那麼久根據它和設計稿的高度比例來計算字型。外掛程式碼如下:
/*
# 按照寬高比例設定html字型, width=device-width initial-scale=1版
# @pargam win 視窗window物件
# @pargam option{
designWidth: 設計稿寬度,必須
designHeight: 設計稿高度,不傳的話則比例按照寬度來計算,可選
designFontSize: 設計稿寬高下用於計算的字型大小,預設20,可選
callback: 字型計算之後的回撥函式,可選
}
# return Boolean;
# [email protected]
# ps:請儘量第一時間執行此js計算字型
*/
(function ($, window) {
var init = function(option){
var count = 0,
designWidth = option.designWidth,
designHeight = option.designHeight || 0,
designFontSize = option.designFontSize || 20,
callback = option.callback || null,
root = document.documentElement,
body = document.body,
rootWidth, newSize, t, self;
!function () {
rootWidth = root.getBoundingClientRect().width;
self = self ? self : arguments.callee;
//如果此時螢幕寬度不準確,就嘗試再次獲取解析度,只嘗試20次,否則使用win.innerWidth計算
if( rootWidth !== window.innerWidth && count < 20 ) {
window.setTimeout(function () {
count++;
self();
}, 0);
} else {
newSize = getNewFontSize(designWidth,designHeight,designFontSize);
//如果css已經相容當前解析度就不管了
if( newSize + 'px' !== getComputedStyle(root)['font-size'] ) {
root.style.fontSize = newSize + "px";
return callback && callback(newSize);
};
};
}();
orientchange(t);
}
//返回root元素字型計算結果
var getNewFontSize = function(designWidth,designHeight,designFontSize) {
var scale = designHeight !== 0 ? Math.min(window.innerWidth / designWidth, window.innerHeight / designHeight) : window.innerWidth / designWidth;
return parseInt( scale * 10000 * designFontSize ) / 10000;
}
//橫豎屏切換的時候改變fontSize,根據需要選擇使用
var orientchange =function(t) {
window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", function() {
clearTimeout(t);
t = setTimeout(function () {
self = self ? self : arguments.callee;
}, 200);
}, false);
}
var Mobileadapter = function(opt){
if (!opt) {
throw("配置不可為空");
}
var settings = $.extend({
designWidth: 640,
designHeight: 1136,
designFontSize: 20,
callback: function (argument) {
console.timeEnd("test")
}
}, opt);
init.call(this, settings);
}
$.initMobileadapter = Mobileadapter;
}(jQuery, window));
使用:
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript" src="mobileadp.js"></script>
<script>
$(function () {
$.initMobileadapter({
designWidth: 650,
designHeight: 1800,
designFontSize: 20
});
}(jQuery, window));
</script>
幾點問題:
①這段程式碼對viewport有要求,必須是width=device-width initial-scale=1,即視窗的大小是裝置物理寬度(解析度 / devicePixelRatio),並且禁止縮放。另外還有一種做法就是手機淘寶的做法,視窗大小是解析度寬度,然後縮放倍數是1/devicePixelRatio,這裡暫且不討論。
②安卓上的問題。經過實測,有些安卓機器,使用1的viewport,在頁面剛載入的時候。不管是讀取window.innerWidth,還是doc的getBoundingClientRect().width,或者是body的clientWidth,都不是裝置的物理寬度。所以使用setTimeout,非同步100ms執行獲取螢幕寬度的程式碼就準確了。
因為width=device-width initial-scale=1,documentElement的寬度又是100%,所以當這兩個值相等的時候我們可以認為目前獲取到的螢幕寬度是準確的。那麼使用此條件作為判斷條件,不斷的setTimeout(fun(){}, 0)去判斷,當此條件為真時改變documentElement的字型。可以儘可能快的執行目的碼。但是又萬一這兩個值一直不相等又不能無限的死迴圈下去,所以設定了一個嘗試上限,到上限之後用視窗寬度來計算(縮放比例不對的話使用者起碼可以看到完整的頁面)。在chrome下測試,執行40次程式碼的平均時間是230ms,考慮到安卓機的js引擎速度,將上限設為了20。
③建議將這段程式碼放到head裡,第一時間計算好html的fontSize,避免重繪。如果你有有一些跟獲取dom元素尺寸相關的操作,就得放到這個計算函式的回撥裡面了,這時候就不能放到head裡(因為執行的時候dom都還沒載入),只能放到底部或者doc的ready事件裡了。最佳實踐是有一個全屏的loading畫面,當fontSize計算好了之後再把真正的頁面展示出來。
4.基礎介面卡
以Chrome Emulation的Apple iPhone4為基礎(最小螢幕)適配。
5.px與rem的轉換
移動端裝置的解析度:iPhone裝置解析度寬度分別為640、750、828,現在的設計稿一般是使用640、750的寬度。實際開發時需要將寬高減半,包括字型。那麼寬度為640px的設計稿對應的designFontSize就是20px。
將px轉換為rem的公式:&rem=$px /designFontSize * 1rem(&、$為數字);
在css編寫中,我們可以通過函式計算出轉換後的rem。如在sass編寫rem轉換函式如下:
// pixels to rems
$designFontSize: 20px !default; //640px psd
@function pxToRem($px) {
@return $px / $designFontSize * 1rem;
}
在編寫css時直接量取psd設計稿的值,如:
.test-div{width: pxToRem(60px);}
.test-div{width: pxToRem(60px);}
二.移動端頁面開發
由於移動端的相容性較好,儘量使用HTML5+CSS3。尤其CSS3。
CSS3,除了文字陰影(text-shadow)、盒子陰影(box-shadow)、圓角(border-radius)、背景漸變(background: linear-gradient(#000, #fff))、2D變換(transition)、動畫(animation)等大家耳熟能詳的常用屬性外,還有如-webkit-mask、-webkit-text-stroke、-webkit-nbsp-mode、-webkit-tap-highlight-color、-webkit-box-reflect、-webkit-marquee、-webkit-box等。其中-webkit-box可以很好的佈局。
三.移動端js:jQuery Mobile還是Zepto
jQuery Mobile和Zepto是移動端的js庫。jQuery Mobile相當於PC端的jQuery UI,它提供了很多頁面的UI庫,能夠很快的開發出漂亮的介面,適合公司沒有UI設計師的前端開發人員來進行移動端的開發。Zepto相當於PC端的jQuery,它提供了很多方法和功能,能夠很快的實現各種需求和功能,適合公司有UI設計師的前端開發人員來進行移動端的開發。
jQuery Mobile的缺點,主要有兩點:一是重,二是UI限制太大。當然jQuery Mobile效能上沒有zepto好。
zepto.js是一個專為mobile WebKit瀏覽器(如:Safari和Chrome)而開發的一個JavaScript框架。它標榜自己在其簡約的開發理念,能夠幫助開發人員簡單、快速地完成開發交付任務。更重要的是這個JS框架,是超輕量級的,只有5KB。zepto.js的語法借鑑並且相容jQuery。
若考慮移動端與WEB端的統一性選用jquery,單純從移動端來講zepto.js是首選。
四.移動端的模組化元件(大多基於Jquery)
1.整屏滾動元件
2.動畫元件
①檢測動畫結束事件:
$('#yourElement').one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', doSomething);
②可以更改動畫的持續時間,增加延遲或改變顯示次數:
#yourElement {
-vendor-animation-duration: 3s;
-vendor-animation-delay: 2s;
-vendor-animation-iteration-count: infinite;
}
注意:一定要在CSS恬當的的字首(webkit, moz等)代替“vendor”。
③新增延遲動畫:
selector.delay(300).queue(function(){
//do something
}
另外,可以使用move.js實現自定義動畫。
3.拉拽重新整理元件
4.touch對應的swipe事件元件。
-------------------------------------------------------------------------------------------------------------------------------------
完
轉載自https://www.cnblogs.com/jingwhale/p/5095252.html
相關推薦
移動端頁面開發(新手須知)
移動端頁面開發 移動客戶端的開發型別(站在前端立場上來說),主要是三種:Native App(原生APP),也就是完全使用移動裝置系統語言寫的客戶端,iPhone iPad就是純Object-C,安卓就是純JAVA, 是效能最棒的開發方式,但靈活性不好。Web App,
淺談前端移動端頁面開發(佈局篇)
前言的一些碎碎念:最近一直在寫移動端的頁面,不過一直是用的別人造好的輪子,很多時候並沒有想那是為什麼,那是怎麼樣要那麼寫,就跟著別人的文件去了。本以為自己對移動端的那一丟丟理解,結果很多東西都特麼有問題,所以,今天停下了手中的一些東西,來談下移動端的佈局方案吧 內容有些
淺談前端移動端頁面開發(布局篇)
避免 tor 所有 還記得 問題 影響 字符串 ble 開發者 前言的一些碎碎念:最近一直在寫移動端的頁面,不過一直是用的別人造好的輪子,很多時候並沒有想那是為什麽,那是怎麽樣要那麽寫,就跟著別人的文檔去了。本以為自己對移動端的那一丟丟理解,結果很多東西都特麽有問題
移動端頁面開發(一)
從我工作以來,開發的一直都是移動端的頁面,只有偶爾去開發幾個PC端的頁面,現在是一個移動端的時代,移動先行已經深入骨髓,作為一個web前端開發,如果你還在為如何開發移動端頁面而迷茫,或者你還在為開發出了一個在你手機上“完美”的移動頁面而沾沾自喜卻不知移動的世界有多“殘酷”的時候,那你應該看看這篇文章了。希望這
關於移動端頁面開發(微信內建瀏覽器)總結
上個禮拜,剛入職就接到一個移動端的活動頁面專案,重點還是要相容微信瀏覽器,相容主流機型。在這之前,我所做的都是PC端的,想來兩者差別不大,實際動手時遇到的坑還是蠻多的。時間過去的有點久,我也不能把每個坑都列出來,只能寫些印象深刻的。 1、關於頁面背景
移動端混合開發(1):和H5的javascript互動
最近公司專案開發中涉及到了大量的混合開發,這裡開一個系列,把開發中的經驗和遇到的問題和大家分享下 講到移動端的混合開發,繞不開的一個話題就是原生和Js的互動,關於iOS、Android怎麼和js互動,網上的資料很多,這裡先簡單介紹幾個方法。 js
網站開發(周五):項目前端頁面開發(實戰)
als method true ann 網站開發 sca get 1.0 ase 第一、前端基礎簡介 前端網頁:根據此前項目需求分析可知,我們需要開發網站首頁、文章分類頁、搜索頁、正文頁、標簽頁,而一個最基本網頁模版有三部分,網頁頂部導航條、網頁中部主體、網頁底部,其中頂部
移動端頁面開發流程
響應式 聲明 最大 百分比 ref 重啟 mini 應用 cal 移動端頁面布局 一、移動端app分類 1、Native App原生app手機應用程序 使用原生的語言開發的手機應用,Android系統用的是java,ios系統用的是object-C 2、Hybrid A
移動端頁面開發的一些常用的設置
screen 沒有 css 什麽 回彈 功能 div ice 兩個 viewport 視口(可視區窗口)設置詳解 當我們試圖在iPhone中輸出屏幕寬度的時候,會發現屏幕寬度是980,居然和pc屏幕寬度差不多大 蘋果主導的這些手機廠商,為了使用戶獲得完整的WEB體驗,很多設
移動端滑動條(原生JS)
顏色 empty || 原生 pre border relative innerhtml 課程 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"
移動端頁面開發及傳統PC端網頁開發的異同
異同 視頻 分享圖片 ID 技術分享 頁面開發 png width gif 2017年12月份在公司做過一次技術分享,轉眼間過去六個月了.... 今天在感嘆完時間的飛逝之後,拿過來在這裏分享一下吧,話題是:移動端頁面開發及傳統PC端網頁開發的異同,這個ppt
2018移動端頁面開發流程
移動端頁面佈局 一、移動端app分類 1、Native App原生app手機應用程式 使用原生的語言開發的手機應用,Android系統用的是java,ios系統用的是object-C 2、Hybrid App 混合型app手機應用程式 混合使用原生的程式和h
移動端頁面開發適配 rem佈局原理
什麼是適配,為什麼要適配 我們拿到的設計圖一般是以640,750,1080解析度為基準設計的,而現在的手機終端各式各樣,解析度不同,邏輯畫素不同 ,視口不同,所以為了讓我們的頁面在每個裝置上都可以良好的展示,那麼就需要為這些裝置做統一的處理,這個過程就稱為移動端適配。
【前端庫】html 移動端適配(meta方法)
案例單擊我 js程式碼 ;(function(win, lib) { var doc = win.document; var docEl = doc.documentElement; var metaEl = doc.quer
19 01 05 移動端頁面開發
視口 視口是移動裝置上用來顯示網頁的區域,一般會比移動裝置可視區域大,寬度可能是980px或者1024px,目的是為了顯示下整個為PC端設計的網頁,這樣帶來的後果是移動端會出現橫向滾動條,為了避免這種情況,移動端會將視口縮放到移動端視窗的大小。這樣會讓網頁不容易觀看,可以用 meta 標籤,name=“vi
移動端頁面開發 rem.js適配
一般給的設計圖是 750px的,我把螢幕寬度分成7.5份,螢幕總寬度= 7.5rem,例如:設計圖上的10畫素我們開發直接除以100,換算成0.1rem,計算方便快捷,暫時沒發現嚴重bug;如有問題歡迎指正,謝謝! (function (doc, win) { var doc
移動端第三方登入(微信)java驗證並獲取使用者資訊
import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.char
PC端頁面開發基礎-問題總結(一)
工作 bsp align 識別 pos spa 等於 影響 文檔流 本人在做前端開發相關工作時,遇到過也解決過很多技術性問題。今天起,就從PC端頁面開發開始,理一理新手們可能會遇到的那些坑。 本文非教學文章,僅供有前端開發基礎的同學同僚們一起討論與總結,本人將從零開始持續更
移動端web開發總結(自適應)
關於viewport 移動端開發中,通常我們都會設定viewport。關於viewport <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-s
html移動端頁面適配js(採用rem+百分比形式)
(function(win, lib) { var doc = win.document; var docEl = doc.documentElement; var metaEl = doc.querySelector('meta[name="vie