移動端適配

集中適配方案的總結: 項目: https://github.com/Aluka-w/mobile-terminal-adaptation

rem和vw布局

總結:

  1. 舊的rem布局
典型: lib-flexible: flex通過Hack手段來根據(jù)設備的dpr值相應改變<meta>標簽中viewport的值, 使得rem模擬vw的效果
  1. 新的vw布局(我的demo里面并沒有解決兼容)

設計稿

  1. 設計稿大多是750px * 1334px, css像素是750px, dpr=2, 基本按750布局即可

  2. 設備像素比(dpr) = 物理像素 / 設備獨立像素(css像素)

vh, vw(頁面可視寬度 + 滾動條)

參考: https://www.w3cplus.com/css/vw-for-layout.html

  1. vw:是Viewport's width的簡寫,1vw等于window.innerWidth的1%

  2. vh:和vw類似,是Viewport's height的簡寫,1vh等于window.innerHeihgt的1%

  3. 視口被均分為100單位的vh, 既100vh就是滿屏高, 均等分可能出現(xiàn)像素偏差, 并且有兼容性

cssrem插件

  1. 設置的cssrem.rootFontSize 這個參數(shù)是: 每次設置值都會除以這個參數(shù)返回的 值 + rem = 最后數(shù)值

  2. 手淘團隊針對計算的問題, 有寫less或者sass的函數(shù)

第一不依賴框架

依賴cssrem這個插件(網(wǎng)易的做法)

demo: WY-mobile

  1. 參考: https://www.cnblogs.com/well-nice/p/5509589.html

  2. 第一步

    function initRem() {
        // 7.5基準值:  設計稿寬度 / 100 = 基準值
        var deviceWidth = document.documentElement.clientWidth;
        // 當大于750時候就按照750寬度計算
        if(deviceWidth > 750) deviceWidth = 750;
        document.documentElement.style.fontSize = deviceWidth / 7.5 + 'px';
    }
    initRem();
    window.addEventListener("resize", function () {
        initRem();
    });
  1. 第二步

     設置: ```cssrem.rootFontSize = 100 ```, 即設計稿的值都除以100即可
    
  2. 第三步

     height的設置需要注意, 可能填不滿
    
  3. 第四步:

       這種方案下, 不想使用rem, 那就直接用px即可
    

手淘團隊的lib-flexible方案(vue中也有)

demo: ali-mobile

  1. 與網(wǎng)易團隊的區(qū)別: 手淘動態(tài)增加meta標簽, 動態(tài)計算dpr, 兼容更多的屏 demoa: ali-mobile

  2. 參考: https://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html

  3. 步驟:

    1. 引入lib-flexible(或者直接引入)
    `<script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script>`
    
    1. 刪除meta標簽

    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>

    1. cssrem的設置

      cssrem的cssrem.rootFontSize = 75, 就可以了

    2. 這種方案下, 不想使用rem, 那就直接用px即可

依賴cssrem這個插件(博客)

demo: normal-mobile

  1. 第一步
  ;(function(win, doc){
  function fontSizeModify() {
    var idealWidth = doc.documentElement.clientWidth,
      htmlEle = doc.children[0];
      fontSize   = 32 * idealWidth/750;
      // 當寬度大于600時, font-size保持不變
      // if (idealWidth >=600) {
      //   fontSize = 32 * 600/750;
      // }
    htmlEle.style.fontSize = fontSize + "px";
  }
  function throttle(method, content) {
    clearTimeout(method.tId);
    method.tId = setTimeout(function() {
      method.call(content);
    }, 100);
  }
  fontSizeModify();
  win.addEventListener("resize", function(){
    throttle(fontSizeModify);
  });
})(this, document);
  1. 第二步

設置: cssrem.rootFontSize = 32, 因為乘以了32的原因

  1. 這種方案下, 不想使用rem, 那就直接用px即可

第二, Vue-cli的手機適配

