移動端適配方案(上)

轉載自:https://github.com/riskers/blog/issues/17

要搞懂移動端的適配問題,就要先搞明白像素和視口。

像素

在移動端給一個元素設置?width:200px?時發生了什么?這里的px到底是多長呢?像素是網頁布局的基礎,但是我們一直在用直覺使用它。

其實存在兩種像素:

1. 設備像素

屏幕的物理像素,任何設備屏幕的物理像素的數量都是固定不變的,單位是pt

2. CSS像素

在CSS、JS中使用的一個抽象的概念,單位是?px

順便說下,CSS像素也可以稱為設備獨立像素(device-independent pixels),簡稱為dips,單位是dp

那么,我們現在再來說說一個元素?width:200px?以后會怎么樣。這個元素跨越了200個CSS元素,200個CSS元素相當于多少個設備像素取決于兩個條件:

  • 頁面是否縮放
  • 屏幕是否為高密度

這兩方面后面再解釋,先梳理一下手機硬件之間的關系,注意這里使用的都是物理像素。

以 iPhone5 為例,我們已知的是:

  1. 分辨率:1136pt x 640pt
    指屏幕上垂直有 1136 個物理像素,水平有 640 個物理像素
  2. 屏幕尺寸:?4英寸
    注意英寸是長度單位,不是面積單位。4英寸指的是屏幕對角線的長度。
  3. 屏幕像素密度:326dpi
    屏幕像素密度(Pibel Per Inch)簡稱?ppi?,單位是?dpi(dot per inch)。這里指屏幕水平或垂直每英寸有326個物理像素。原則上來說,ppi越高越好,因為圖像會更加細膩清晰。

ppi?是可以通過?分辨率?和?屏幕尺寸?計算得到的:

ppi

這個網站列出了很多設備的分辨率和屏幕尺寸,并且計算了ppi。

視口

桌面瀏覽器中,瀏覽器窗口就是約束你的CSS布局視口(又稱初始包含塊)。它是所有CSS百分比寬度推算的根源,它的作用是給CSS布局限制了一個最大寬度,視口的寬度和瀏覽器窗口寬度一致。

但是在移動端,情況就很復雜了。

布局視口

一個沒有為移動端做優化的網頁,會盡可能縮小網頁讓用戶看到所有東西。這是我的手機查看博客園的樣子,你也可以在Chrome中以移動開發模式看到。

博客園

瀏覽器廠商為了讓用戶在小屏幕下網頁也能夠顯示地很好,所以把視口寬度設置地很大,一般在 768px ~ 1024px 之間,最常見的寬度是 980px。

所以,在手機上,視口與移動端瀏覽器屏幕寬度不再相關聯,是完全獨立的,這個瀏覽器廠商定的視口被稱為布局視口。

布局視口

布局視口我們是看不見的,只知道網頁的最大寬度是?980px?,并且被縮放在了屏幕內。

可以這樣設置布局視口的寬度:

<meta name="viewport" content="width=640">

媒體查詢與布局視口

700px 指的是布局視口的寬度

@media (min-width: 700px){...
}

document.documentElement.clientWidth/Height返回布局視口的尺寸

視覺視口

視覺視口是用戶正在看到的網頁的區域,大小是屏幕中CSS像素的數量。

視覺視口


window.innerWidth/Height返回視覺視口的尺寸

理想視口

布局視口明顯對用戶是不友好的,完全忽略了手機本身的尺寸。所以蘋果引入了理想視口的概念,它是對設備來說最理想的布局視口尺寸。理想視口中的網頁用戶最理想的寬度,用戶進入頁面的時候不需要縮放。

現在討論所謂的『最理想的寬度』到底是多少?其實,如果我們把布局視口的寬度改成屏幕的寬度不就不用縮放了么。可以這樣設置告訴瀏覽器使用它的理想視口:

<meta name="viewport" content="width=device-width">

定義理想視口是瀏覽器的事情,并不能簡單地認為是開發者定義的,開發者只能使用。


screen.width/height返回理想視口的尺寸,有嚴重的兼容性問題---可能返回兩種值:

  1. 理想視口的尺寸(下載瀏覽器)
  2. 屏幕的設備像素尺寸(內置瀏覽器)

Screen size tests和Understanding viewport可以測試你的設備的screen.width值,同一設備的不同瀏覽器返回的值可能是不一樣的。這一情況主要發生在默認瀏覽器和下載瀏覽器(如UC、Chrome)之間。

默認瀏覽器是安卓系統內置的瀏覽器,長下面那個樣子。而且它使用的是Webkit而不是Blink。只有在更新安卓系統的時候才能更新它。直到安卓4.3,Google不再更新。

