移動端適配思路淺析

来源:https://www.cnblogs.com/zhangguicheng/archive/2020/01/04/12150558.html
-Advertisement-
Play Games

本文主要講了一些移動端適配的基本思路和一些代碼示例,並沒有講解具體的移動端適配的方案,主要從為什麼這麼做出發講了一些自己粗淺的理解。 所謂移動端適配,就是頁面運行在移動端並且會根據當前運行的移動端設備的大小自行進行調整。 實現移動端適配可以按照以下思路出發, 首先要將 viewport 的寬度等於設 ...


本文主要講了一些移動端適配的基本思路和一些代碼示例,並沒有講解具體的移動端適配的方案,主要從為什麼這麼做出發講了一些自己粗淺的理解。

所謂移動端適配,就是頁面運行在移動端並且會根據當前運行的移動端設備的大小自行進行調整。

實現移動端適配可以按照以下思路出發,

  • 首先要將 viewport 的寬度等於設備的寬度,即

    <meta name= "viewport" content="width=device-width initial-scale=1.0">

  • 通過 rem, media query 等方式改變不同設備上元素的大小

    rem 是一個相對單位,一般 1rem = html設置的 font-size 的值。

    關於 rem 的詳細介紹可以參考 移動 web 開發適配秘籍 Rem 這個免費課程。

    通過設置不同設備 html 的 font-size 改變 rem 的值,令 1rem 單位的值隨著設備的增大而增大。

    media query 可以判斷當前是什麼設備,然後根據不同的設備設置不同的樣式。

  • 在設計上還要做一些事情,例如

    隱藏:將 PC 端將一些不重要的內容(如友情鏈接等)在移動端直接隱藏掉

    折行:在 PC 端顯示在一行的內容在移動端可以顯示幾行(這一點上設置了 meta 標簽後會自動幫你做,也可以在此基礎上自己手動設置一些樣式實現折行的效果)

    自適應:例如在設置樣式時設置一些元素的寬度是自適應的,隨著設備寬度的不同會自動改變(例如使用 flex 就可以令有些元素實現自適應)

接下來對上面的內容做一些簡單介紹和代碼驗證。

先說一下 viewport 這個 meta 標簽。

<meta name="viewport" content="width=device-width, initial-scale=1.0" >

為什麼要讓可視區域的寬度等於設備的寬度?

