因为手机屏幕的分辨率大小不一 ,如果使用传统的静态布局,把每个元素的宽高样式写死,在不同的屏幕中就有各种各样的显示效果。这显然不是我们想要的结果。我们需要的是根据屏幕分辨率的不同,来适配不同的样式大小。使不同的手机分辨率下都有相同的样式布局

1.rem适配

1rem就是html标签font-size的大小,在rem适配方案中,我们以rem作为基值来设定元素的大小。1rem单位越大,元素的大小也就越大,1rem单位越小,元素的大小也就越小(1em是当前元素的文字大小)

实现方法:通过js获取屏幕的分辨率来动态设置1rem的大小,即屏幕分辨率越大 => 1rem越大 => 元素也越大,这样来适配不同分辨率的屏幕

缺点:需要手动转换rem和px

注意:需要设置完美视口。另外1rem的值虽然可以自定义,但是谷歌浏览器有最小字体为12px,所以设置rem的时候要保证最小屏幕下的1rem不能小于12px

<!-- 设置完美视口 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">

方法一:设置html元素的内联样式

<script>
var html = document.querySelector('html')
// 照这种设置 375分辨率 (苹果6)的1rem = 20px
html.style.fontSize = document.documentElement.clientWidth/18.75 + 'px'
</script>

方法二:添加style标签,为html标签设定样式,这种方法可以将样式权重提升为最高

<script>
var head = document.querySelector('head')
// 在iphone6中 1rem=20px 移动端浏览器字体最小12px
var w = document.documentElement.clientWidth/18.75
// 创建style标签
var styleNode = document.createElement('style')
// 在style标签中写入内容
styleNode.innerHTML = "html{font-size:"+ w +"px !important}"
// 将style节点插入到head中
head.appendChild(styleNode)
</script>

方法三:使用css的calc()动态设置html的字体大小

html{
font-size:calc(100vw / 18.75);
}

2.viewport适配

rem适配是通过动态修改页面大小来匹配不同的屏幕宽度,而viewport适配则相反,他通过修改视口宽度来自适应要给固定大小的页面。

如果视口宽度大于页面设计的宽度,则会有多余的空间剩余,如果视口宽度小于页面设计的宽度,则默认无法装下这个页面,会出现左右方向滚动条,需要用户滑动左右滚动条才能查看两侧的内容,当然用户可以手动对页面进行缩放,缩小到与屏幕宽度一致即可,问题是用户每次都要手动操作显然不现实,而viewport适配其实就是自动帮你做这件事的,他通过initial-scale对视口进行缩放,将视口调整到页面的宽度,这样一来屏幕不会有剩余空间,也不会出现左右滚动条。

优点:只需按设计图1:1的大小来设定元素的大小即可,无需考虑数值转换

要求:设计图大小与设备屏幕宽度不能相差太大,不然过度缩放会导致失真。

在meta标签中,scale=1.0就相当于设定width=设备独立像素的大小

以设计图为640px为例,假设我们的手机屏幕宽度是375px,在scale=1时就会出现这种效果:

此时我们手动对页面进行缩放,不用左右滚动也能查看整个页面。但是这种事我们要交给程序来处理,让他们帮我们进行缩放。

通过破坏完美视口,修改scale的值来适配不同屏幕,将视口宽度缩放到页面大小,这样就不会再出现滚动条(375/640=0.5859375)

<meta name="viewport" content="initial-scale=0.5859375" />

实际开发中,手机的屏幕大小有很多种,并不是固定的。页面也是一样,并不是固定的640,所以需要 用js来动态设置scale的值

<script>
// 设置设计图的尺寸640 / 750 都行
var targetW = 640
// 设定缩放比例
var scale = window.screen.width / targetW
// 创建meta标签
var meta = document.createElement('meta')
// 为meta标签设定属性值
meta.name = "viewport"
meta.content = "initial-scale="+scale+", minimum-scale="+scale+", maximum-scale="+scale+",user-scalable=no"
// 将meta标签插入到head标签中
document.head.appendChild(meta)
</script>

3.vw和vh

vw和vh是相对于视口的宽度/高度,即:

100vw = 视口的宽度

100vh = 视口的高度

<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
<style>
#box{
width: 50vw;
height: 50vh;
background-color: red;
}
</style>
<body>
<div id="box"></div>
</body>

效果:

不同的设备对vh和vw的解析可能不一致,因为浏览器还包括状态栏,所以vh和vw不能完全对应设备的屏幕大小,而且每个浏览器的状态栏地址栏的大小不一致,解析下来有可能执行结果不一致

* {
padding: 0;
margin: 0;
} html,body {
width: 100%;
height: 100%;
}
<body>
<div style="height:100vh;">
<p></p>
<p></p>
</div>
</body>
<script>
window.onload = function(){
var div = document.querySelector('div')
var p = document.querySelectorAll('p')
p[0].innerHTML = 'body的高度 = ' + document.body.clientHeight
p[1].innerHTML = '100vh的高度 = ' + div.clientHeight
}
</script>

iphone6s plus中(375*735),chrome执行效果为(div高度大于body,所以会出现滚动条)

body的高度 = 622
100vh的高度 = 696

火狐浏览器执行效果

body的高度 = 614
100vh的高度 = 614

Edge执行效果

body的高度 = 622
100vh的高度 = 622

