亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

移動Web單頁應用開發實踐——頁面結構化

2024-04-27 15:15:46
字體:
來源:轉載
供稿:網友

1. 前言

在開發面向現代智能手機的移動Web應用的時候,無法避免一個事實,就是需要開發單頁應用(Single Page WebApp)。對于不同的系統需求,單頁應用的粒度會不同,可能是整個系統都使用一個頁面裝載,也可能是按模塊分為獨立頁面裝載。在開發單頁應用時第一個要處理的問題就是頁面結構化,由于多個功能集中在一個頁面呈現,就必然需要考慮如何實現多個視圖布局?如何實現視圖之間動畫切換?等問題。

下面我就來講述下手機搜狐前端團隊在單頁應用開發的頁面結構化上做過的一些嘗試與努力。

2. 頁面視圖

在講頁面結構化之前需要先理解視圖的概念,視圖是單頁應用開發中最常見的模塊,通常在一個單頁應用中,會有多個視圖存在,每一個視圖都可以處理一部分業務功能,所有視圖的功能集就是單頁應用所能處理業務的最大能力。下面介紹幾種單頁應用中最常出現的幾種視圖。

2.1 單視圖層

三段式結構是單視圖的一種最基本布局方式,如下圖:

structure-1

單視圖并不一定都有head或foot,所以Header、Footer使用虛線來表示。多數應用中還會有導航條(Navigatior),但一般情況下導航條會被計算為Header或Content的一部分,而不會獨立存在。

2.2 側邊欄

側邊欄是一種特殊的視圖,在不顯示時,當前視圖是蓋在側邊欄至上的,當它被呼出時,視圖一部分滑出屏幕外,側邊欄才被顯示出來,它的高度等于頁面可視區域的高度。

顯示前:

structure-2

顯示后:

structure-3

2.3 封面圖

封面圖與側邊欄類似,也是一個特殊的視圖。封面圖一般會在頁面初始時候出現,而后消失,消失之后就不再出現。它的視圖層級是最高的,并且完全覆蓋于其他頁面元素,它的高度會大于或等于可視區域的高度。

structure-4

3 多視圖布局

單頁應用中第一個要思考的問題就是:如何實現多視圖的布局?通常我們會將視圖的定位設置為position:absolute,這是一種簡單又實用的方法。在一個時間節點上,頁面可視區域只能有一個可見的當前視圖,虛線表示其他視圖,在頁面可視區域之外不可見(display:none),如下圖:

structure-5

使用偽代碼表示:

CSS

復制代碼
 .view {        position: absolute;        top: 0;        left: 0;        z-index: 99;        display: none;        width: 100%;        height: 100%;    }    .current {        z-index: 100;        display: block;    }復制代碼

HTML

<div class="view current"></div><div class="view"></div>

 

此時,我們需要思考另一個問題:如何實現當前視圖的Content區域內容滾動?視圖的樣式高度設置為height:100%,將視圖高度設定為一屏高的目的是為了方便實現視圖動畫切換的效果(視圖動畫切換會在后面詳細的講)。但這樣做會導致另一個問題,高度為一屏高意味著瀏覽器滾動條失效,無法使用瀏覽器滾動條滾動頁面。

3.1 基于iScroll的多視圖布局

現在比較流行的一種解決方案是使用iScroll組件實現固定區域滾動,這樣就能解決Content區域的滾動問題,在手機搜狐的早期項目也是這么做的。此外,使用iScroll還額外帶來了一些好處,如:

Header區域能固定在頁面頂部,不會因為Content區域滾動導致Header被頂上去;單視圖的高度控制在一屏高,這樣有利于實現視圖之間的動畫切換;

對于這種結構的應用,在使用視圖切換的時候就非常好做,使用CSS3的transition來完成動畫切換,如下圖:

structure-6

使用偽代碼表示:

CSS

