成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于適配你需要知道的—MobileWeb適配總結

移動開發(fā) Android
本篇討論的頁面指專門針對手機設備設計的頁面,并非兼容全設備的響應式布局。 文中提到的 device-width 指 viewport meta 標簽中 width 的值,即由瀏覽器指定的值,常用機型對應值可參照Screen Sizes。

開門見山,本篇將總結一下MobileWeb的適配方法,即我們常說的H5頁面、手機頁面、WAP頁、webview頁面等等。

本篇討論的頁面指專門針對手機設備設計的頁面,并非兼容全設備的響應式布局。 文中提到的 device-width 指 viewport meta 標簽中 width 的值,即由瀏覽器指定的值,常用機型對應值可參照Screen Sizes。

適配達到的效果是什么?

在不同尺寸的手機設備上,頁面“相對性的達到合理的展示(自適應)”或者“保持統(tǒng)一效果的等比縮放(看起來差不多)”。

適配應關注哪些要素?

一般來說,我們需要關注的是:字體、高寬間距、圖像(圖標、圖片)。

其中,圖像相對要復雜一些,針對流量、清晰度等問題網(wǎng)上也有比較成熟的解決方案,比如:矢量化、字體化、image-set 等等,在此不做深入。在滿足快速開發(fā)的需求下,我們使用較為偷懶的方式:利用 css 將圖像限定在元素內( img 圖片使用 [max-]width: 100% ,背景圖像使用 background-size ),布局只針對元素進行。

另外要考慮到,設計師設計視覺稿時使用什么樣的寬度,才能既滿足設計自身的需求又能讓前端開發(fā)方便的切圖適配。

舉個例子

圍繞這三要素,我們用一個小例子來說明接下來要介紹的三種方案的實現(xiàn)方式,按 640px 標準需實現(xiàn)的效果如圖:

app.jpg

固定高度,寬度自適應

這是目前最通用的一種做法,屬于自適應布局,viewport width 設置為 device-width,以較小寬度(如 320px)的視覺稿作為參照進行布局。垂直方向的高度和間距使用定值,水平方向混合使用定值和百分比或者利用彈性布局,最終達到“當手機屏幕變化時,橫向拉伸或者填充空白的效果”。圖像元素根據(jù)容器情況,使用定值或者 background-size 縮放。

粗略瀏覽了下一些大廠的首頁,像百度、騰訊、Facebook、Twitter 都是采用的這種方案。

要點:

以小寬度作為參照是因為如果布局滿足了小寬度的擺放,當屏幕變寬時,簡單的填充空白就可以了;而如果反過來就可能造成“擠壞了”,考慮 header 區(qū)域,左測 logo 右測橫向 nav 的情況。

需要小寬度的布局,又需要大寬度的圖像,這是一個矛盾點。

320px 過于窄小,不利于頁面的設計;只能設計橫向拉伸的元素布局,存在很多局限性。

兼容性較好。

實現(xiàn)比較簡單,樣式中的尺寸都按照視覺稿二分之一大小設置,查看效果和代碼。

 

固定寬度,viewport 縮放

視覺稿、頁面寬度、viewport width 使用統(tǒng)一寬度,利用瀏覽器自身縮放完成適配。頁面樣式(包括圖像元素)完全按照視覺稿的尺寸,使用定值單位 (px、em)即可完成。

優(yōu)點:

開發(fā)簡單:縮放交給瀏覽器,完全按視覺稿切圖。

還原精準:絕對等比例縮放,可以精準還原視覺稿(不考慮清晰度的情況下)。

測試方便:在PC端即可完成大部分測試,手機端只需酌情調整一些細節(jié)(比如圖標、字體混合排列時,因為字體不同造成的對齊問題)。

存在的問題:

像素丟失:對于一些分辨率較低的手機,可能設備像素還未達到指定的 viewport 寬度,此時屏幕的渲染可能就不準確了。比較常見的是邊框“消失”了,不過隨著手機硬件的更新,這個問題會越來越少的。

縮放失效:某些安卓機不能正常的根據(jù) meta 標簽中 width 的值來縮放 viewport,需要配合 initial-scale 。