web移动端屏幕适配方案的更多相关文章

  1. Web 端屏幕适配方案

    基础知识 像素相关 1.像素 :像素是屏幕显示最小的单位. 2.设备像素 :设备像素又称物理像素(physical pixel),设备能控制显示的最小单位,我们可以把这些像素看作成显示器上一个个的点. ...

  2. Flutter 移动端屏幕适配方案和制作

    flutter_screenutil插件 flutter 屏幕适配方案,让你的UI在不同尺寸的屏幕上都能显示合理的布局! 注意:此插件仍处于开发阶段,某些API可能尚未推出. 安装依赖: 安装之前请查 ...

  3. 移动端font-size适配方案

    概述 这是我研究移动端页面时的思考,记录下来供以后开发时参考,相信对其他人也有用.由于我写移动端页面写的还比较少,一些问题都还没遇到,所以我的这篇博文不免有些错误的地方,还请大佬多多指正. 这篇文章是 ...

  4. 移动 web 端屏幕适配 - rem

    前言 最近整理了一下以前学习前端的笔记,发现自己对移动 web 端屏幕适配(rem)这一块并没有真正理解,只是会用.接下来,把自己的一些对移动 web 端屏幕适配(rem)的思考记录下来. rem 介 ...

  5. JavaScript强化教程 —— Cocos2d-JS的屏幕适配方案

    1. 设置屏幕适配策略(Resolution Policy) 如果你还没有用过Resolution Policy,只需要在游戏载入过程完成之后(cc.game.onStart函数回调中),调用下面的代 ...

  6. 【移动适配】移动Web怎么做屏幕适配(三)

    复杂纷扰的世界背后,总会有万变不离其宗的简单规则 啃先生 Mar.8th.2016 壹 | Fisrt 前面写了两篇移动适配相关的文章: <移动Web怎么做屏幕适配(一)>重点介绍了怎样利 ...

  7. Cocos2d-JS的屏幕适配方案

    Cocos2d引擎为游戏开发者提供了屏幕适配策略(Resolution Policy)解决方案. 使用方式 1. 设置屏幕适配策略(Resolution Policy) 如果你还没有用过Resolut ...

  8. Android 屏幕适配方案

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45460089: 本文出自:[张鸿洋的博客] 1.概述 大家在Android开发 ...

  9. 实用Android 屏幕适配方案分享

    转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android ...

  10. 给你一个全自动的屏幕适配方案(基于SW方案)!—— 解放你和UI的双手

    Calces系列相关文章:Calces自动实现Android组件化模块构建 前言 屏幕适配一直是移动端开发热议的问题,但是适配方案往往在实际开发的时候会和UI提供的设计稿冲突.本文主要是基于官方推荐的 ...

随机推荐

  1. C# 基础 – 装箱 / 拆箱, 堆 / 栈

    前言 有些概念可能你用不到, 但是懂也无妨. 装箱 / 拆箱 参考: C#装箱和拆箱(Boxing 和 UnBoxing) 通常讲到这些都跟性能有关. 把值类型变成引用类型就叫装箱. int numb ...

  2. LiveChat vs LiveAgent vs Front vs Email

    它们是什么? LiveChat, LiveAgent 算是同类产品. LiveChat 的核心(或者说起点)是 live chat 这个功能, 而 LiveAgent 的核心是 ticket. 如果拿 ...

  3. 实战合集 | I/O 2021 Flutter 研讨会

    2021 年的 Google I/O 大会已圆满闭幕,本次大会带来了诸多关于各项谷歌开发技术产品的最新更新.在此次 I/O,Flutter 发布了 2.2 版本,包括 Web 版的增强.更多 Mate ...

  4. 暑假集训CSP提高模拟 16

    \[暑假集训CSP提高模拟 \lim_{x\rightarrow\infty}\frac{8f_{x}}{f_{x+1}}\times(\sqrt{5}+1),\ \forall f_{x}=f_{x ...

  5. 从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)

    说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...

  6. llama.cpp推理流程和常用函数介绍

    llama.cpp是一个高性能的CPU/GPU大语言模型推理框架,适用于消费级设备或边缘设备.开发者可以通过工具将各类开源大语言模型转换并量化成gguf格式的文件,然后通过llama.cpp实现本地推 ...

  7. 使用iis设置网站php版本为7.3

    内容:使用iis设置网站php版本为7.3这张图 是多少人的噩梦  早期的宝塔版本 没办法在线升级, php版本只能到7.1   默认就没有7.2以上版本   怎么办?可以在iis设置第一步: 第二步 ...

  8. 在实例化对象的时候new关键字具体做了哪些操作?

    a 创建了一个空对象 {}b 通过原型链把空对象和构造函数连接起来__proto__ = prototype c 构造函数的this指向新对象,并执行函数体 d 判断构造函数的返回值,返回对象就使用该 ...

  9. OOP的核心思想

    1. 封装 既是信息封装,把一些信息进行封装成对象,只保留部分接口和方法与外部联系,能有效避免程序间相互依赖,实现代码模块间松藕合 : 2. 继承 子类自动继承父类的属性和方法,继承实现了代码的重用性 ...

  10. js自动调用 click 事件

    // 进入页面立即触发 (()=>{ // 兼容IE if(document.all) { document.getElementById("aid").click(); } ...