移动端适配--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.mzph.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…