乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      使用Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

       andorcba 2015-12-11

      那么趁此Amfe阿里無線前端團(tuán)隊(duì)雙11技術(shù)連載之際,用一個(gè)實(shí)戰(zhàn)案例來告訴大家,手淘的H5頁面是如何實(shí)現(xiàn)多終端適配的,希望這篇文章對大家在Mobile的世界中能過得更輕松。

      目標(biāo)

      拿一個(gè)雙11的Mobile頁面來做案例,比如你實(shí)現(xiàn)一個(gè)類似下圖的一個(gè)H5頁面:

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      目標(biāo)很清晰,就是做一個(gè)這樣的H5頁面。

      痛點(diǎn)

      雖然H5的頁面與PC的Web頁面相比簡單了不少,但讓我們頭痛的事情是要想盡辦法讓頁面能適配眾多不同的終端設(shè)備。看看下圖你就會知道,這是多么痛苦的一件事情:

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      點(diǎn)擊這里查看更多終端設(shè)備的參數(shù)。

      再來看看手淘H5要適配的終端設(shè)備數(shù)據(jù):

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      看到這些數(shù)據(jù),是否死的心都有了,或者說為此捏了一把汗出來。

      手淘團(tuán)隊(duì)適配協(xié)作模式

      早期移動端開發(fā),對于終端設(shè)備適配問題只屬于Android系列,只不過很多設(shè)計(jì)師常常忽略Android適配問題,只出一套iOS平臺設(shè)計(jì)稿。但隨著iPhone6,iPhone6+的出現(xiàn),從此終端適配問題不再是Android系列了,也從這個(gè)時(shí)候讓移動端適配全面進(jìn)入到“雜屏”時(shí)代。

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      上圖來自于

      為了應(yīng)對這多么的終端設(shè)備,設(shè)計(jì)師和前端開發(fā)之間又應(yīng)該采用什么協(xié)作模式?或許大家對此也非常感興趣。

      而整個(gè)手淘設(shè)計(jì)師和前端開發(fā)的適配協(xié)作基本思路是:

      • 選擇一種尺寸作為設(shè)計(jì)和開發(fā)基準(zhǔn)
      • 定義一套適配規(guī)則,自動適配剩下的兩種尺寸(其實(shí)不僅這兩種,你懂的)
      • 特殊適配效果給出設(shè)計(jì)效果

      還是上一張圖吧,因?yàn)橐粓D勝過千言萬語:

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      在此也不做更多的闡述。在手淘的設(shè)計(jì)師和前端開發(fā)協(xié)作過程中:手淘設(shè)計(jì)師常選擇iPhone6作為基準(zhǔn)設(shè)計(jì)尺寸,交付給前端的設(shè)計(jì)尺寸是按750px * 1334px為準(zhǔn)(高度會隨著內(nèi)容多少而改變)。前端開發(fā)人員通過一套適配規(guī)則自動適配到其他的尺寸。

      根據(jù)上面所說的,設(shè)計(jì)師給我們的設(shè)計(jì)圖是一個(gè)750px * 1600px的頁面:

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      前端開發(fā)完成終端適配方案

      拿到設(shè)計(jì)師給的設(shè)計(jì)圖之后,剩下的事情是前端開發(fā)人員的事了。而手淘經(jīng)過多年的摸索和實(shí)戰(zhàn),總結(jié)了一套移動端適配的方案——flexible方案

      這種方案具體在實(shí)際開發(fā)中如何使用,暫時(shí)先賣個(gè)關(guān)子,在繼續(xù)詳細(xì)的開發(fā)實(shí)施之前,我們要先了解一些基本概念。

      一些基本概念

      在進(jìn)行具體實(shí)戰(zhàn)之前,首先得了解下面這些基本概念(術(shù)語):

      視窗 viewport

      簡單的理解,viewport是嚴(yán)格等于瀏覽器的窗口。在桌面瀏覽器中,viewport就是瀏覽器窗口的寬度高度。但在移動端設(shè)備上就有點(diǎn)復(fù)雜。

      移動端的viewport太窄,為了能更好為CSS布局服務(wù),所以提供了兩個(gè)viewport:虛擬的viewportvisualviewport和布局的viewportlayoutviewport。

      George Cummins在Stack Overflow上對這兩個(gè)基本概念做了詳細(xì)的解釋。

      而事實(shí)上viewport是一個(gè)很復(fù)雜的知識點(diǎn),上面的簡單描述可能無法幫助你更好的理解viewport,而你又想對此做更深的了解,可以閱讀PPK寫的相關(guān)教程

      物理像素(physical pixel)

      物理像素又被稱為設(shè)備像素,他是顯示設(shè)備中一個(gè)最微小的物理部件。每個(gè)像素可以根據(jù)操作系統(tǒng)設(shè)置自己的顏色和亮度。正是這些設(shè)備像素的微小距離欺騙了我們?nèi)庋劭吹降膱D像效果。

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      設(shè)備獨(dú)立像素(density-independent pixel)

      設(shè)備獨(dú)立像素也稱為密度無關(guān)像素,可以認(rèn)為是計(jì)算機(jī)坐標(biāo)系統(tǒng)中的一個(gè)點(diǎn),這個(gè)點(diǎn)代表一個(gè)可以由程序使用的虛擬像素(比如說CSS像素),然后由相關(guān)系統(tǒng)轉(zhuǎn)換為物理像素。

      CSS像素

      CSS像素是一個(gè)抽像的單位,主要使用在瀏覽器上,用來精確度量Web頁面上的內(nèi)容。一般情況之下,CSS像素稱為與設(shè)備無關(guān)的像素(device-independent pixel),簡稱DIPs。

      屏幕密度

      屏幕密度是指一個(gè)設(shè)備表面上存在的像素?cái)?shù)量,它通常以每英寸有多少像素來計(jì)算(PPI)。

      設(shè)備像素比(device pixel ratio)

      設(shè)備像素比簡稱為dpr,其定義了物理像素和設(shè)備獨(dú)立像素的對應(yīng)關(guān)系。它的值可以按下面的公式計(jì)算得到:

      1
      設(shè)備像素比 = 物理像素 / 設(shè)備獨(dú)立像素

      在JavaScript中,可以通過window.devicePixelRatio獲取到當(dāng)前設(shè)備的dpr。而在CSS中,可以通過-webkit-device-pixel-ratio,-webkit-min-device-pixel-ratio和 -webkit-max-device-pixel-ratio進(jìn)行媒體查詢,對不同dpr的設(shè)備,做一些樣式適配(這里只針對webkit內(nèi)核的瀏覽器和webview)。

      dip或dp,(device independent pixels,設(shè)備獨(dú)立像素)與屏幕密度有關(guān)。dip可以用來輔助區(qū)分視網(wǎng)膜設(shè)備還是非視網(wǎng)膜設(shè)備。

      縮合上述的幾個(gè)概念,用一張圖來解釋:

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      眾所周知,iPhone6的設(shè)備寬度和高度為375pt * 667pt,可以理解為設(shè)備的獨(dú)立像素;而其dpr為2,根據(jù)上面公式,我們可以很輕松得知其物理像素為750pt * 1334pt。

      如下圖所示,某元素的CSS樣式:

      CSS
      1
      2
      width: 2px;
      height: 2px;

      在不同的屏幕上,CSS像素所呈現(xiàn)的物理尺寸是一致的,而不同的是CSS像素所對應(yīng)的物理像素具數(shù)是不一致的。在普通屏幕下1個(gè)CSS像素對應(yīng)1個(gè)物理像素,而在Retina屏幕下,1個(gè)CSS像素對應(yīng)的卻是4個(gè)物理像素。

      有關(guān)于更多的介紹可以點(diǎn)擊這里詳細(xì)了解。

      看到這里,你能感覺到,在移動端時(shí)代屏幕適配除了Layout之外,還要考慮到圖片的適配,因?yàn)槠渲苯佑绊懙巾撁骘@示質(zhì)量,對于如何實(shí)現(xiàn)圖片適配,再此不做過多詳細(xì)闡述。這里盜用了@南宮瑞揚(yáng)根據(jù)mir.翻譯的一張信息圖:

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      meta標(biāo)簽

      <meta>標(biāo)簽有很多種,而這里要著重說的是viewport的meta標(biāo)簽,其主要用來告訴瀏覽器如何規(guī)范的渲染W(wǎng)eb頁面,而你則需要告訴它視窗有多大。在開發(fā)移動端頁面,我們需要設(shè)置meta標(biāo)簽如下:

      XHTML
      1
      <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

      代碼以顯示網(wǎng)頁的屏幕寬度定義了視窗寬度。網(wǎng)頁的比例和最大比例被設(shè)置為100%。

      留個(gè)懸念,因?yàn)楹竺娴慕鉀Q方案中需要重度依賴meta標(biāo)簽。

      CSS單位rem

      W3C規(guī)范中是這樣描述rem的:

      font size of the root element.

      簡單的理解,rem就是相對于根元素<html>font-size來做計(jì)算。而我們的方案中使用rem單位,是能輕易的根據(jù)<html>font-size計(jì)算出元素的盒模型大小。而這個(gè)特色對我們來說是特別的有益處。

      前端實(shí)現(xiàn)方案

      了解了前面一些相關(guān)概念之后,接下來我們來看實(shí)際解決方案。在整個(gè)手淘團(tuán)隊(duì),我們有一個(gè)名叫lib-flexible的庫,而這個(gè)庫就是用來解決H5頁面終端適配的。

      lib-flexible是什么?

      lib-flexible是一個(gè)制作H5適配的開源庫,可以點(diǎn)擊這里下載相關(guān)文件,獲取需要的JavaScript和CSS文件。

      當(dāng)然你可以直接使用阿里CDN:

      JavaScript
      1
      <script src="http://g./mtb/lib-flexible/{{version}}/??flexible_css.js,flexible.js"></script>

      將代碼中的{{version}}換成對應(yīng)的版本號0.3.4

      使用方法

      lib-flexible庫的使用方法非常的簡單,只需要在Web頁面的<head></head>中添加對應(yīng)的flexible_css.js,flexible.js文件:

      第一種方法是將文件下載到你的項(xiàng)目中,然后通過相對路徑添加:

      XHTML
      1
      2
      <script src="build/flexible_css.debug.js"></script>
      <script src="build/flexible.debug.js"></script>

      或者直接加載阿里CDN的文件:

      XHTML
      1
      <script src="http://g./mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script>

      另外強(qiáng)烈建議對JS做內(nèi)斂處理,在所有資源加載之前執(zhí)行這個(gè)JS。執(zhí)行這個(gè)JS后,會在<html>元素上增加一個(gè)data-dpr屬性,以及一個(gè)font-size樣式。JS會根據(jù)不同的設(shè)備添加不同的data-dpr值,比如說2或者3,同時(shí)會給html加上對應(yīng)的font-size的值,比如說75px。

      如此一來,頁面中的元素,都可以通過rem單位來設(shè)置。他們會根據(jù)html元素的font-size值做相應(yīng)的計(jì)算,從而實(shí)現(xiàn)屏幕的適配效果。

      除此之外,在引入lib-flexible需要執(zhí)行的JS之前,可以手動設(shè)置meta來控制dpr值,如:

      XHTML
      1
      <meta name="flexible" content="initial-dpr=2" />

      其中initial-dpr會把dpr強(qiáng)制設(shè)置為給定的值。如果手動設(shè)置了dpr之后,不管設(shè)備是多少的dpr,都會強(qiáng)制認(rèn)為其dpr是你設(shè)置的值。在此不建議手動強(qiáng)制設(shè)置dpr,因?yàn)樵贔lexible中,只對iOS設(shè)備進(jìn)行dpr的判斷,對于Android系列,始終認(rèn)為其dpr1

      JavaScript
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      if (!dpr && !scale) {
          var isAndroid = win.navigator.appVersion.match(/android/gi);
          var isIPhone = win.navigator.appVersion.match(/iphone/gi);
          var devicePixelRatio = win.devicePixelRatio;
          if (isIPhone) {
              // iOS下,對于2和3的屏,用2倍的方案,其余的用1倍方案
              if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {                
                  dpr = 3;
              } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
                  dpr = 2;
              } else {
                  dpr = 1;
              }
          } else {
              // 其他設(shè)備下,仍舊使用1倍的方案
              dpr = 1;
          }
          scale = 1 / dpr;
      }

      flexible的實(shí)質(zhì)

      flexible實(shí)際上就是能過JS來動態(tài)改寫meta標(biāo)簽,代碼類似這樣:

      JavaScript
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      var metaEl = doc.createElement('meta');
      var scale = isRetina ? 0.5:1;
      metaEl.setAttribute('name', 'viewport');
      metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
      if (docEl.firstElementChild) {
          document.documentElement.firstElementChild.appendChild(metaEl);
      } else {
          var wrap = doc.createElement('div');
          wrap.appendChild(metaEl);
          documen.write(wrap.innerHTML);
      }

      事實(shí)上他做了這幾樣事情:

      • 動態(tài)改寫<meta>標(biāo)簽
      • <html>元素添加data-dpr屬性,并且動態(tài)改寫data-dpr的值
      • <html>元素添加font-size屬性,并且動態(tài)改寫font-size的值

      案例實(shí)戰(zhàn)

      了解Flexible相關(guān)的知識之后,咱們回到文章開頭。我們的目標(biāo)是制作一個(gè)適配各終端的H5頁面。別的不多說,動手才能豐衣足食。

      創(chuàng)建HTML模板

      XHTML
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      <!DOCTYPE html>
      <html lang="en">
          <head>
              <meta charset="utf-8">
              <meta content="yes" name="apple-mobile-web-app-capable">
              <meta content="yes" name="apple-touch-fullscreen">
              <meta content="telephone=no,email=no" name="format-detection">
              <script src="http://g./mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script>
              <link rel="apple-touch-icon" href="favicon.png">
              <link rel="Shortcut Icon" href="favicon.png" type="image/x-icon">
              <title>再來一波</title>
          </head>
          <body>
              <!-- 頁面結(jié)構(gòu)寫在這里 -->
          </body>
      </html>

      正如前面所介紹的一樣,首先加載了Flexible所需的配置:

      XHTML
      1
      <script src="http://g./mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script>

      這個(gè)時(shí)候可以根據(jù)設(shè)計(jì)的圖需求,在HTML文檔的<body></body>中添加對應(yīng)的HTML結(jié)構(gòu),比如:

      XHTML
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      <div class="item-section" data-repeat="sections">
          <div class="item-section_header">
              <h2><img src="{brannerImag}" alt=""></h2>
          </div>
          <ul>
              <li data-repeat="items" class="flag" role="link" href="{itemLink}">
                  <a class="figure flag-item" href="{itemLink}">
                      <img src="{imgSrc}" alt="">
                  </a>
                  <div class="figcaption flag-item">
                      <div class="flag-title"><a href="{itemLink}" title="">{poductName}</a></div>
                      <div class="flag-price"><span>雙11價(jià)</span><strong>¥{price}</strong><small>({preferential})</small></div>
                      <div class="flag-type">{activityType}</div>
                      <a class="flag-btn" href="{shopLink}">{activeName}</a>
                  </div>
              </li>
          </ul>
      </div>

      這僅是一個(gè)示例文檔,大家可以根據(jù)自己風(fēng)格寫模板。

      為了能更好的測試頁面,給其配置一點(diǎn)假數(shù)據(jù):

      JavaScript
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      //define data
      var pageData = {
          sections:[{
              "brannerImag":"http://xxx./B1PNLZKXXXXXaTXXXXXXXXXXXX-750-481.jpg",
              items:[{
                  "itemLink": "##",
                  "imgSrc": "https:///350/350/people/grayscale",
                  "poductName":"Carter's1年式灰色長袖連體衣包腳爬服全棉鯨魚男嬰兒童裝115G093",
                  "price": "299.06",
                  "preferential": "滿400減100",
                  "activityType": "1小時(shí)內(nèi)熱賣5885件",
                  "shopLink":"##",
                  "activeName": "馬上搶!"
              }
                  ....
              }]
          }]
      }

      接下來的工作就是美化工作了。在寫具體樣式之前,有幾個(gè)點(diǎn)需要先了解一下。

      把視覺稿中的px轉(zhuǎn)換成rem

      讀到這里,大家應(yīng)該都知道,我們接下來要做的事情,就是如何把視覺稿中的px轉(zhuǎn)換成rem。在此花點(diǎn)時(shí)間解釋一下。

      首先,目前日常工作當(dāng)中,視覺設(shè)計(jì)師給到前端開發(fā)人員手中的視覺稿尺寸一般是基于640px750px以及1125px寬度為準(zhǔn)。甚至為什么?大家應(yīng)該懂的(考慮Retina屏)。

      正如文章開頭顯示的示例設(shè)計(jì)稿,他就是一張以750px為基礎(chǔ)設(shè)計(jì)的。那么問題來了,我們?nèi)绾螌⒃O(shè)計(jì)稿中的各元素的px轉(zhuǎn)換成rem

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      我廠的視覺設(shè)計(jì)師想得還是很周到的,會幫你把相關(guān)的信息在視覺稿上標(biāo)注出來

      目前Flexible會將視覺稿分成100份(主要為了以后能更好的兼容vhvw),而每一份被稱為一個(gè)單位a。同時(shí)1rem單位被認(rèn)定為10a。針對我們這份視覺稿可以計(jì)算出:

      1
      2
      1a   = 7.5px
      1rem = 75px

      那么我們這個(gè)示例的稿子就分成了10a,也就是整個(gè)寬度為10rem<html>對應(yīng)的font-size75px

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      這樣一來,對于視覺稿上的元素尺寸換算,只需要原始的px值除以rem基準(zhǔn)值即可。例如此例視覺稿中的圖片,其尺寸是176px * 176px,轉(zhuǎn)換成為2.346667rem * 2.346667rem。

      如何快速計(jì)算

      在實(shí)際生產(chǎn)當(dāng)中,如果每一次計(jì)算px轉(zhuǎn)換rem,或許會覺得非常麻煩,或許直接影響大家平時(shí)的開發(fā)效率。為了能讓大家更快進(jìn)行轉(zhuǎn)換,我們團(tuán)隊(duì)內(nèi)的同學(xué)各施所長,為px轉(zhuǎn)換rem寫了各式各樣的小工具。

      CSSREM

      CSSREM是一個(gè)CSS的px值轉(zhuǎn)rem值的Sublime Text3自動完成插件。這個(gè)插件是由@正霖編寫。先來看看插件的效果:

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      有關(guān)于CSSREM如何安裝、配置教程可以點(diǎn)擊這里查閱。

      CSS處理器

      除了使用編輯器的插件之外,還可以使用CSS的處理器來幫助大家處理。比如說Sass、LESS以及PostCSS這樣的處理器。我們簡單來看兩個(gè)示例。

      Sass

      使用Sass的同學(xué),可以使用Sass的函數(shù)、混合宏這些功能來實(shí)現(xiàn):

      Sass
      1
      2
      3
      4
      5
      6
      7
      8
      9
      @function px2em($px, $base-font-size: 16px) {
          <a href='http://www./members/jinyi7016'>@if</a> (unitless($px)) {
              @warn "Assuming #{$px} to be in pixels, attempting to convert it into pixels for you";
              @return px2em($px + 0px); // That may fail.
          } @else if (unit($px) == em) {
              @return $px;
          }
          @return ($px / $base-font-size) * 1em;
      }

      除了使用Sass函數(shù)外,還可以使用Sass的混合宏:

      Sass
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      @mixin px2rem($property,$px-values,$baseline-px:16px,$support-for-ie:false){
          //Conver the baseline into rems
          $baseline-rem: $baseline-px / 1rem * 1;
          //Print the first line in pixel values
          <a href='http://www./members/jinyi7016'>@if</a> $support-for-ie {
              #{$property}: $px-values;
          }
          //if there is only one (numeric) value, return the property/value line for it.
          <a href='http://www./members/jinyi7016'>@if</a> type-of($px-values) == "number"{
              #{$property}: $px-values / $baseline-rem;
          }
          @else {
              //Create an empty list that we can dump values into
              $rem-values:();
              @each $value in $px-values{
                  // If the value is zero or not a number, return it
                  <a href='http://www./members/jinyi7016'>@if</a> $value == 0 or type-of($value) != "number"{
                      $rem-values: append($rem-values, $value / $baseline-rem);
                  }
              }
              // Return the property and its list of converted values
              #{$property}: $rem-values;
          }
      }

      有關(guān)于更多的介紹,可以點(diǎn)擊這里進(jìn)行了解。

      PostCSS(px2rem)

      除了Sass這樣的CSS處理器這外,我們團(tuán)隊(duì)的@頌奇同學(xué)還開發(fā)了一款npm的工具px2rem。安裝好px2rem之后,可以在項(xiàng)目中直接使用。也可以使用PostCSS。使用PostCSS插件postcss-px2rem

      JavaScript
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      var gulp = require('gulp');
      var postcss = require('gulp-postcss');
      var px2rem = require('postcss-px2rem');
      gulp.task('default', function() {
          var processors = [px2rem({remUnit: 75})];
          return gulp.src('./src/*.css')
              .pipe(postcss(processors))
              .pipe(gulp.dest('./dest'));
      });

      除了在Gulp中配置外,還可以使用其他的配置方式,詳細(xì)的介紹可以點(diǎn)擊這里進(jìn)行了解。

      配置完成之后,在實(shí)際使用時(shí),你只要像下面這樣使用:

      CSS
      1
      2
      3
      4
      5
      6
      .selector {
          width: 150px;
          height: 64px; /*px*/
          font-size: 28px; /*px*/
          border: 1px solid #ddd; /*no*/
      }

      px2rem處理之后將會變成:

      CSS
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      .selector {
          width: 2rem;
          border: 1px solid #ddd;
      }
      [data-dpr="1"] .selector {
          height: 32px;
          font-size: 14px;
      }
      [data-dpr="2"] .selector {
          height: 64px;
          font-size: 28px;
      }
      [data-dpr="3"] .selector {
          height: 96px;
          font-size: 42px;
      }

      在整個(gè)開發(fā)中有了這些工具之后,完全不用擔(dān)心px值轉(zhuǎn)rem值影響開發(fā)效率。

      字號不使用rem

      前面大家都見證了如何使用rem來完成H5適配。那么文本又將如何處理適配。是不是也通過rem來做自動適配。

      顯然,我們在iPhone3G和iPhone4的Retina屏下面,希望看到的文本字號是相同的。也就是說,我們不希望文本在Retina屏幕下變小,另外,我們希望在大屏手機(jī)上看到更多文本,以及,現(xiàn)在絕大多數(shù)的字體文件都自帶一些點(diǎn)陣尺寸,通常是16px24px,所以我們不希望出現(xiàn)13px15px這樣的奇葩尺寸。

      如此一來,就決定了在制作H5的頁面中,rem并不適合用到段落文本上。所以在Flexible整個(gè)適配方案中,考慮文本還是使用px作為單位。只不過使用[data-dpr]屬性來區(qū)分不同dpr下的文本字號大小。

      CSS
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      .selector {
          width: 2rem;
          border: 1px solid #ddd;
      }
      [data-dpr="1"] .selector {
          height: 32px;
          font-size: 14px;
      }
      [data-dpr="2"] .selector {
          height: 64px;
          font-size: 28px;
      }
      [data-dpr="3"] .selector {
          height: 96px;
          font-size: 42px;
      }

      為了能更好的利于開發(fā),在實(shí)際開發(fā)中,我們可以定制一個(gè)font-dpr()這樣的Sass混合宏:

      Sass
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      @mixin font-dpr($font-size){
          font-size: $font-size;
          [data-dpr="2"] & {
              font-size: $font-size * 2;
          }
          [data-dpr="3"] & {
              font-size: $font-size * 3;
          }
      }

      有了這樣的混合宏之后,在開發(fā)中可以直接這樣使用:

      Sass
      1
      <a href='http://www./members/sanjiaomaohero'>@include</a> font-dpr(16px);

      當(dāng)然這只是針對于描述性的文本,比如說段落文本。但有的時(shí)候文本的字號也需要分場景的,比如在項(xiàng)目中有一個(gè)slogan,業(yè)務(wù)方希望這個(gè)slogan能根據(jù)不同的終端適配。針對這樣的場景,完全可以使用rem給slogan做計(jì)量單位。

      CSS

      本來想把這個(gè)頁面的用到的CSS(或SCSS)貼出來,但考慮篇幅過長,而且這么簡單的頁面,我想大家也能輕而易舉搞定。所以就省略了。權(quán)當(dāng)是給大家留的一個(gè)作業(yè)吧,感興趣的可以試試Flexible能否幫你快速完成H5頁面終端適配。

      效果

      最后來看看真機(jī)上顯示的效果吧。我截了兩種設(shè)備下的效果:

      iPhone4

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      iPhone6+

      Flexible實(shí)現(xiàn)手淘H5頁面的終端適配

      總結(jié)

      其實(shí)H5適配的方案有很多種,網(wǎng)上有關(guān)于這方面的教程也非常的多。不管哪種方法,都有其自己的優(yōu)勢和劣勢。而本文主要介紹的是如何使用Flexible這樣的一庫來完成H5頁面的終端適配。為什么推薦使用Flexible庫來做H5頁面的終端設(shè)備適配呢?主要因?yàn)檫@個(gè)庫在手淘已經(jīng)使用了近一年,而且已達(dá)到了較為穩(wěn)定的狀態(tài)。除此之外,你不需要考慮如何對元素進(jìn)行折算,可以根據(jù)對應(yīng)的視覺稿,直接切入。

      當(dāng)然,如果您有更好的H5頁面終端適配方案,歡迎在下面的評論中與我們一起分享。如果您在使用這個(gè)庫時(shí),碰到任何問題,都可以在Github給我們提Issue。我們團(tuán)隊(duì)會努力解決相關(guān)需Issues。

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多