移動端適配--meta標簽玩的是什么

基本一直都在做移動端的開發,rem布局也寫了很久,不過對于實現的原理有些模棱兩可的盲點,自己總結一下留著以后回顧。 本文分以下幾個層面,主打用最最通俗的語言來闡述。

  1. 布局小例子
  2. viewport作用
  3. viewport和移動端適配的關系
  4. flexible.js原理
  5. vw vh
  6. flexible.js VS vw vh

布局小例子----常見困惑

iphone6尺寸是375*667,那給div設置寬度375px后,為什么寬度不是充滿屏幕呢? 代碼如下:(為了方面看,我全截圖吧)

然后運行結果如下:

這是為什么呢? 來看一下頁面寬度是多少

哦?這個980是哪里來的呢?帶著疑問引出本文的主角----viewport

viewport作用

viewport是什么?翻譯過來就是視窗的意思,只不過在移動端,視窗稍微有點繞。在解釋這個之前,不得不引出幾個詞匯,分別是物理像素(physical pixel),設備獨立像素(density-indenpendent pixel),設備像素比(device pixel ratio),要怎么通俗理解這三個詞呢? 容我找找網上的圖。

物理像素

手機屏幕顯示圖像的最小單元。上圖中iphone4和3gs,同樣大小尺寸情況下,iphone4明顯畫面細膩很多,這是為什么?屏幕尺寸沒變,分辨率提升,畫面就細膩了,更通俗一點的就是iphone4用來顯示圖像的點更多了,把屏幕上的物理像素點想象成整齊排列的點陣,3gs有320 * 480個點而ip4有960 * 640個點。

設備獨立像素

如果把物理像素看做是負責顯示圖像的硬件的話,那么設備獨立像素是什么呢?我們平時寫的css像素就是設備獨立像素的一種了。而這1px的css像素,在不同的手機卻是呈現不同的,為什么ip4畫面細膩?就是人家用4個物理像素點來描繪一個css像素。

設備像素比

也就是常說的dpr , dpr = 物理像素/設備獨立像素(注意,是在某一方向的,x軸或者y軸) , 理解這個很重要,iphone6的dpr是2,iphonex的dpr是3。

dpr是2的情況下css畫一個點,這個點是由4個物理像素點提供支撐的。畫一條線的話,那這條線其實是2排物理像素點支撐的。

同理,dpr是3的情況下css畫一個點,這個點是由9個物理像素點提供支撐的。畫一條線的話,那這條線其實是3排物理像素點支撐的。

viewport登場

在移動端,視窗分為三種,分別為layoutviewport、visualviewport、idealviewport。可以先記住一個,idealviewport就認為是設備寬度就好,iphone6就是375,iphone6p 就是414 ,其余兩個先看我下面例子吧。

對于上面的代碼做簡單修改
簡要說明下: js動態生成一個關于viewport的標簽,meta標簽可以控制viewport的縮放。

window.devicePixelRatio : 查看設備dpr

document.documentElement.clientWidth : 查看layoutviewport寬度

window.visualViewport.width : 查看visualViewport寬度

window.innerWidth : 查看文檔寬度

只設置initial-scale = 1

不加meta標簽

initial-scale=2, width=device-width

initial-scale= 0.5 , width=device-width

需要來個小結了:

layoutviewport

默認是980 (針對ios)

設置縮放為1 寬度為設備寬度時:就是375(設備寬度)

設置縮放為2 寬度為設備寬度時:還是375(設備寬度)

設置縮放為0.5 寬度為設備寬度時:是750(設備寬度的2倍)

layoutviewport 取設置的寬度或者visualviewport他們中的最大值

visualviewport

默認是980 (針對ios)

設置縮放為1 寬度為設備寬度時:就是375(設備寬度)

設置縮放為2 寬度為設備寬度時:是187.5(設備寬度一半)

設置縮放為0.5 寬度為設備寬度時:是750(設備寬度的2倍)

其實是有公式的,visualviewport = 設備寬度/縮放。也就是visualviewport = idealviewport / initial-scale

idealviewport

顧名思義,是理想視窗意思,就是指的設備尺寸,主要用來和initial-scale配合,計算也就是visualviewport用的。

那layoutviewport和visualviewport負責什么