px轉rem(手淘團隊的lib-flexible)demo: vue-normal

  1. 參考: https://blog.csdn.net/qq_22844483/article/details/79730604

  2. 步驟:

  3. npm install lib-flexible --save

  4. 在main.js引入 import 'lib-flexible/flexible.js'

  5. 把項目根目錄的index.html 頭部刪除自動生成的meta標簽, lib-flexible會根據(jù)屏幕自動生成相對于的meta標簽

  6. 安裝 npm install px2rem-loader --save-dev 把px轉成rem

  7. 修改build/utils.js, 在cssLoader變量中

const cssLoader = {
    loader: 'css-loader',
    options: {
      sourceMap: options.sourceMap,
      importLoader: 5 // 在加載cssLoader之前加載的loader個數(shù)
    }
  }
const px2remLoader = {
  loader: 'px2rem-loader',
  options: {
    emUnit: 75 // 設計稿的1/10
  }
}
function generateLoaders(loader, loaderOptions) {
  const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]   // 注釋的地方是需要加的
  if (loader) {
    loaders.push({
      loader: loader + '-loader',
      options: Object.assign({}, loaderOptions, {
        sourceMap: options.sourceMap
      })
    })
  }
}
  1. 關于px2rem(保留px方案)

    1. 直接寫px鸭廷,編譯后會直接轉化成rem
    2. 在px后面添加/no/,不會轉化px术羔,會原樣輸出。 — 一般border需用這個
    3. 在px后面添加/px/,會根據(jù)dpr的不同乃沙,生成三套代碼猎塞。---- 一般字體需用這個
  2. 之后直接根據(jù)設計稿寫就行

px轉成vw(重在學習) demo: vue-mobile

  1. 參考網(wǎng)址: https://www.w3cplus.com/mobile/vw-layout-in-vue.html

  2. demo: vue-mobile

  3. 缺點: 兼容性較差

  4. 實現(xiàn)步驟:

  5. 安裝依賴: npm i postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-cssnext postcss-viewport-units cssnano --S

  6. 在根目錄.postcssrc.js中, 對新安裝的PostCSS插件進行配置

  "plugins": {
    "postcss-import": {},
    "postcss-url": {},
    // "autoprefixer": {}, // 因為postcss-cssnext, cssnano都有類似功能
    "postcss-aspect-ratio-mini": {}, // 處理元素容器寬高比, 感覺像scss的繼承, 沒什么卵用
    "postcss-write-svg": { // 處理移動端1px的解決方案
      utf8: false 
    }, 
    "postcss-cssnext": {}, // 該插件可以讓我們使用CSS未來的特性,其會對這些特性做相關的兼容性處理
    "postcss-px-to-viewport": { // 主要用來把px單位轉換為vw蔓罚、vh椿肩、vmin或者vmax
      viewportWidth: 750, // 視窗的寬度,對應的是我們設計稿的寬度豺谈,一般是750 
      viewportHeight: 1334, // 視窗的高度覆旱,根據(jù)750設備的寬度來指定,一般指定1334核无,也可以不配置 
      unitPrecision: 3, // 指定`px`轉換為視窗單位值的小數(shù)位數(shù)(很多時候無法整除) 
      viewportUnit: 'vw', // 指定需要轉換成的視窗單位,建議使用vw 
      selectorBlackList: ['.ignore', '.hairlines'], // 指定不轉換為視窗單位的類藕坯,可以自定義团南,可以無限添加,建議定義一至兩個通用的類名 
      minPixelValue: 1, // 小于或等于`1px`不轉換為視窗單位噪沙,你也可以設置為你想要的值 
      mediaQuery: false // 允許在媒體查詢中轉換`px`
    }, 
    "cssnano": {  // 主要用來壓縮和清理CSS代碼
      preset: "advanced", 
      autoprefixer: false, // 插件是用來自動處理瀏覽器前綴的一個插件, 重復調用, postcss-cssnext已經(jīng)有了
      "postcss-zindex": false // 啟用了這個插件,z-index的值就會重置為1吐根。這是一個天坑
    }
  }
  1. 保留px方案