文本折行:存在于縮放失效的機型中,某些手機為了便于文本的閱讀,在文本到達 viewport 邊緣(非元素容器的邊緣)時即進行折行,而當 viewport 寬度被修正后,瀏覽器并沒有正確的重繪,所以就發(fā)現(xiàn)文本沒有占滿整行。一些常用的段落性文本標簽會存在該問題。

縮放失效問題需通過 js 動態(tài)設定 initial-scale

  1. var fixScreen = function() { 
  2. var metaEl = doc.querySelector('meta[name="viewport"]'), 
  3. metaCtt = metaEl ? metaEl.content : ''
  4. matchScale = metaCtt.match(/initial\-scale=([\d\.]+)/), 
  5. matchWidth = metaCtt.match(/width=([^,\s]+)/); 
  6. if ( metaEl && !matchScale && ( matchWidth && matchWidth[1] != 'device-width') ) { 
  7. var width = parseInt(matchWidth[1]), 
  8. iw = win.innerWidth || width, 
  9. ow = win.outerWidth || iw, 
  10. sw = win.screen.width || iw, 
  11. saw = win.screen.availWidth || iw, 
  12. ih = win.innerHeight || width, 
  13. oh = win.outerHeight || ih, 
  14. ish = win.screen.height || ih, 
  15. sah = win.screen.availHeight || ih, 
  16. w = Math.min(iw,ow,sw,saw,ih,oh,ish,sah), 
  17. scale = w / width; 
  18. if ( ratio < 1) { 
  19. metaEl.content += ',initial-scale=' + ratio + ',maximum-scale=' + ratio + ', minimum-scale=' + scale + ',user-scalable=no'

文本折行問題可以通過 css 樣式解決。

 

既然該方案使用固定寬度值,那么這個值是多少合適呢?首要考慮的是主流分辨率,可參考Screen Sizes和友盟指數(shù)的數(shù)據(jù);其次要考慮設計部門常用的設計尺寸,綜合協(xié)調,最終確定一個合適的值。

該處使用640px來實現(xiàn)例子,查看效果和代碼。

利用 rem 布局

依照某特定寬度設定 rem 值(即 html 的 font-size),頁面任何需要彈性適配的元素,尺寸均換算為 rem 進行布局;當頁面渲染時,根據(jù)頁面有效寬度進行計算,調整 rem 的大小,動態(tài)縮放以達到適配的效果。利用該方案,還可以根據(jù) devicePixelRatio 設定 initial-scale 來放大 viewport,使頁面按照物理像素渲染,提升清晰度。

優(yōu)點:

清晰度高,能達到物理像素的清晰度。

能解決 DPR 引起的“1像素”問題。

向后兼容較好,即便屏幕寬度增加、PPI 增加該方案依舊適用。

缺點:

適配 js 需盡可能早進入,減少(避免)viewport 變化引起的重繪。

某些Android機會丟掉 rem 小數(shù)部分。

需要預編譯庫進行單位轉換。

開發(fā)時,css 及 js 都以 16px 作為基數(shù)換算 rem,借助預編譯庫(以 scss 為例),我們設定一個動態(tài)尺寸單位 $ppr: 750px/16px/1rem ,即 pixel per rem,任何使用彈性尺寸的地方寫作:width: 100px/$ppr。

動態(tài)調整 rem 的方法如下:

  1. var fixScreen = function() { 
  2. var metaEl = doc.querySelector('meta[name="viewport"]'), 
  3. metaCtt = metaEl ? metaEl.content : ''
  4. matchScale = metaCtt.match(/initial\-scale=([\d\.]+)/), 
  5. matchWidth = metaCtt.match(/width=([^,\s]+)/); 
  6. if ( !metaEl ) { // REM 
  7. var docEl = doc.documentElement, 
  8. maxwidth = docEl.dataset.mw || 750// 每 dpr ***頁面寬度 
  9. dpr = isIos ? Math.min(win.devicePixelRatio, 3) : 1
  10. scale = 1 / dpr, 
  11. tid; 
  12. docEl.removeAttribute('data-mw'); 
  13. docEl.dataset.dpr = dpr; 
  14. metaEl = doc.createElement('meta'); 
  15. metaEl.name = 'viewport'
  16. metaEl.content = fillScale(scale); 
  17. docEl.firstElementChild.appendChild(metaEl); 
  18. var refreshRem = function() { 
  19. var width = docEl.getBoundingClientRect().width; 
  20. if (width / dpr > maxwidth) { 
  21. width = maxwidth * dpr; 
  22. var rem = width / 16
  23. docEl.style.fontSize = rem + 'px'
  24. }; 
  25. //... 
  26. refreshRem(); 

代碼實現(xiàn)主要參考淘寶網(wǎng)觸屏版的適配方法,查看效果和代碼,其中 scss 的寫法可以參見這里。

注意,較小的背景圖(比如一些 icon)的 background-size 不要使用具體 rem 數(shù)值,裁剪后會出現(xiàn)邊緣丟失。應使用與元素等尺寸切圖,設定 background-size: cover|contain 來縮放。

總結

總的來看,目前還沒有***的解決方案,這些也只是盡可能的滿足快速開發(fā)、簡單適配需求的通用方案。其中對于一些較為細節(jié)的問題(比如字體的點陣尺寸、非彈性的定值需求)未做討論。實際開發(fā)過程中,更應該綜合考慮項目類型、資源成本、人員配合等多方面的因素,選擇合適的方案。

代碼實現(xiàn)中使用到的 mobile-util.js 對定寬和 rem 適配進行了整合,源碼在此。

責任編輯:chenqingxiang 來源: 艾佢K的博客
相關推薦

2014-07-31 17:13:50

編碼程序員

2023-01-30 11:43:04

開源代碼

2023-02-10 08:44:05

KafkaLinkedIn模式

2017-03-28 15:47:17

數(shù)據(jù)治理數(shù)據(jù)庫

2018-05-16 09:41:13

神經(jīng)網(wǎng)絡NN函數(shù)

2016-11-01 23:16:52

光纖光纖線纜

2013-12-02 14:07:02

Hadoop大數(shù)據(jù)集群

2020-05-07 10:14:00

企業(yè)架構師CIOIT網(wǎng)絡

2022-09-01 15:26:45

物聯(lián)網(wǎng)人工智能傳感器

2017-09-18 18:31:08

Hadoop

2022-04-24 09:00:00

滲透測試安全數(shù)字時代

2022-12-30 11:24:21

2023-09-04 07:49:43

2022-07-15 14:58:26

數(shù)據(jù)分析人工智能IT

2017-02-09 14:46:25

Git事情

2016-01-20 09:44:22

物聯(lián)網(wǎng)標準

2018-06-15 23:00:56

2018-01-03 11:35:34

推送AndroidiOS

2023-10-31 12:43:00

Wi-Fi 7無線技術

2022-08-27 12:15:51

Linux Mint操作系統(tǒng)
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美高清视频一区 | 在线午夜| 97色在线视频 | www.久草.com| 亚洲精品福利在线 | 国产日韩一区二区三免费高清 | chinese中国真实乱对白 | 中文字幕乱码一区二区三区 | 成人免费视频网站在线看 | 日韩成人av在线播放 | 一级在线观看 | 91国自产 | 亚洲成人一区二区在线 | 伊人网综合 | 一级特黄网站 | 美女人人操 | 精品国产乱码久久久久久88av | 第四色播日韩第一页 | 一级a性色生活片久久毛片 午夜精品在线观看 | 在线 丝袜 欧美 日韩 制服 | 玖玖精品| 日日综合 | 99在线观看视频 | 日韩一区二区视频 | 欧美成人精品一区 | 91观看| 国产一区二区在线播放视频 | 国产不卡一区 | 日韩视频精品在线 | 精品久久国产 | 日韩成人在线免费视频 | 伊伊综合网 | 久久99精品久久久久久 | 午夜资源| 久久久国产精品 | 国产精品五月天 | 黄色成人在线 | 中文字幕一区在线观看视频 | 午夜激情网 | 欧美精品在线一区二区三区 | 99久久精品免费看国产四区 |