其實也是可以從名字就看出來的,layoutviewport布局視窗,visualviewport視覺視窗。 這里加個圖,initial-scale = 1 width=devide-width,然后box寬度設置750px,發現html寬度在375,頁面出現滾動條,并且,有意思的是,是按照375寬度排列的,只有那個設置了寬度是750的box寬度變大,所以layoutviewport負責布局,visualviewport負責視覺,是不是有了點直觀印象了,如下圖:

layoutviewport和visualviewport不一致的情況下,頁面就會出現滾動條。(截圖滾動條不明顯)

viewport和移動端適配關系

這里就更不好用語言描述了,有些抽象。回顧上文,知道iphone3gs iphone6 iphonex三者屏幕尺寸大小不同,dpr的話,前兩者是1 2 而 iphonex是3。那如何使得一張前端頁面,在每個手機看起來都是一樣大呢?以iphone6和iphonex來舉例,雖然屏幕寬度都是375,但是iphonex卻擁有更加密集的物理像素點陣。iphone3gs更不用說,320的寬度,dpr又是1。 倘若我們規定,只用設備的物理像素,來繪制css的像素,要求一比一的繪制,那一張320px寬度的頁面,在3個手機上的展示一定大致如下:

這只是一個示意圖,也許并不精準。不過大體就是這樣的,ip6寬度有著750個物理像素點,iphonex寬度有1125個物理像素點,所以根據上面的假想要求,畫出來的一定是這樣的。那么想要iphone6畫出的這個320px的頁面也充滿屏幕的話,要怎么做?首先假如設置initial-scale=1, width=device-width,這種情況下,寬度375的iphone6畫出寬度320px的前端頁面大致什么樣呢?

就是這樣的效果圖,但是需要注意的是,此時的一條橫線,3gs是用一排物理像素點描繪的,而iphone6確是用了兩排物理像素點!也就引申出了經典的1px邊框問題。iphone6的物理像素點再密集,用兩排畫一條線和只用一排畫一條線,還是能看出差距的。那么這種情況是不可取的。那假如設置initial-scale=0.5, width=device-width,這種情況下呢?我也想畫出看著和iphone3gs一樣視覺大小的圖像的話,(注意是視覺大小哦,就是拿著兩手機,看著屏幕中的圖一樣大。)要怎么做呢?根據上面知識,對視窗進行了0.5縮放,那此時肉眼看到視覺是不是就和上面提到的這個圖一致了呢?

所以,我們需要在這種情況下,寫css是寬度寫為640px,就能看起來和上面initial-scale=1, width=device-width一樣的效果了!也解決了1px像素問題!

rem適配方案

rem是什么,這個大家應該都清楚了。就是給html設置字體大小,假如是30px,那么頁面中寫了2rem那就是60px。 設計給出一張設計稿,頁面寬度是750px,其中一個div標注了是寬度375px。如何做到在iphone6和iphonex中,看到的這個div都是屏幕寬度的一半呢?

相信大家都已經有答案了。

對于iphone6 設置initial-scale=0.5, width=device-width,然后就直接寫375px就好 對于iphonex 設置initial-scale=1/3, width=device-width,然后就直接寫(375*(3/2))px就好。 缺點就是需要我們自行計算。

rem方案 : 設計稿750px,div標注375px,對于iphone6 設置initial-scale=0.5, width=device-width,如果html設置font-size為75px,那div我們就直接寫5rem就行了。然后適配到iphonex中時,不需要改變div的5rem,只需改變在iphonex中html的字體以及頁面縮放,設置 iphonex中 initial-scale=1/3, width=device-width,然后設置html字體為112.5px,此時的5rem為562.5px,剛好是屏幕1125的一半。

flexible.js原理

上面關于rem適配已經思路實現,現在還差幾個環節,就是為什么設置iphone6是0.5縮放,iphonex是1/3縮放呢?然后又根據什么設置的html字體?

答: dpr 。那么又是怎么設置的?flexible.js就要登場了,flexible.js是手淘的前移動端適配解決方案,為什么是前方案,因為目前瀏覽器對于vw vh支持的更加友好,這個后面再說。看看flexible.js做了什么吧,直接截圖一些代碼吧。

感覺沒什么好解釋的,就是獲取設備dpr,然后確定scale嘛

然后把meta標簽塞到html中

