比較好用的移動端適配的兩種方案及flexible和px2rem-loader在webpack下的配置

来源:https://www.cnblogs.com/beileixinqing/archive/2019/08/01/11283315.html
-Advertisement-
Play Games

移動端適配,目前自己常用的兩種 方案,參考以下兩篇好文 方案一:使用lib-flexible包 https://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html 使用flexible包方式,安裝 lib-flexible 包和 px2 ...


移動端適配,目前自己常用的兩種 方案,參考以下兩篇好文

方案一:使用lib-flexible包

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

使用flexible包方式,安裝 lib-flexible 包和 px2rem-loader包

npm install --save-dev lib-flexible px2rem-loader

在需要的js文件中頭部引入,如果是vue項目就引入到main.js中:

import 'lib-flexible'

webpack配置loader,註意順序很重要,順序不對會出錯

{
                test: /\.css$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader',
                    {loader: 'px2rem-loader', options: {
                            remUni: 75,
                            remPrecision: 8,
                        }},
                    {loader: 'postcss-loader', options: {plugins: [require("autoprefixer")("last 100 versions")]}}
                ]
            },
            {
                test: /\.less$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader?importLoaders=1',
                    {loader: 'px2rem-loader', options: {
                            remUni: 75,
                            remPrecision: 8,
                        }},
                    {loader: 'postcss-loader', options: {plugins: [require("autoprefixer")("last 100 versions")]}},
                    'less-loader',
                ]
            },

 

這裡有個問題,在安卓下flexible.js源碼是全部按dpr=1來適配的,那自然是不行的,我們修改一下源碼,改為按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 {
            // 其他設備下,仍舊使用1倍的方案
            dpr = devicePixelRatio; //這裡將原來=1改為devicePixelRatio
        }

然後寫針對不同dsp下字體大小的視頻,這裡用less實現:

.font-dpr(@font-size) {
  font-size: @font-size;
  [data-dpr="1"] & {
    font-size: @font-size;
  }
  [data-dpr="2"] & {
    font-size: @font-size * 2;
  }
  // for mx3
  [data-dpr="2.5"] & {
    font-size: @font-size * 2;
  }
  //for 小米note,for 小米mix
  [data-dpr="2.75"] & {
    font-size: @font-size * 2.2;
  }
  [data-dpr="3"] & {
    font-size: @font-size * 2.2;
  }
  // for 三星note4 ,三星s6
  [data-dpr="4"] & {
    font-size: @font-size * 2;
  }
}

使用的時候直接.font-dpr(20) 這樣嬸兒就可以了。

方案二:使用less或者sass等CSS 預處理語言寫適配方案

https://juejin.im/post/5caaa230e51d452b672f9703#heading-7

基準按照設計圖尺寸,但是缺點是不通用,不同頁面可能設計圖基準尺寸不同,導致在頁面自己的less文件中重置基準值也不生效,這裡想到了一個相容的辦法,就是在本頁面的less中將傳入寬度或字體的數字進行換算。

這裡貼出我的mixin.less

// rem 單位換算:定為 75px 只是方便運算,750px-75px、640-64px、1080px-108px,如此類推
@baseSize: 37.5; // 預設根元素大小基準值375,即設計圖尺寸為寬375px,不同頁面設計圖尺寸不同,在頁面css頭部重新初始化並重新定義html根元素的font-size
@baseDesign: 375;

.font-size(@px) {
  font-size: (@px/@baseSize/2)*1rem;
}

.margin(@px) {
  margin: (@px/@baseSize/2)*1rem;
}
.margin-all(@a,@b,@c,@d) {
  margin: (@a/@baseSize/2)*1rem (@b/@baseSize/2)*1rem (@c/@baseSize/2)*1rem (@d/@baseSize/2)*1rem;
}

.padding(@px) {
  padding: (@px/@baseSize/2)*1rem;
}
.padding-all(@a,@b,@c,@d) {
  padding: (@a/@baseSize/2)*1rem (@b/@baseSize/2)*1rem (@c/@baseSize/2)*1rem (@d/@baseSize/2)*1rem;
}
.width(@px) {
  width: (@px/@baseSize/2)*1rem;
}
.height(@px) {
  height: (@px/@baseSize/2)*1rem;
}
.min-width(@px) {
  min-width: (@px/@baseSize/2)*1rem;
}
.max-width(@px) {
  max-width: (@px/@baseSize/2)*1rem;
}
.line-height(@px) {
  line-height: (@px/@baseSize/2)*1rem;
}
.margin-right(@px) {
  margin-right: (@px/@baseSize/2)*1rem;
}

.padding-right(@px) {
  padding-right: (@px/@baseSize/2)*1rem;
}
.margin-left(@px) {
  margin-left: (@px/@baseSize/2)*1rem;
}

.padding-left(@px) {
  padding-left: (@px/@baseSize/2)*1rem;
}
.margin-top(@px) {
  //margin: @px /(@baseDesign/2) * 100vw;
  margin-top: (@px/@baseSize/2)*1rem;
}

.padding-top(@px) {
  padding-top: (@px/@baseSize/2)*1rem;
}
.margin-bottom(@px) {
  margin-bottom: (@px/@baseSize/2)*1rem;
}