安卓webkit

而下載瀏覽器都返回的是理想視口尺寸。

縮放

縮放與設備像素、CSS像素的關系

縮放是在放大或縮小CSS像素,比如一個寬度為 200px 的元素無論放大,還是200個CSS像素。但是因為這些像素被放大了,所以CSS像素也就跨越了更多的設備像素。縮小則相反。

縮放與視口

縮放會影響視覺視口的尺寸

頁面被用戶放大,視覺視口內CSS像素數量減少;被用戶縮小,視覺視口內CSS像素數量增多就行了。這個道理應該是不難想的。

用戶縮放不會影響布局視口

注意,這是『用戶縮放』,后面會說開發者設置縮放的情況

縮放比例

我們在開發者工具中可以在這里查看縮放比例:

查看縮放比例

這里的 0.3 是相對于理想視口的。

在下載瀏覽器中,可以這么算(理想視口與視覺視口的比):

zoom level = screen.width / window.innerWidth

禁止縮放

<meta name="viewport" content="user-scalable=no">

設置縮放

<meta name="viewport" content="initial-scale=2">

使用initial-scale有一個副作用:同時也會將布局視口的尺寸設置為縮放后的尺寸。所以initial-scale=1width=device-width的效果是一樣的。

完美視口

解決各種瀏覽器兼容問題的理想視口設置

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

設備像素比

在談到像素的時候,講到除了縮放,屏幕是否為高密度也會影響設備像素和CSS像素的關系。

在縮放程度為100%(這個條件很重要,因為縮放也會影響他們)時,他們的比例叫做設備像素比(device pixel ratio):

dpr = 設備像素 / CSS像素

可以通過JS得到:?window.devicePixelRatio

設備像素比也和視口有關:

dpr = 屏幕橫向設備像素 / 理想視口的寬

總結

這一篇介紹了移動端適配需要掌握的知識,先說明了移動端存在的兩種像素,然后介紹了三種視口,由縮放對視口的影響引入理想視口,最后說明設備想告訴比。下一篇介紹現在市面上的適配方案。

轉載于:https://www.cnblogs.com/jolee/p/6125872.html

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

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

相關文章

python——rang函數、for、braek循環

rang函數&#xff1a; start: 計數從 start 開始。默認是從 0 開始。例如range&#xff08;5&#xff09;等價于range&#xff08;0&#xff0c; 5&#xff09;; stop: 計數到 stop 結束&#xff0c;但不包括 stop。例如&#xff1a;range&#xff08;0&#xff0c; 5&#xf…

Java文件類boolean isHidden()方法(帶示例)

文件類boolean isHidden() (File Class boolean isHidden()) This method is available in package java.io.File.isHidden(). 軟件包java.io.File.isHidden()中提供了此方法。 This method is used to check whether the file is hidden or not. 此方法用于檢查文件是否隱藏。…

js導出的xlsx無法打開_js-xlsx 導出表格至excel

引入js文件下載地址&#xff1a;鏈接: https://pan.baidu.com/s/1gdOl1HnTrM5mZgPgd5qeDQ 提取碼: c8js導入4個js文件js/xlsx.extendscript.js,js/xlsx.full.min.js,js/export.js,js/jszip.js,js/xlsx-style/xlsx.full.min.js其中 js/xlsx-style/xlsx.full.min.js 是表格樣式的…

oracle sql 語句如何插入全年日期?

為什么80%的碼農都做不了架構師&#xff1f;>>> oracle sql 語句如何插入全年日期&#xff1f; create table BSYEAR (d date); insert into BSYEAR select to_date(20030101,yyyymmdd)rownum-1 from all_objects where rownum < to_char(to_date(20031231,…

getparent_Java文件類字符串getParent()方法(帶示例)