因為已經縮放好了頁面,此時iphonex的話,這個width拿到的就是1125了,rem就112.5并設置到html字體中

不過rem我們自己來計算的話就很繁瑣了,如給的iphone6,寬度750的設計稿,標注的375px,我們就寫375px就好,當然是寫成px2rem(375)這樣。

關于flexible.js的實現原理,我也就是挑重點的說了說,還是建議大家去看大漠老師寫的源碼,一百多行代碼而已,挺好的,也很容易看懂,不過要想清楚為什么要那么做,就是我上面大篇幅寫的東東啦~

vw vh

關于vw vh其實是將視口寬度 window.innerWidth 和視口高度 window.innerHeight 等分為 100 份,并且此時的視窗并不會隨著 viewport 的不同設置而改變。

vw : 1vw 為視口寬度的 1%

vh : 1vh 為視口高度的 1%

上面說的設計稿為 750px,那么 1vw = 7.5px,100vw = 750px。此時給的不是750設計稿也沒所謂,假如給1000px的設計稿,那我們寫的1v我就是10px。其實這不就是rem做的事嗎?只不過我們用rem+flexible.js繞了一圈的感覺

后面具體項目中新頁面用vw試試,有什么坑 待補充

flexible.js VS vw vh

作為后面要補充的點吧,vw等我項目具體實操一波,再來補這個

轉載于:https://juejin.im/post/5ce1449ff265da1bcd37a8cd

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251751.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python-json

demjson.encode(self, obj, nest_level0) :用于將 Python 對象編碼成 JSON 字符串。 #!/usr/bin/python import demjsondata [ { a : 1, b : 2, c : 3, d : 4, e : 5 } ]json demjson.encode(data) print json demjson.decode(self, txt) :解碼 JSON 數…

計算機基礎知識--編碼知識

編碼回顧 編碼轉換 Python的bytes類型 編碼回顧 在備編碼相關的課件時,在知乎上看到一段關于Python編碼的回答 這哥們的這段話說的太對了,搞Python不把編碼徹底搞明白,總有一天它會猝不及防坑你一把。 不過感覺這哥們的答案并沒把編碼問題寫明…

Linux——安裝FTP服務器

1、檢查安裝vsftpd軟件 使用如下命令#rpm -qa |grep vsftpd可以檢測出是否安裝了vsftpd軟件, 如果沒有安裝,使用YUM命令進行安裝。 2、啟動服務 使用vsftpd軟件,主要包括如下幾個命令: 啟動ftp命令#service vsftpd start 停止ftp…

測試開發面試準備之Selenium 工作原理

Selenium 經歷了兩個版本,Selenium 1.0 和 Selenium 2.0,本文僅介紹Selenium2的原理,在Selenium 2.0 主推的是WebDriver,Selenium2又名Selenium Webdriver。 Selenium2簡介 Selenium是一個用于Web應用程序測試的工具,支持多平臺、…

CodeForces 11D(狀壓DP 求圖中環的個數)

Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no repeated vertices or edges. Input The first line of input contains two integers n and m (1?≤?n?≤?19, 0?≤?m) – respectively the number of vertices an…

vue插槽的使用(slot)

插槽 該頁面假設你已經閱讀過了組件基礎。如果你還對組件不太了解&#xff0c;推薦你先閱讀它。 插槽內容 Vue 實現了一套內容分發的 API&#xff0c;這套 API 基于當前的 Web Components 規范草案&#xff0c;將 <slot> 元素作為承載分發內容的出口。 它允許你像這樣合成…

圖片與二進制流轉換

#region//圖片轉換為二進制流 public void PictureToBinaryStream() { //獲取當前程序運行路徑 string path Application.StartupPath; //拼接成測試圖片路徑 string fullPath path "\\images\\test.png"; //初始化類 Bitmap bmp…

仿MIUI彈性列表

前言 最近去小米之家體驗了下小米9&#xff0c;發現MIUI有一個挺特別的列表動畫效果&#xff0c;在系統上的各種應用上都能見到它的身影。 網上查了下&#xff0c;小米早在幾個系統版本前就有這個&#xff0c;網上也有了實現這個效果的控件庫。實現方法大同小異&#xff0c;大多…

10、angular的全部api

