转载链接:移动端开发中,关于适配问题的一点总结(一)

视口

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

我们一直在使用这行代码,但是这样写有什么用 ? 加了这个和不加这个到底有什么区别?

要解释这个问题,我们首先要了解一个概念 - 视口

在解释视口之前,我们先回顾一下CSS的基础:

css中,在没有声明任何宽度时,每个块级元素的默认宽度都是100% 。那这个100% 是相对于什么的100% 呢? 对了,是它父元素的100% 。 每一个css百分比都是根据它的父元素的宽度来进行计算的,所以宽度为父元素 宽度的100% ,本质是:

body,html{
//没有制定宽度,默认100%}
div.aside{
width:20%;}

这里,div.aside占用了它的父元素 body 宽度的100%,但我们没有给body 定义宽度,因此,它占用了它的父元素,也就是html 宽度的100% 。但,我们同样也没有给它定义宽度。因此,它占用的是它的父元素宽度的100% ;

那html 的父元素是谁呢 ?

这就是要说的 视口了。

在CSS文档中,它叫做 初始包含块。

这是百分比计算的根源,它给css布局限制了最大宽度。

在pc 浏览器中,视口的宽度 和浏览器窗口的宽度是一致的(先不管margin 和padding),html ,body 元素的宽度都和浏览器窗口的宽度一致。

布局视口layout viewport

小屏幕的移动端设备,主要是手机和部分平板(屏幕特别巨大的除外= = ),如果让视口的宽度和浏览器宽度 保持一致的话,会导致一个结果——-页面很丑。

手机,平板,浏览器的宽度一般在240-640像素之间,而大…大多数给pc设计的宽度至少为800,一般是960,或者1080。因此,如果用手机去看刚才的那个页面,宽度20%的aside将会非常窄。

一个为桌面设计的网站 在780~ 1260px 的视口中应该会显示的很好,20% 宽度的元素也会大致像设计师希望的那样。

但是,如果移动端浏览器遇到了没有为移动端做优化的网站,它会尽可能的缩小网站让用户看到网站的全貌。所以就显得很挤,字体很小,阅读性很差。

这样用户就只有通过放大,去看想看的信息。

在手机上,视口与移动端浏览器屏幕宽度不再关联,而是完全独立的了。

这个视口,叫布局视口,css布局会根据它来计算,并被它约束。

视觉视口visual viewport

字面意思,它是用户正在看到的网站的区域。我们可以通过缩放去操作视觉视口,但不会影响布局视口,布局视口仍保持原来的宽度。

一般情况下,视觉视口对于开发人员来说并不是那么重要,到那时如果有需要看到用户正在看什么区域的需求,可以用js来获取。

理想视口

首先来解释一下这个概念

默认情况下,移动设备的布局宽度为768~1024像素,虽然这能让桌面网站不被压扁,但这并不是理想情况,尤其是对于小屏幕的使用者,因为在狭小的屏幕上,更适合狭小的网站。

简单的说,就是,布局视口的默认宽度并不是一个理想的宽度。

这就是 苹果 和其他效仿苹果的 浏览器厂商 引进理想视口的原因。

理想视口,对设备来讲,是最理想的视口尺寸。

显示在理想视口中的网站拥有最理想的宽度,不需要缩放。

但,只有当网站是手机(或者平板)的时候,才应该使用理想视口。

所以,代码<meta name="viewport" content="width=device-width"/>就是告诉浏览器,我要使用理想视口了。

让布局视口的宽度和理想视口的宽度一样。

哦,对了,只有我们人为添加这段代码,理想视口才会生效,否则,布局视口将会维持默认宽度。

缩放

首先,什么是缩放…

从技术上讲,缩放就是放大或者缩小css像素的过程。

典型的例子就是我在手机上浏览pc端的网站,放大一点,好看清字。

但是,这个缩放会影响页面上的所有元素。

比如,宽度为200px的元素占用了200个css像素,由于这些像素被放大了,这些像素就跨越了更多的物理像素,缩小则相反。css像素的尺寸缩小了,跨越的设备像素也就少了。

所以,缩放会影响视觉视口的尺寸。

放大会使视觉视口变得更小,我们看到的内容就越少,因为屏幕上显示的css像素更少了。

缩小则会使视觉视口变的更大,使我们看到更多的部分。因为屏幕上css像素更多了。

所以,缩放程度和视觉视口的大小是逆相关的:缩放程度越大,视觉视口越小。

一个重大区别

在手机上,布局视口不会被缩放。但是在pc上会,因为它的布局视口和视觉视口大小是一样的,不可能改变一个的同时,另一个不会变。

要注意的是:移动端的缩放虽然不会导致css布局被重新计算,但是频繁的操作会给cpu比较大的负担,耗电快,因此不重新布局对性能有很大好处。

最小缩放 和最大缩放

initial-scale=1,maximum-scale=1”

如果允许缩放,那用户可以缩放到什么程度呢 ?

在手机上是5个因子, 换句话说就是20% - 500%。

但是安卓-webkit-不大一样,不管有没有meta指令,它的缩放范围都是4个因子(25%-400%);

我们可以通过:<meta name="viewport" content="user-scable=no"/>来禁止用户缩放。

分辨率

分辨率有两个含义。

  1. 设备每英寸的点的个数。
  2. CSS 和 JavaScript 中也有分辨率的概念,不过他们并不是一回事。

物理分辨率dpi

所有的屏幕都有物理分辨率,衡量单位为DPI ,(dots per inch).DPI 越大,画面越清晰。

另外要注意的一点,web开发者不可能知道物理分辨率,因为没法获取这个信息。有些手机通过screen.width暴露设备像素个数,但这在不同浏览器之间是不可靠的。无论如何JavaScript 都无法获取设备的物理尺寸。

设备像素比 dpr

JavaScript 中,有个属性,window.devicePixelRatio 
CSS也有device-pixel-ratio 和分辨率的媒体查询,但是它们都是和物理分辨率无关的。

取而代之的是,他们提供了设备像素个数和理想视口的比,成为设备像素比,device pixel ratio,简称DPR。

window.devicePixelRatio是设备上物理像素和设备独立像素(device-independent pixels (dips))的比例。

公式表示就是:window.devicePixelRatio = 物理像素 / dips。

dips:device-independent pixels

设备独立像素,就是独立于设备之外的像素,也就是css像素。

例子

5s的物理像素为640px, CSS像素为320px,那 pdr = 640/320 = 2.

DPR不一定是整数,比如BlackBerry Z10 的宽度是768px 物理像素;CSS像素为342px,因此,它的dpr 大约为 2.25.

meta视口

meta 视口标签存在的目的主要是:让布局视口的尺寸和理想视口的尺寸匹配。

Apple 发明了这个标签,其他的厂商复制了它的大部分内容。

meta 标签应该被放在中,并按以下格式书写:

<meta name="viewport" content = "name= value,name = value">

每一个名/值 都是一个给浏览器的指令,以逗号分隔,常用的有5个:

  1. width设置布局视口的宽度,为一个正整数
  2. initial-scale设置页面的初始缩放程度 和布局视口的宽
  3. minimum-scale允许用户的最小缩放程度,为一个数字,可以带小数
  4. maximum-scale允许用户的最大缩放值,为一个数字,可以带小数
  5. user-scalable是否允许用户进行缩放,值为”no”或”yes”, no 代表不允许,yes代表允许

完美的meta 视口

在safari中,当设置initial-scale= 1 时,理想视口的尺寸会随着屏幕的旋转改变。在竖屏时,布局视口的宽度是320px ,横屏下,是480px 或者568px.

但在ie10中却有完全相反的问题:

initial-scale = 1 时,在横屏模式下宽度也保持为320px ,但width = device-width 时,它会从320px变为480px.

所以为了在所有浏览器上解决类似的问题,我们需要如下写法:

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

(转)移动端开发总结(一)视口viewport总结的更多相关文章

  1. h5 移动端开发自适应 meta name="viewport"的使用总结

    本文系个人理解,可能有误差,仅供参考,谨慎采纳! 布局视口: 系统自带 一般大于屏幕宽度 理想宽度:  设置页面的viewport 的一个宽度,使不同的手机的布局视口宽度尽量接近可视窗口的值: 可视视 ...

  2. rem值计算------移动端开发计算方式

    移动端开发: <meta name="viewport" content="width=device-width, initial-scale=1, maximum ...

  3. 移动端布局:视口viewport的理解

    移动端开发中,有一些基本概念需要理解清楚,才能更好的组织编程逻辑.在刚接触时,移动端视口的缩放和rem单位的缩放搞混淆了,弄得自己很蒙圈.所以仔细总结下自己的理解. 移动端的适配,我理解为两点: 第一 ...

  4. 移动端开发-viewport与媒体查询

    首先要知道,在移动开发中,手机的浏览器会默认网页是为宽屏而设计的,它会缩小整个页面来适应屏幕. 1. 不使用viewport出现的问题 提到响应式设计,大家首先想到的可能是 Bootstrap , @ ...

  5. 移动端开发viewport深入理解(转)

    一.viewport的概念   移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,就是浏览器上用来显示网页的那部分区域,但viewport不局限于浏览器可视区域 的大小,它 ...

  6. 移动web开发之视口viewport

    × 目录 [1]布局视口 [2]视觉视口 [3]理想视口[4]meta标签[5]总结 前面的话 在CSS标准文档中,视口viewport被称为初始包含块.这个初始包含块是所有CSS百分比宽度推算的根源 ...

  7. 移动端开发(一. Viewport(视窗))

    手机与浏览器 移动端开发主要针对手机,ipad等移动设备,随着地铁里的低头族越来越多,移动端开发在前端的开发任务中站的比重也越来越大.各种品牌及尺寸的手机也不尽相同.尺寸不同就算了分辨率,视网膜屏  ...

  8. 移动端开发概览【webview和touch事件】

    作为一个前端,而且作为一个做移动端开发的前端,那意味着你要有三头六臂,跟iOS开发哥哥一起打酱油,跟Android开发哥哥一起修bug... Android vs Ios 我在webkit内核的chr ...

  9. 移动端开发用touch事件还是click事件

    前端开发现在包含了跨浏览器,跨平台(不同操作系统)和跨设备(不同尺寸的设备)开发. 在移动开发的过程中,到底选取touch事件还是click事件?对了,请不要鄙视click,click在移动端开发用着 ...

随机推荐

  1. 【笔记】css3实现网页平滑过渡效果...

    参考:http://www.imooc.com/video/7142 未完. <!DOCTYPE html> <html> <head> <meta char ...

  2. 开源CMDB详细安装使用

    CMDB的GitHub地址: https://github.com/open-cmdb/cmdb 环境说明 [root@WCY ~]# cat /etc/redhat-release CentOS L ...

  3. 移植madplay到jz2440【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 交叉编译工具:arm-linux-gcc (GCC) 3.4.5 PC环境:ubuntu16.04 一.移植ma ...

  4. 初涉Rx套餐 之RxBinding(让你的事件流程更清晰)

    转载请注明出处:王亟亟的大牛之路 最近下班回家都在WOW,周末就爆肝,感觉人都要GO DIE了,昨天下午看了看RxBinding相关的功能感觉还是蛮强大的,所提供的API也是相当丰富(基本Rx套餐都是 ...

  5. java基础(6)--数组和方法

    数组 1. 什么是数组? 数组是相同数据类型的元素组成的集合.这些元素按线性顺序排列.所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素:除最后一个元素外,每一个元素都有唯一的后继元素.(“ ...

  6. JDK安装配置教程

    一.首先下载JDK的最新版本.可以去http://java.sun.com/javase/downloads/index.jsp下载最新版本JDK1.6.一切下载后选择安装路径,例如我选择安装在&qu ...

  7. Pandas面板(Panel)

    面板(Panel)是3D容器的数据.面板数据一词来源于计量经济学,部分源于名称:Pandas - pan(el)-da(ta)-s. 3轴(axis)这个名称旨在给出描述涉及面板数据的操作的一些语义. ...

  8. thinkphp接收阿里淘宝客数据

    坑在于淘宝客api返回的数据对象是SimpleXMLElement Object类型,不转为php的json array类型数据直接扔到thinkphp循环输出中会达不到要的效果,奇奇怪怪的数组,一度 ...

  9. html笔记(1)

    hgroup 代替div figure figcaption 独立流内容 替代 dl mark 替代 span

  10. python3.7安装模块MySQLdb报错error: Microsoft Visual C++ 14.0 is required.

    error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools&quo ...