通過添加類名, .ignore, 可以配置

  1. 之后直接根據(jù)設計稿寫就行

第三, create-react-app搭配webpack做適配(事實上還是webpack)

px轉rem(手淘團隊的lib-flexible) demo: react-normal

  1. 參考: https://blog.csdn.net/zhuming3834/article/details/84319296

  2. 步驟:

    1. 安裝cnpm i lib-flexible postcss-px2rem

    2.找到node_modules/react-scripy/config/webpack.config.dev.js

const px2rem = require('postcss-px2rem');

const getStyleLoaders = (cssOptions, preProcessor) => {
const loaders = [
  require.resolve('style-loader'),
  {
    loader: require.resolve('css-loader'),
    options: cssOptions,
  },
  {
    loader: require.resolve('postcss-loader'),
    options: {
      ident: 'postcss',
      // 這些是配置rem的
      plugins: () => [
        require('postcss-flexbugs-fixes'),
        require('postcss-preset-env')({
          autoprefixer: {
            flexbox: 'no-2009',
          },
          stage: 3,
        }),
        px2rem({remUnit: 75})  // 這里表示 75px = 1rem
      ],
    },
  },
  {
    loader: require.resolve('less-loader') // compiles Less to CSS
  }
];
if (preProcessor) {
  loaders.push(require.resolve(preProcessor));
}
return loaders;
};
  1. 找到node_modules/react-scripy/config/webpack.config.prod.js
  plugins: () => [
  require('postcss-flexbugs-fixes'),
  require('postcss-preset-env')({
    autoprefixer: {
      flexbox: 'no-2009',
    },
    stage: 3,
  }),
  px2rem({remUnit: 75})
],
  1. 在index.js中引入import 'lib-flexible'

  2. 之后直接根據(jù)設計稿寫就行

px轉vw(手淘推出的vw布局) demo: react-mobile

  1. 參考: https://go.ctolib.com/article/wiki/82279

  2. 步驟: 有點尷尬, 沒配置出來, demo沒有用

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末正歼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拷橘,更是在濱河造成了極大的恐慌局义,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冗疮,死亡現(xiàn)場離奇詭異萄唇,居然都是意外死亡,警方通過查閱死者的電腦和手機术幔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門另萤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诅挑,你說我怎么就攤上這事四敞。” “怎么了拔妥?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵忿危,是天一觀的道長。 經(jīng)常有香客問我没龙,道長铺厨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任兜畸,我火速辦了婚禮努释,結果婚禮上,老公的妹妹穿的比我還像新娘咬摇。我一直安慰自己伐蒂,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布肛鹏。 她就那樣靜靜地躺著逸邦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪在扰。 梳的紋絲不亂的頭發(fā)上缕减,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音芒珠,去河邊找鬼桥狡。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的裹芝。 我是一名探鬼主播部逮,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嫂易!你這毒婦竟也來了兄朋?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤怜械,失蹤者是張志新(化名)和其女友劉穎颅和,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缕允,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡峡扩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灼芭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片有额。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖彼绷,靈堂內(nèi)的尸體忽然破棺而出巍佑,到底是詐尸還是另有隱情,我是刑警寧澤寄悯,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布萤衰,位于F島的核電站,受9級特大地震影響猜旬,放射性物質發(fā)生泄漏脆栋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一洒擦、第九天 我趴在偏房一處隱蔽的房頂上張望椿争。 院中可真熱鬧,春花似錦熟嫩、人聲如沸秦踪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椅邓。三九已至,卻和暖如春昧狮,著一層夾襖步出監(jiān)牢的瞬間景馁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工逗鸣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留合住,地道東北人绰精。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像聊疲,于是被迫代替她去往敵國和親茬底。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容