1、lowercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.lowercase(AbCdEf))}); 2、uppercase var app angular.module(myApp, []);app.controller(myCtrl, function($scope) { console.log(angular.uppercas…

JavaScript快速入門-ECMAScript本地對象(String)

一、String對象 String對象和python中的字符串一樣&#xff0c;也有很多方法&#xff0c;這些方法大概分為以下種類&#xff1a; 1、索引和查找 1、charAt() 返回指定位置的字符。 2、charCodeAt() 返回指定位置的字符的 Unicode 編碼。這個返回值是 0 - 65535 之間的整數。 …

8、angular的select

1、數據源為數組 x for x in names第一個x代表在下拉框內顯示的數據 第二個x指的是在names里數據 <!DOCTYPE html><html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0…

ZOJ4116 Game on a Graph

給一個含n個點 m條邊的連通圖 把k個人分成兩組 輪流拿掉一條邊 當取走一條邊后圖不再連通 這個隊就輸了 水題啦 邊為n-1時 下一個拿掉邊的那個組就輸啦 AC代碼&#xff1a; 1 #include<bits/stdc.h>2 using namespace std;3 typedef long long ll;4 typedef unsigned lon…

集美大學1414班軟件工程個人作業2——個人作業2:APP案例分析

一、作業鏈接 個人作業2&#xff1a;APP案例分析 二、博文要求 通過分析你選中的產品&#xff0c;結合閱讀《構建之法》&#xff0c;寫一篇隨筆&#xff0c;包含下述三個環節的所有要求。 第一部分 調研&#xff0c; 評測 下載軟件并使用起來&#xff0c;描述最簡單直觀的個人第…

全局eslint不生效的處理

react項目里能用上 eslint 的 airbnb 規范真是的&#xff0c;對自己的編碼有很好的幫助&#xff0c;不經可以養成良好的代碼風格&#xff0c;而且還能檢測出 state或者變量 是否 使用過&#xff0c; 然而&#xff0c;所在團隊的小伙伴們&#xff0c;卻并未使用&#xff0c;或者…

IP通信基礎

源端口和目的端口字段--各占2字節。端口是傳輸層與應用層的服務接口。傳輸層的復用和分用功能都要通過端口才能實現。序號字段--占4字節。TCP連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段所發送的數據的第一個字節的序號轉載于:https://www.…

回溯算法 ------回溯算法的幾個例子

1.回溯算法的小結 2.回溯算法的幾個例子 2.1 ------ 4后問題 搜索空間&#xff1a; 2.2 ------01背包問題 01背包問題的算法設計 01背包問題的實例分析 01背包問題的搜索空間 2.3 ------- 貨郎問題 貨郎問題實例 貨郎問題的搜索空間 最后再來個小結 轉載于:https://www.cnb…

Phaserjs V2的state狀態解析及技巧

用phaserjs開發了好多游戲了&#xff0c;但是對phaser還是了解不深&#xff0c;只知道怎么去用&#xff0c;今天就特意花點時間研究下phaser的狀態管理到底是怎么回事。 首先&#xff0c;new Phaser.Game&#xff0c;以下是Phaser.Game的部分源碼&#xff1a; Phaser.Game fun…

JAVA_出神入化學習路線大綱

注&#xff1a;參考GitHub上的項目&#xff08;toBeTopJavaer&#xff09;總結出來 也是自己的目標。 基礎篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899066.html 進階篇&#xff1a;https://www.cnblogs.com/blogzcc/p/10899841.html 高級篇&#xff1a;https://www…

Ubuntu安裝并使用sogou輸入法

1.下載搜狗輸入法的安裝包 下載地址為&#xff1a;http://pinyin.sogou.com/linux/ ,如下圖&#xff0c;要選擇與自己系統位數一致的安裝包&#xff0c;我的系統是64位&#xff0c;所以我下載64位的安裝包 2.按鍵CtrAltT打開終端&#xff0c;輸入以下命令切換到下載文件夾: [ht…

面試題之web

1. django和flask框架的區別&#xff1f; django&#xff1a;大而全的全的框架&#xff0c;重武器&#xff1b;內置很多組件&#xff1a;ORM、admin、Form、ModelForm、中間件、信號、緩存、csrf等 flask: 微型框架、可擴展強&#xff0c;如果開發簡單程序使用flask比較快速&am…