復制代碼
.current.out {        -webkit-transition: -webkit-transform 400ms;        -webkit-transform: translate3d(-100%,0,0);    }    .next {        display: block;        -webkit-transform: translate3d(100%,0,0);    }    .next.in{        -webkit-transition: -webkit-transform 400ms;        -webkit-transform: translate3d(0,0,0);    }復制代碼

HTML

<div class="view current out"></div><div class="view next in"></div>

 

視圖切換的動畫效果可以根據業務需求定制,比如:由左向右滑動、由右向左、由上到下、右下到上等都是可以的。在完成切換動畫時,再將next視圖的狀態設置為current,如下:

<div class="view"></div><div class="view current"></div>

 

下圖是項目中使用的一個由下往上動畫切換效果:

structure-7

3.2 iScroll頁面結構下的側邊欄

使用iScroll的頁面結構,無論是側邊欄還是封面圖都非常好實現,看偽代碼:

側邊欄,默認狀態

CSS

復制代碼
    .sidebar {        z-index: 50;        display: block;        width: 80%;    }    .sidebar.show + .current {        -webkit-transition: -webkit-transform 400ms;        -webkit-transform: translate3d(80%,0,0);    }    .sidebar.hide + .current {        -webkit-transition: -webkit-transform 400ms;        -webkit-transform: translate3d(0,0,0);    }復制代碼

HTML

<div class="view sidebar"></div><div class="view current"></div>

 

側邊欄顯示時

<div class="view sidebar show"></div><div class="view current"></div>

 

側邊欄隱藏時,當hide動畫結束之后,移除hide樣式

<div class="view sidebar hide"></div><div class="view current"></div>

 

3.3 iScroll頁面結構下的封面圖

封面圖的實現與側邊欄差不多。

封面圖,默認狀態

CSS

復制代碼
.cover {        z-index: 200;        display: block;        visibility: hidden;        opacity: 0;    }    .cover.show {        visibility: visible;        -webkit-transition: opacity 400ms;        opacity: 1;    }    .cover.hide {        visibility: visible;        -webkit-transition: opacity 400ms;        opacity: 0;    }復制代碼

HTML

<div class="view cover"></div><div class="view current"></div>

 

封面圖顯示時

<div class="view cover show"></div><div class="view current"></div>

 

封面圖隱藏時,當hide動畫結束之后,移除hide樣式

<div class="view cover hide"></div><div class="view current"></div>

 

在項目中的實現效果:

3.4 iScroll對內容刷新的支持

對于Content區域的內容刷新iScroll也有很好的支持,可以直接參見iScroll提供的例子:http://lab.cubiq.org/iscroll/examples/pull-to-refresh/

structure-9

Note:iScroll目前已經更新到了5.0的版本,大家可以關注Github項目https://github.com/cubiq/iscroll/

 

4. 多視圖布局,新的探索

對于單頁應用來說,iScroll確實是一個非常優秀的解決方案,但是iScroll缺有一個最大的缺陷——慢,滾動的性能與瀏覽器原生實現相比,在低端的移動設備上有明顯卡頓,這點我在另一片博文中也提到過《移動Web產品前端開發口訣——“快”》。

Note:目前有一個新的趨勢,瀏覽器經過一兩年的發展,Android下已經優化的相當不錯,iScroll在一些較低端的移動設備上,性能表現得比以前要好非常多,比如小米1,早期的米1還在運行UC7.x的版本時,iScroll明顯的卡,現在在UC9.x下,iScroll也能運行得比較流暢了。

4.1 Fixed+原生Scroll

在此之下,我們也做了一些新的嘗試,第一嘗試就是放棄使用iScroll組件。放棄之后遇到的第一個問題,如何使Header固定位置在頂部?由此,我們使用了原生的CSS特性position:fixed,如下圖:

structure-10

Fixed在一些移動設備瀏覽器上有兼容問題,我找到了一種能檢測瀏覽器是否支持position:fixed的方法,這個也發一篇博文《移動Web開發,4行代碼檢測瀏覽器是否支持position:fixed》,在檢測到瀏覽器不支持fixed時,可以使用absolute作為替代方案,監聽window的scroll事件,每次scroll動作結束時,重新計算一次Header的top值,將其定位到頁面頂部。