getparent文件類字符串getParent() (File Class String getParent()) This method is available in package java.io.File.getParent(). 軟件包java.io.File.getParent()中提供了此方法。 This method is used to return the parent of the given file object(i.e In case of f…

python—while循環、字符串

1. while循環&#xff1a; while 條件滿足&#xff1a;滿足條件執行的語句 else:不滿足條件執行的語句while 死循環 只要滿足 while的條件永遠為真&#xff0c;就會進入無限循環 while True:print(一直循環)while嵌套 \t &#xff1a;在控制臺輸出一個制表符&#xff0c;協助…

java基礎——java基本運算

java基本運算 轉載于:https://www.cnblogs.com/zhouj/p/6132535.html

【Java】MybatisPlus

MybatisPlus MybatisPlus是在mybatis基礎上的一個增強型工具。它對mybatis的一些操作進行了簡化&#xff0c;能夠提高開發的效率。 springboot整合了mybatis之后&#xff0c;其實已經非常方便了&#xff0c;只需要導入mybatis的包后&#xff0c;在配置文件中編寫數據源信息&a…

機器人總動員擬人后_WALL·E 機器人總動員——又是一部讓名字耽誤的高分電影...

WALLE 機器人總動員(2008)導演&#xff1a; 安德魯斯坦頓簡單&#xff0c;卻惹人落淚的動畫電影。名字叫做機器人總動員&#xff0c;說實話&#xff0c;這部電影高高的掛在豆瓣的排行榜上&#xff0c;但卻因為名字被我總是忽視掉&#xff0c;我好像就是這么膚淺的人呀~電影是由…

Java DataInputStream readBoolean()方法(帶示例)

DataInputStream類readBoolean()方法 (DataInputStream Class readBoolean() method) readBoolean() method is available in java.io package. readBoolean()方法在java.io包中可用。 readBoolean() method is used to check whether this stream read the boolean value or n…

python—列表

1 . 什么是列表&#xff1a; 列表形如[‘saf’,‘sf’,5,哈哈‘]&#xff0c;是一個可以儲存任意數據類型的集合。需要注意的是&#xff0c;列表和數組不同&#xff0c;數組是儲存統一數據類型的集合。 創建一個列表&#xff1a; zero_li [ ] #建立一個空列表li [ ‘http’…

更新SQL Server實例所有數據庫表統計信息

引出問題 自從上次菜鳥為老鳥解決了《RDS SQL SERVER 解決中文亂碼問題》問題&#xff0c;老鳥意猶未盡&#xff0c;決定再想個招來刁難刁難菜鳥&#xff1a;“我最近做T-SQL性能調優的時候&#xff0c;經常發現執行計劃中的統計信息不準確&#xff0c;導致SQL Server查詢性能低…

職工考勤管理信息系統數據庫課設_數據庫課程設計--職工考勤管理信息系統

目錄1概述........................................................................................................................................ 11.1設計背景..................................................................................................…

python—元組

1 . 元組的創建&#xff1a; 1 . 簡介 &#xff1a;元組與列表類似&#xff0c;可以存儲任意數據類型。不同之處在于元組的元素不能修改。屬于不可變數據類型&#xff0c;沒有增刪改。 2 . 創建一個元組&#xff1a; t ([1, 2, 3], ssh, True) #和列表不同是&#xff0c;元組…

java clock計時_Java Clock類| systemDefaultZone()方法與示例

java clock計時Clock Class systemDefaultZone()方法 (Clock Class systemDefaultZone() method) systemDefaultZone() method is available in java.time package. systemDefaultZone()方法在java.time包中可用。 systemDefaultZone() method is used to get the current inst…

從0開始搭建SQL Server AlwaysOn 第四篇(配置異地機房節點)

從0開始搭建SQL Server AlwaysOn 第四篇&#xff08;配置異地機房節點&#xff09; 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnblogs.com/lyhabc/p/4682028.html第三篇http://www.cnblogs.com/lyhabc/p/4682986.html第四篇http://www.cnblogs.com…

vue 左側菜單隱藏_vue.js 左側二級菜單顯示與隱藏切換的實例代碼

vue點擊切換顯示隱藏*{padding: 0;margin: 0;font-size: 14px;}ul{width: 200px;height: auto;}h2{background: green;border: 1px solid #fff;color: #fff;height: 30px;line-height: 30px;text-indent: 24px;}h3{background: #999;height: 24px;line-height: 24px;border: 1p…

Java LocalDateTime類| 帶示例的getMinute()方法

LocalDateTime類getMinute()方法 (LocalDateTime Class getMinute() method) getMinute() method is available in java.time package. getMinute()方法在java.time包中可用。 getMinute() method is used to get minute-of-hour field value from this date-time object. getM…

python—集合

1. 集合的概念和建立&#xff1a; Python中的集合和數學中的集合類似&#xff0c;可以保存不重復的元素。它有可變集合&#xff08;set&#xff09;和不可變集合&#xff08;frozenset&#xff09;兩種。 集合是不重復的并且無序的序列。 集合創建可以使用{}以及set()的方式。…

第十九天

今天是學習js的第三天&#xff0c;已經感覺腦內存不夠用了。 想想后續還有這么多Php的課程要學習&#xff0c;真心有點怕怕的。希望以后時間過的慢一些&#xff0c;讓我好好的掌握這門技術吧。 另外&#xff0c;學習js里面還有好多的應用需要自己去掌握&#xff0c;我希望能夠通…