viewport 指的是可視區域(說白了就是展示頁面的區域,一般情況下當然是設備的屏幕多大就讓展示頁面的區域是多大,如果屏幕的寬度是 320px,不設置可視區域的大小為 320px,將一個 960px 的頁面(假設PC端頁面是960px這麼大)硬生生地展示在 320px 屏幕上,只能將頁面整體縮小為原來的 1/3 去展示,那用戶看起來頁面上的字就太小了。

如果將可視區域的寬度調整為設備屏幕的寬度,這樣會PC端 960px 的頁面會在 320px 寬度的設備上重新佈局,例如之前在 PC 端要展示在一行的內容,在移動端由於寬度只有 320px 一行肯定展示不下了,所以就會進行換行。經過這樣佈局顯示出來的字體大小和 PC 端是一樣的,用戶體驗就會比較好。

所以我們需要將可視區域的寬度設置為設備的寬度,接下來會有代碼進行驗證。

對於下麵的代碼

 <style>
    .container{
      margin:0 auto;
      max-width:800px;
      display: flex;
      border:1px solid black;
    }
    .left{
      display: flex;
      width: 200px;
      background:red;
      margin:5px;
    }
    .right{
      display: flex;
      flex: 1;
      background:blue;
      margin:5px;
    }

  </style>
</head>
<body>
<div class="container">
  <div class="left">
    這裡是一些不重要的內容,比如友情鏈接、廣告
  </div>
  <div class="right">
    這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。這裡是一些重要的內容,比如一篇文章,文章是整個頁面的核心內容。
  </div>
</div>
</body>

如果不加 <meta name="viewport" content="width=device-width, initial-scale=1.0" >,在PC 端的頁面如下

響應式佈局PC端

在 iPhonex上的頁面

響應式佈局移動端頁面

很明顯,在移動端上並沒有進行適配只是進行了等比例縮放,導致字體很小,用戶體驗差。

這個時候再加上 <meta name="viewport" content="width=device-width initial-scale=1.0">,在移動端的頁面如下所示

響應式佈局移動端2

可見並不是進行整體縮放,而是根據設備的寬度通過換行等方式進行了適配,這個時候的字體和PC端的字體大小也差不多,用戶體驗好。

通過 <meta name="viewport" content="width=device-width initial-scale=1.0"> 這條語句來進行移動端適配在一些比較簡單的情況,對移動端適配要求比較低的情況下是可以的,但是如果想要進行更好的移動端適配還要採用一些其他的措施,例如媒體查詢等。

上圖中,紅色的部分實際上在移動端可以不用顯示的,因為它並不是重要的內容,這個時候就可以採用媒體查詢的方式當設備的寬度小於某個值之後就隱藏左邊紅色的區域。

可以在上面的 css 代碼中添加媒體查詢,當設備的寬度小於 640px 時就隱藏左邊的紅色區域。

@media (max-width: 640px){
 .left{
   display: none;
 }
}

在 iphonex 的顯示情況如下圖所示:

iphonex移動端適配

再來看一個案例:

HTML 代碼:

<div class="container">
  <div class="intro">
    介紹1
  </div>
  <div class="intro">
    介紹2
  </div>
  <div class="intro">
    介紹3
  </div>
  <div class="intro">
    介紹4
  </div>
</div>

CSS 代碼

.container{
  margin:0 auto;
  max-width:800px;
  border:1px solid black;
}
.intro{
  display: inline-block;
  width:180px;
  height:180px;
  line-height: 180px;
  text-align: center;
  border-radius: 90px;
  border:1px solid red;
  margin:7px;
}

在 PC 端頁面顯示如下:

不加 <meta name="viewport" content="width=device-width initial-scale=1.0"> 時移動端頁面如下:

會發現頁面只是在 pc 端的基礎上進行了等比例縮放,現在加上 meta 標簽,

可以看到添加meta標簽後會自動根據設備的寬度進行適配,iphone 5 的寬度為 320px,圓圈的寬度為 182px, margin-left 為 7px,再加上右邊還有 7px 的 margin-right,所以加起來一共占了 196px,所以還剩下 124px,所以第二個圓圈只能排在第二行。

現在有個問題是靠左邊太多了,我們想讓它在移動端時可以居中,所以利用媒體查詢,加上下麵的 css 代碼。

@media (max-width: 640px) {
  .intro {
    margin: 7px auto;
    display: block;
  }
}

註意這個地方必須加上 display: block,不加之前是 inline-block,在 inline-block 條件下 auto 是不會起效果的,左右沒有 margin 值。

block 元素是會占據一行的,所以 auto 可以居中,向 inline-block 並不會單獨占一行,它的寬度是有限的,談不上 auto。

加上上面的媒體查詢之後,當設備寬度小於 640px 時就會圓圈就會居中顯示。

現在還有一個問題是由於圓圈的數值是通過 px 單位寫死的,所以無論設備的大小如何改變,圓圈的大小是不會改變的,隨著設備寬度(小於640px)的變化,圓圈的大小始終是不會變化的。

這樣隨著設備寬度的增加,圓圈就顯得比較小了,那麼有沒有什麼方法可以使得隨著設備寬度的增加,圓圈也可以隨著增加呢?

可以的,通過 rem 就可以實現。

rem 是一種根據 html 的 font-size 改變動態修改值的相對單位。

我們可以通過設置媒體查詢,設置幾個設備寬度下不同的 html 的 font-size ,這樣當設備寬度變大時,1 rem 的值也隨著變大,這樣就可以實現圓圈跟著變大了。

這裡假設 1rem = 20px

將 css 代碼中的 px 變為 rem

.container{
  margin:0 auto;
  max-width:800px;
  border:1px solid black;
}
.intro{
  display: inline-block;
  width:9rem;
  height:9rem;
  line-height: 9rem;
  text-align: center;
  border-radius: 4.5rem;
  border:1px solid red;
  margin:.3rem;
}
@media (max-width: 375px){
  html{
    font-size:24px;
  }
}
@media (max-width: 320px){
  html{
    font-size:20px;
  }
}
@media (max-width: 640px) {
  .intro {
    margin: .3rem auto;
    display: block;
  }
}

註意 @media (max-width: 375px) 一定要寫在 @media (max-width: 320px) 的前面,否則將會一直應用 @media (max-width: 375px) 的樣式,例如 設備的寬度為 220px,這個時候兩個都滿足,但是由於@media (max-width: 375px) 在後面所以它設置的樣式會覆蓋前面的樣式。

設置完後,當設備寬度為 375 時 html 的 font-size為 24px,此時 1rem = 24px(之前 1rem = 20px)所以圓圈會被放大一些。

通過上圖可以看到,圓圈的大小變成了 218*218,不再是之前的 182*182

註意 使用 rem 時有時計算出來的像素是不精準的,例如上例中我想令 .intro 元素的高度為 175 px,由於 1 rem = 24 px,所以 需要設置

height = 7.2916666666666666666666666666667rem 在實際應用一般不會取小數點後那麼多位,假設這裡取 height = 7.3 rem 所以 height 應該為 7.3 * 24 = 175.2,但是在瀏覽器中 height 卻是 177.19 減去上下的邊框等於 175.19 並不等於 175.2,所以會有一點偏差。

所以,在對像素精度要求很高的地方,使用 rem 時要格外謹慎。

完,如有不恰當之處歡迎指正哦。


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

-Advertisement-
Play Games
更多相關文章
  • 組件化思想,包含: 下拉菜單項封裝 + 按需載入 搜索功能組件化,顯示數據 + 下拉顯示 + 緩存 分類導航按需載入 幻燈片效果組件封裝及按需載入 商品樓層模塊組件化 + 商品數據按需載入 + Tab選項卡 + 電梯結構 是時候放出大長圖了!!! index.html <!DOCTYPE html> ...
  • 第二個版本:點擊預約掛號可跳轉到排班表,獲取之後7個星期的排班 先放圖 首先是index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> <!-- 框架 --> <lin ...
  • 帶二級導航、輪播海報、二級聯動、搜索功能、Tab選項卡 按照國際慣例先放圖 index.html <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>城市醫院預約平臺</title> <link rel=" ...
  • 尺寸和邊框: 一、尺寸 行內元素是不能設置寬和高的,其高度是由元素裡面的內容的高度撐起來的; 行內塊元素可以設置寬和高,當行內塊元素沒有設置寬高的時候,行內塊元素的寬高是其預設的寬高; 塊級元素:可以設置寬高,但是如果沒有設置寬,則其預設寬度是該塊級元素的父級元素的寬度的100%;如果沒有設置高度, ...
  • javascript正則表達式驗證IP地址的埠合法性(0-65535) ...
  • 隨著小程式的發展與功能的逐步完善,越來越多的產品需要小程式與 APP 的功能能有一些共性,社區跨平臺的解決方案越來越多,比如 taro 等為代表的把一套代碼編譯成多端運行的機制,本文會使用 Swift 作為原生語言,在 iOS 應用上運行一個小程式 Demo, 使用 Android && React ...
  • Ajax AJAX即“Asynchronous Javascript And XML”:是,不發生頁面跳轉、非同步請求載入內容並改寫局部頁面內容的技術。 也可以簡單的理解為通過JS向伺服器發送請求。 同步處理: 就是當我們通過一個頁面向伺服器發送一個請求時,在伺服器響應結束之前,我們的整個頁面是不能操 ...
  • 原型和原型鏈 原型鏈是一種關係, 實例對象和原型對象之間的關係,關係是通過實例對象中瀏覽器使用的原型(__proto__)來聯繫的 自定義構造函數,通過實例化,創建實例對象 實例對象中__proto__是原型,瀏覽器使用的 構造函數中的prototype是原型,程式員使用的 //使用對象 >使用對象 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...