有關position:fixed的bug在另一篇博文中《移動端web頁面使用position:fixed問題總結》也有總結。

另外強調一點,不要在Fixed區域中直接使用input或textarea元素。在fixed元素中的input獲取焦點之后,彈出軟鍵盤會帶來很多額外的問題,如:

在iOS下軟鍵盤彈出,fixed定位會出問題;在Android下軟件盤彈出,可能會導致輸入區域被遮擋;

點擊input彈出一個新視圖來完成后續輸入,是一種比較好的解決方案,下圖是一個基于iScroll的頁面結構實現:

structure-11

4.2 原生Scroll下的視圖切換

使用了原生Scroll之后,帶來最大的改變是視圖切換動畫的變化。使用iScroll的頁面結構,視圖的高度固定,并且是position:absolute定位,所以非常容易做視圖切換。

換成原生Scroll之后,想使用一個比較緩和的動畫過渡效果是非常困難的,可選的動畫效果十分有限,經過了很多試驗之后,最后選擇使用淡入-淡出的動畫效果,這是一種折中的方法。最初在完成這種動畫實現的時候,編碼的方法比較簡單,就是將當前視圖淡出,下一視圖淡入,如下圖:

structure-12

后來在做了更多嘗試之后,開發出了一種兼容更強的淡入-淡出動畫過渡。技術要點就是使用一個幕布層(mask)實現淡入效果,在mask完成淡入之后,再完成實際的視圖的切換,操作步驟大致如下:

創建一個幕布層<div class="mask"></div>,mask為position:absolute定位,初始為透明狀態,背景設置為白色或其他顏色,并使mask蓋在當前視圖上面;mask使用transition實現opacity:1的動畫過渡,當完成動畫時,mask將會把當前視圖完全遮住;最后,直接將當前視圖隱藏,將下一視圖顯示既可;完成所有動作之后,隱藏mask;

效果圖:

structure-13

4.3 原生Scroll頁面結構下的側邊欄

側邊欄的結構也變得復雜了一些,使用原生Scroll之后,body的高度會被內容區域撐到很高,但側邊欄還是必須保證一屏高。所以我在側邊欄顯示時,將html與body的高度控制為一屏高,這樣可以防止頁面被滾動。使用偽代碼表示:

側邊欄,默認狀態

CSS

復制代碼
.frame {        height: 100%;    }    .sidebar {        background-color: red;        position: absolute;        z-index: 50;        width: 80%;        height: 100%;    }    .scroller {        background-color: green;        position: relative;        z-index: 100;        height: 2000px;    }    .sidebar-show body, .sidebar-hide body {        height: 100%;    }    .sidebar-show .scroller {        overflow: hidden;        height: 100%;        -webkit-transition: -webkit-transform 400ms;        -webkit-transform: translate3d(80%,0,0);    }    .sidebar-hide .scroller {        overflow: hidden;        height: 100%;        -webkit-transition: -webkit-transform 400ms;        -webkit-transform: translate3d(0,0,0);    }復制代碼

HTML

復制代碼
<html class="frame"><head></head><body><div class="sidebar"></div><div class="scroller"></div></body></html>復制代碼

 

側邊欄顯示時,在html元素上增加一個樣式sidebar-show

<html class="frame sidebar-show">

 

側邊欄隱藏時,將html元素上的樣式替換成sidebar-hide,當hide動畫結束之后,移除hide樣式

<html class="frame sidebar-hide">

 

在項目中的實際效果:

structure-14

另外,將側邊欄設置為position:fixed定位會是另一種實現思路。

4.4 原生Scroll頁面結構下的封面圖

封面圖的實現與側邊欄差不多,使用偽代碼表示:

封面圖,默認為顯示狀態

CSS

