移动端适配(必须要知道的,亲测有效)


移动端适配,在开发中经常会遇到的问题:

一、各种单位概念理解

英寸:屏幕的物理大小,如电脑显示器的17、22,手机显示器的4.8、5.7等使用的单位都是英寸。一般说的屏幕的尺寸都是屏幕对角线的长度。1英寸 = 2.54 厘米

像素:像素即一个小方块,它具有特定的位置和颜色。图片、电子屏幕(手机、电脑)就是由无数个具有特定颜色和特定位置的小方块拼接而成。像素可以作为图片或电子屏幕的最小组成单位。

分辨率:屏幕分辨率(一个屏幕具体由多少个像素点组成。),图像分辨率(指图片含有的像素数。)。同一尺寸的屏幕、图片,分辨率越高,越清晰。
PPI(Pixel Per Inch):每英寸包括的像素数。PPI越高,越清晰。
DPI(Dot Per Inch):即每英寸包括的点数。DPI和PPI是等价的。

DIP或DP 设备独立像素:用来告诉不同分辨率的手机,它们在界面上显示元素的大小是多少

dpr(device pixel ratio)设备像素比:物理像素和设备独立像素的比值

//web
let dpr = window.devicePixelRatio;

//css 使用媒体查询min-device-pixel-ratio区分
@media (-webkit-min-device-pixel-ratio: 2),(min-device-pixel-ratio: 2){
    }

//React Native
PixelRatio.get()

web前端长度单位详解(px、em、rem、%、vw/vh、vmin/vmax、vm、calc())

二、移动,web开发

移动端开发
1、在iOS、Android和React Native开发中样式单位其实都使用的是设备独立像素。

2、移动端开发中,UI给我们的原型图一般是基于iphone6(750*1334)的像素给定的。

3、为了适配所有机型,我们在写样式时需要把物理像素转换为设备独立像素。

web开发
web端用到最多的单位是px,即CSS像素。当页面缩放比例为100%时,一个CSS像素等于一个设备独立像素
页面的缩放系数 = 理想视口宽度 / 视觉视口宽度

三、移动端适配

1、视口(viewport)概念

视口共包括三种:布局视口视觉视口理想视口,它们在屏幕适配中起着非常重要的作用。

布局视口:在PC浏览器上,布局视口就等于当前浏览器的窗口大小(不包括borders 、margins、滚动条)。在移动端,布局视口被赋予一个默认值,大部分为980px

在这里插入图片描述

// 获取布局视口大小
document.documentElement.clientWidth / clientHeight

视觉视口:用户通过屏幕真实看到的区域。默认等于当前浏览器的窗口大小(包括滚动条宽度)

在这里插入图片描述

// 获取视觉视口大小
window.innerWidth / innerHeight

理想视口:网站页面在移动端展示的理想大小。在浏览器调试移动端时页面上给定的像素大小就是理想视口大小,它的单位正是设备独立像素。

screen.width / height // 获取理想视口大小

获取浏览器各种视口大小:
在这里插入图片描述

2、视口(viewport)适配(代码)

<meta> 元素 元数据信息。 告诉浏览器如何解析页面。

可以借助<meta>元素的viewport来帮助我们设置视口、缩放等,从而让移动端得到更好的展示效果
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />

在这里插入图片描述
为了在移动端让页面获得更好的显示效果,我们必须让布局视口、视觉视口都尽可能等于理想视口。
设置width=device-width就相当于让布局视口等于理想视口
设置initial-scale=1;就相当于让视觉视口等于理想视口
这时,1个CSS像素就等于1个设备独立像素,而且我们也是基于理想视口来进行布局的,所以呈现出来的页面布局在各种设备上都能大致相似。

3、rem单位适配

flexible方案

核心代码:

	// set 1rem = viewWidth / 100
    function setRemUnit() {
   
        var rem = docEl.clientWidth / 7.5
        docEl.style.fontSize = rem + 'px'
    }
    setRemUnit()

竖屏、横屏、ipad、PC最全的适配JS

<script type="text/javascript">
	// 设备区分 (安卓、火狐、平板、PC)
	var os = function() {
   
		var ua = navigator.userAgent,
			isAndroid = /(?:Android)/.test(ua),
			isFireFox = /(?:Firefox)/.test(ua),
			isTablet = /(?:iPad|PlayBook)/.test(ua) || (isAndroid && !/(?:Mobile)/.test(ua)) || (isFireFox && /(?:Tablet)/.test(ua)),
			isPC = !(/Android|webOS|iPhone|iPod|BlackBerry/i.test(ua));
		return {
   
			isTablet: isTablet,
		};
	}();
	(function (window, document) {
   
		function resize() {
   
			var docEl = document.documentElement;
			var clientWidth = docEl.clientWidth;
			var clientHeight = docEl.clientHeight;
			if (clientWidth < clientHeight) {
    // 手机竖屏
				docEl.style.fontSize = clientWidth / 7.5 + "px";
			} else {
    // 手机横屏 
				docEl.style.fontSize = clientHeight / 7.5 + "px";
			}
			if(os.isTablet) {
    //ipad 
				if(clientWidth >= 1366) {
   
					docEl.style.fontSize = clientWidth / 1366 * 100 + "px";
				} else {
   
					docEl.style.fontSize = clientWidth / 1024 * 100 + "px";
				}
			}
			if (os.isPC) {
    // pc
				if(clientWidth >= 1920) {
   
					docEl.style.fontSize = 1920 / 19.20 + "px";
				} else {
   
					docEl.style.fontSize = clientWidth / 19.20 + "px";
				}
			} 
		}
		resize();
		// reset rem unit on page resize
		window.addEventListener("resize", function () {
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值