.padding-bottom(@px) {
  padding-bottom: (@px/@baseSize/2)*1rem;
}
.border(@px,@color) {
  position: relative;
  &::before{
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    width: 200%;
    border:1px solid @color;
    color: @color;
    height: 200%;
    -webkit-transform-origin: left top;
    transform-origin: left top;
    -webkit-transform: scale(0.5);
    transform: scale(0.5);
    pointer-events: none; /* 防止點擊觸發 */
    box-sizing: border-box;
    @media screen and (min-device-pixel-ratio:3),(-webkit-min-device-pixel-ratio:3){
      width: 300%;
      height: 300%;
      -webkit-transform: scale(0.33);
      transform: scale(0.33);
    }
  }
}

.border-radius(@px) {
  border-radius: (@px/@baseSize/2)*1rem;
}

.border-width(@a,@b,@c,@d) {
  border-width: (@a/@baseSize/2)*1rem (@b/@baseSize/2)*1rem (@c/@baseSize/2)*1rem (@d/@baseSize/2)*1rem;
}

.top(@px){
  top: (@px/@baseSize/2)*1rem;
}

.left(@px){
  left: (@px/@baseSize/2)*1rem;
}

.right(@px){
  right: (@px/@baseSize/2)*1rem;
}

.bottom(@px){
  bottom: (@px/@baseSize/2)*1rem;
}

@imgPath: "../../assets/images/";

// 根元素大小使用 vw 單位
html {
  font-size: (@baseSize/(@baseDesign / 2)) * 100vw;

  @media screen and (orientation: landscape) {
    font-size: (@baseSize/(@baseDesign / 2)) * 100vh;
  }

  // 同時,通過Media Queries 限制根元素最大最小值
  @media screen and (max-width: 320px) {
    font-size: 64px;
  }
  //橫屏下ipad等平板font-size最大限制
 /* @media screen and (min-width: 813px) {
    font-size: 108px;
  }*/
}

如果使用該mixin的頁面設計圖寬度為其他尺寸,比如320,則進行換算:

@base: 320;
@convert: 375/@base;

.info{
    .width(56*@convert);
    .height(30*@convert);
}

這樣進行轉換之後可以保證頁面中顯示的尺寸是完全跟圖片中的尺寸一致。

如果設計圖頁面是一個banner類型,這樣相當於是頁面橫屏,且高度很低,建議重置mixin中的html根元素字體設置,由vh改為vw,形如:

html{
  width:100vw;
  height:100vh;
  @media screen and (orientation: landscape) {
    font-size: (@baseSize/(@baseDesign / 2)) * 100vw;
  }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 選擇器 1.核心選擇器 標簽選擇器 div{} id選擇器 one{} class選擇器 .second 逗號選擇器 div, id name{} 組合選擇器 div one{} 普通選擇器 一般不適用 (寬度加給父元素,高度加給子元素) 2.層次選擇器 子元素選擇器 .nav ul li {} 後 ...
  • 1.HTML簡介【瞭解】 1.1Hyper text markup language 超文本標記語言 超文本:可以對文本進行格式化編輯,還有文本的鏈接等等,具有傳統文本不具備的特性 標記:html上所有操作都是通過標記實現,標記就是標簽 語言 :不需要編譯,運行在瀏覽器上面 1.2HTML基本思想 ...
  • 前言 瀏覽器緩存是瀏覽器端保存數據用於快速讀取或避免重覆資源請求的優化機制,有效的緩存使用可以避免重覆的網路請求和瀏覽器快速地讀取本地數據,整體上加速網頁展示給用戶。瀏覽器端緩存的機制種類較多,總體歸納為九種,這裡詳細分析下這九種緩存機制的原理和使用場景。打開瀏覽器的調試模式——Applicatio ...
  • 鏈表用來存儲有序的元素集合,與數組不同,鏈表中的元素並非保存在連續的存儲空間內,每個元素由一個存儲元素本身的節點和一個指向下一個元素的指針構成。當要移動或刪除元素時,只需要修改相應元素上的指針就可以了。對鏈表元素的操作要比對數組元素的操作效率更高。下麵是鏈表數據結構的示意圖: 要實現鏈表數據結構,關 ...
  • accept 屬性只能與 <input type="file"> 配合使用。它規定能夠通過文件上傳進行提交的文件類型。 accept可以指定如下信息: *.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video *.ac3 audio/ac3 AC3 Audio * ...
  • 1.post的方法里要加responseType: 'blob'參數,不然下載的excel會亂碼 2.使用{type: "application/vnd.ms-excel"}的寫法,可以保存為xls格式的excel文件(相容老版本)。而使用“application/vnd.openxmlformat ...
  • 當代的年輕人喜歡接收一下新的事物,這老一輩的人眼睛里是不能夠被接受的,完全不能去理解,所謂青出於藍而勝於藍說的就是如此,在原先特別流行的網路語言,長江後浪推前浪,前浪拍死在沙灘上,後生可畏,就像我和我的妹妹,我們4歲只差就有很多的話題說不到一起去,看著4歲並不算多,但其實本是一個層次的人,她所追求的 ...
  • 問題描述: 在前端使用elementui的日期時間選擇器後,在通過axios進行提交的時候,前端控制台出現了400(數據類型不匹配的錯誤)的錯誤。 錯誤的原因:後臺實體類的註解問題 錯誤前的代碼: 解決之後的代碼: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...