復制代碼
    .frame, .frame body {        height: 100%;    }    .cover {        background-color: red;        position: absolute;        z-index: 200;        width: 100%;        height: 100%;    }    .scroller {        background-color: green;        position: relative;        z-index: 100;        height: 2000px;    }    .cover-show body, .cover-hide body {        height: 100%;    }    .cover-show .scroller {        overflow: hidden;        height: 100%;    }    .cover-hide .cover {        -webkit-transition: opacity 400ms;        opacity: 0;    }復制代碼

HTML

復制代碼
<html class="frame cover-show"><head></head><body><div class="cover"></div><div class="scroller"></div></body></html>復制代碼

 

封面圖隱藏時,將html元素上的樣式替換成cover-hide,當hide動畫結束之后,移除hide樣式

<html class="frame cover-hide">

 

項目中的應用:

structure-15

4.5 原生Scroll頁面結構下,內容刷新的實現

一般情況下,我們會頁面底部放一個加載更多的按鈕,讓用戶點擊按鈕加載下一頁內容,如下圖:

structure-16

又或者,監聽window的scroll事件,當頁面發生滾動時,監測是否滾動到頁面底部,自動加載下一頁內容。這兩種方式都能很好的解決加載下一頁的業務需求,但是對于加載最新或刷新的操作只能在頁面中放置一個刷新按鈕來完成業務需求。

對于Pull Up/Down Request的操作,在原生Scroll下,幾乎是無法實現的。但我依然希望能找到一種方法,實現Pull Request操作。

現在我正在研究一種模擬Pull操作的解決方案,已經有了一個雛形,并實現了一些功能。下面這個示例中沒有使用任何的iScroll技術,完全使用原生Scroll實現頁面滾動,并且滾動到頁面底部后可以完成Pull Up操作,如下圖:

structure-17

這個技術的實現原理并不復雜,就是在頁面滾動到底部時,創建一個空白層,模擬Pull Up手勢拖動頁面的效果。

structure-18

我后面會封裝成一個組件放在GitHub上分享給大家。

5 結束語

手機搜狐目前還是一個年輕的前端團隊,在手機搜狐的一年半時間,積累和很多有關移動端Web開發的經驗,寫這篇文章希望能將自己在移動Web方面的一些經驗分享給大家,同時,也希望能有更多的移動Web開發者能互相交流。

