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

手機淘寶的flexible設計與實現

移動開發
總的來說,手機淘寶的flexible方案是綜合運用rem和px兩種單位+js設置scale和html字體,這些JS的內容,可以在我們開源的庫ml中找到:https://github.com/amfe/lib.flexible。

[[138326]]

手機淘寶從2014年中開始,全面推行flexible設計。什么叫flexible呢?其實flexible就是responsive的低端形態和基礎。對我們來說,最直觀的感受就是,在超寬屏幕上,網頁顯示不會兩邊留白。以前pc時代大家經常講的流體布局,其實就是一種flexible design。只不過,流體的表述角度是實現,flexible的表述角度是結果,為了跟高大上的responsive保持一致,我們這里使用了flexible這個說法。

討論方案之前,需要先了解三個關鍵概念:

單位英寸像素數(Pixel Per Inch,PPI):現實世界的一英寸內像素數,決定了屏幕的顯示質量

設備像素比率(Device Pixel Ratio,DPR):物理像素與邏輯像素(px)的對應關系

分辨率(Resolution):屏幕區域的寬高所占像素數

當我們決定不同屏幕的字體和尺寸的單位時,屏幕的這幾個參數非常重要。

場景1——Resolution適配

一張banner圖片,當你面對不同的屏幕時你希望它的行為是怎樣的?

在這個場景中,我們主要需要面對的是分辨率適配問題,考慮到多數網頁都是縱向滾動的,在不同的屏幕尺寸下,banner的行為應該是總是鋪滿屏幕寬度以及總是保持寬高比。

最自然的思路是使用百分比寬度,但是假如使用百分比寬度,即width:100%,我們又有兩種思路來實現固定寬高比:一是利用img標簽的特性,只設寬度等圖片加載完,這種方法會導致大量的重排,并且非固定高度會導致懶加載等功能難以實現,所以果斷放棄;二是使用before偽元素的margin撐開高度,這種方法是比較干凈的純css實現,但是不具備任何復用性而且要求特定html結構,所以也只好放棄了。

于是,剩下最合適的辦法是使用其它相對單位,本來最合適的單位是vw,它的含義是視口寬度,但是這個單位存在嚴重的兼容問題,所以也只好放棄。

***我們只好配合js來做,硬算也是一條路,但是同樣不具備任何可復用性,最終我們選擇了rem,我們用js給html設置一個跟屏幕寬度成正比的font-size,然后把元素寬高都用rem作為單位。

這是我們目前的線上方案了,它是一個近乎Hack的用法,已知的問題包括:

某些Android機型會丟掉rem小數部分

占用了rem單位

不是純css方案

場景2——PPI適配

一段文字,當你面對不同的屏幕時你希望它的行為是怎樣的?

顯然,我們在iPhone3G和iPhone4的Retina屏下面,希望看到的文字尺寸是相同的,也就是說,我們不希望文字在Retina屏尺寸變小,此外,我們在大屏手機上,希望看到更多文字,以及,現在絕大多數的字體文件,是自帶一些點陣尺寸的,通常是16px和24px,所以我們不希望出現13px、15px這樣的奇葩尺寸。

這樣的特征決定了,場景1中的rem方案,不適合用到段落文字上。所以段落文字應該使用px作為單位,考慮到Retina,我們利用media query來指定不同的字體,考慮到dpr判定的兼容性,我們用寬度替換來代替:

 

另一種場景,一些標題性文字,希望隨著屏幕寬而增大的,我們可以仍然使用rem作為單位。超過35px(個人直觀感受)的文字,已經不用太考慮點陣信息了,靠字體的矢量信息也能渲染的很好。

場景3——DPR匹配

一個區塊,設計稿上有1像素邊框,當你面對不同的屏幕時你希望它的行為是怎樣的?

這個場景,需求很簡單,設計師希望在任何屏幕上這條線都是1物理像素。

好吧,當然這個問題的答案不是寫1px那么簡單。在retina屏下面,如果你寫了這樣的meta

 

 

你將永遠無法寫出1px寬度的東西,除此之外,inline的SVG等元素,也會按照邏輯像素來渲染,整個頁面的清晰度會打折。

所以,手機淘寶用JS來動態寫meta標簽,代碼類似這樣:

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

結語

總的來說,手機淘寶的flexible方案是綜合運用rem和px兩種單位+js設置scale和html字體。

這些JS的內容,可以在我們開源的庫ml中找到:https://github.com/amfe/lib.flexible。

責任編輯:chenqingxiang 來源: 前端亂燉
相關推薦

2020-10-19 10:01:12

Nodejs線程池設計

2022-12-28 08:31:38

平臺設計應用

2015-11-03 09:28:52

Hybrid技術設計實現

2020-10-23 08:31:15

Nodejs-Ipc設計實現

2022-09-12 07:17:20

redis命令redissynce

2023-05-26 08:24:17

短信渠道模型

2022-09-14 09:37:22

數據系統

2022-05-25 10:47:01

淘寶開發模式

2015-04-03 10:19:47

迭代設計計劃設計

2022-05-03 21:18:38

Vue.js組件KeepAlive

2025-02-25 09:29:34

2020-07-19 10:26:47

Kubernetes數據結構

2025-03-20 09:54:47

2011-04-21 15:22:27

ArcGIS Engi

2021-11-24 08:55:38

代理網關Netty

2022-10-18 08:28:38

運營活動實現邏輯整體協作

2017-10-25 14:41:19

UPS遠程監控電源

2025-05-22 08:15:00

2022-07-12 06:05:27

NutUI折疊面板組件開發

2022-05-31 08:04:30

前端設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 台湾佬久久 | 国产精品欧美一区二区三区不卡 | 国产精品久久国产精品 | 国内毛片毛片毛片毛片 | 免费在线成人 | 一本一道久久a久久精品综合蜜臀 | 亚洲免费视频播放 | 91精品国产一区二区三区 | 国产成人99久久亚洲综合精品 | 国产精品一区二 | 日本精品视频 | 羞羞的视频网站 | 久久久久久久久99精品 | 亚洲国产高清在线 | 九九久久久 | 激情毛片 | 午夜视频一区 | 欧美激情综合色综合啪啪五月 | 亚洲精品日韩一区二区电影 | 69亚洲精品 | 在线2区 | 亚洲区一区二区 | jlzzjlzz国产精品久久 | www日本高清 | 欧美日韩精品久久久免费观看 | 一级毛片大全免费播放 | 久久久久久久久久久国产 | 久久高清 | 中文字幕成人在线 | 精品一区二区三区在线视频 | 夜夜久久 | 亚洲精品电影 | 日韩一区二区福利 | 成人精品视频在线观看 | 中文字幕亚洲一区二区三区 | 久久在看| 怡红院怡春院一级毛片 | 在线视频三区 | 国内自拍第一页 | 亚洲三区在线观看 | 91福利在线观看 |