https://github.com/maxzhang/maxzhang.github.com/issues/8


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频视频在线| 91九色在线视频| 国产91成人video| 久久久久久91| 国产丝袜一区二区三区免费视频| 国产精品视频久久| 亚洲视频精品在线| 中文字幕国产亚洲2019| 成人在线观看视频网站| 97av在线影院| 欧美大尺度电影在线观看| 成人黄色网免费| 欧美精品情趣视频| 久久99久久亚洲国产| 国产日本欧美视频| 一区二区三区回区在观看免费视频| 久久精品国产欧美亚洲人人爽| 欧美一级片久久久久久久| 精品久久久久久国产| 亚洲第一网站男人都懂| 黄色一区二区三区| 亚洲一区二区三区四区在线播放| 色老头一区二区三区| 日韩电影中文 亚洲精品乱码| 国产精品网站入口| 57pao成人永久免费视频| 日韩欧美在线中文字幕| 欧美—级高清免费播放| 久久精品在线播放| 欧美激情精品久久久久久黑人| 91国自产精品中文字幕亚洲| 在线免费看av不卡| 欧美精品一区在线播放| 国产一区二区视频在线观看| 精品一区二区三区四区在线| 成人中心免费视频| 亚洲bt天天射| 91免费视频网站| 亚洲欧美日韩高清| 最新国产精品亚洲| wwwwwwww亚洲| 国产男女猛烈无遮挡91| 成人精品久久一区二区三区| 国产精品专区h在线观看| 伦理中文字幕亚洲| 久久久午夜视频| 亚洲天堂av综合网| 日韩成人免费视频| 久久久天堂国产精品女人| 国产香蕉97碰碰久久人人| 欧美精品日韩www.p站| 日韩黄色高清视频| 久色乳综合思思在线视频| 久久亚洲国产成人| 亚洲国产美女精品久久久久∴| 亚洲成人av在线播放| 欧美激情伊人电影| 亚洲999一在线观看www| 日韩美女主播视频| 国产精品中文字幕在线| 中文字幕亚洲欧美日韩高清| 午夜精品福利在线观看| 亚洲精品国精品久久99热一| 国内精品美女av在线播放| 这里精品视频免费| 日韩经典中文字幕在线观看| 国产精品亚洲аv天堂网| 不卡在线观看电视剧完整版| 中国日韩欧美久久久久久久久| 久久综合五月天| 国产欧美在线视频| 欧美激情第6页| 91精品免费久久久久久久久| 欧美精品日韩www.p站| 欧美在线视频一二三| 久久精品亚洲精品| 亚洲天堂av图片| 欧美黑人巨大xxx极品| 精品一区二区三区四区在线| 91精品久久久久久久久青青| 久久亚洲影音av资源网| 欧美俄罗斯性视频| 精品亚洲男同gayvideo网站| 社区色欧美激情 | 国产91在线视频| 久久99国产精品自在自在app| 国产mv久久久| 国产日韩中文字幕在线| 精品女厕一区二区三区| 日韩av男人的天堂| 成人福利免费观看| 超碰91人人草人人干| 欧美性少妇18aaaa视频| 国产伦精品免费视频| 久久久天堂国产精品女人| 欧美视频在线观看 亚洲欧| 日韩69视频在线观看| 欧美重口另类videos人妖| 日韩av中文在线| 久久久精品一区| 欧美一区二区三区图| 欧美日本高清一区| 午夜免费在线观看精品视频| 亚洲精品国产成人| 国产精品丝袜一区二区三区| 日韩电影中文字幕在线观看| 欧美一级电影在线| 国产精品久久久久国产a级| 奇米四色中文综合久久| 欧美激情精品久久久久久蜜臀| 91在线网站视频| 国内精品美女av在线播放| 中文字幕av一区二区| 日韩电影免费在线观看中文字幕| 久久久久国色av免费观看性色| 亚洲欧洲偷拍精品| 国产最新精品视频| 欧美人与物videos| 亚洲国产日韩欧美在线动漫| 欧美性猛交xxxx黑人| 国产精品视频精品视频| 一区二区三区回区在观看免费视频| 亚洲国产精品中文| 欧美中文在线免费| 亚洲欧美在线一区| 国产精品视频地址| 欧美日韩一区二区在线播放| 九九九久久久久久| 久久精品色欧美aⅴ一区二区| 欧美日韩国产丝袜美女| 亚洲欧美日本精品| 亚洲精品99999| 一区二区在线视频播放| 中文字幕亚洲字幕| 国产精品扒开腿做| 中文字幕精品视频| 国产精品成av人在线视午夜片| 亚洲国产欧美一区| 91日本在线视频| www.亚洲男人天堂| 日本欧美中文字幕| 欧美极品少妇xxxxⅹ免费视频| 亚洲欧美另类中文字幕| 欧美日韩中文字幕综合视频| 久久久久久久香蕉网| 日韩av成人在线观看| 日韩精品极品视频免费观看| 国产精品久久久久高潮| 亚洲综合自拍一区| 第一福利永久视频精品| 日韩欧美黄色动漫| 精品久久久久久中文字幕| 国产va免费精品高清在线| 亚洲欧美在线一区二区| 中文字幕日韩高清| 国产欧亚日韩视频| 欧美午夜影院在线视频| 久久中文字幕在线视频| 国产精品亚洲网站| 国产欧美 在线欧美| 一本色道久久88综合日韩精品| 国产日韩中文字幕在线| 国产精国产精品| 亚洲电影免费观看高清完整版在线|