关于viewport视口的学习

2023-05-16

简单来说

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

content属性值 :

     width:可视区域的宽度,值可为数字或关键词device-width

     height:同width

     intial-scale:页面首次被显示是可视区域的缩放级别,取值1.0则页面按实际尺寸显示,无任何缩放

     maximum-scale=1.0, minimum-scale=1.0;可视区域的缩放级别,注意这里的可视区域就是逻辑像素也就是CSS大小

     maximum-scale用户可将页面放大的程序,1.0将禁止用户放大到实际尺寸之上。

     user-scalable:是否可对页面进行缩放,no 禁止缩放

复杂的说:

在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport了,只有明白了viewport的概念以及弄清楚了跟viewport有关的meta标签的使用,才能更好地让我们的网页适配或响应各种不同分辨率的移动设备。

一、viewport的概念

移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,在具体一点,就是浏览器上(也可能是一个app中的webview)用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区域要大,也可能比浏览器的可视区域要小。在默认情况下,一般来讲,移动设备上的viewport都是要大于浏览器可视区域的,

二、css中的1px并不等于设备的1px

在iphone3上,一个css像素确实是等于一个屏幕物理像素的。后来随着技术的发展,移动设备的屏幕像素密度越来越高,从iphone4开始,苹果公司便推出了所谓的Retina屏,分辨率提高了一倍,变成640x960,但屏幕尺寸却没变化,这就意味着同样大小的屏幕上,像素却多了一倍,这时,一个css像素是等于两个物理像素的。

还有一个因素也会引起css中px的变化,那就是用户缩放。例如,当用户把页面放大一倍,那么css中1px所代表的物理像素也会增加一倍;反之把页面缩小一倍,css中1px所代表的物理像素也会减少一倍。关于这点,在文章后面的部分还会讲到。

在移动端浏览器中以及某些桌面浏览器中,window对象有一个devicePixelRatio属性,它的官方的定义为:设备物理像素和设备独立像素的比例,也就是 devicePixelRatio*scale = 物理像素 / 独立像素。

css中的px就可以看做是设备的独立像素:如iphone6的phys.width为750px,而css-width为375px。

对响应式布局,媒体查询的影响

@media only screen and (min-width: 350px) and (max-width: 480px){.....................}

如没有meta标签,此时的width当然即为phys.width,iPhone6就不会执行上边的括号里边的代码,但是有了meta标签以后呢,width变成了css-width,即为375px,,所以是会执行代码的。

三、PPK的关于三个viewport的理论

layout viewport 的宽度是大于手机浏览器可视区域的宽度的

 visual viewport浏览器可视区域的大小

23

 ideal viewport

因为现在越来越多的网站都会为移动设备进行单独的设计,所以必须还要有一个能完美适配移动设备的viewport。所谓的完美适配指的是,首先不需要用户缩放和横向滚动条就能正常的查看网站的所有内容;第二,显示的文字的大小是合适,比如一段14px大小的文字,不会因为在一个高密度像素的屏幕里显示得太小而无法看清,理想的情况是这段14px的文字无论是在何种密度屏幕,何种分辨率下,显示出来的大小都是差不多的。当然,不只是文字,其他元素像图片什么的也是这个道理。ppk把这个viewport叫做 ideal viewport,也就是第三个viewport——移动设备的理想viewport。

四、利用meta标签对viewport进行控制

  移动设备默认的viewport是layout viewport,也就是那个比屏幕要宽的viewport,但在进行移动设备网站的开发时,我们需要的是ideal viewport。那么怎么才能得到ideal viewport呢?这就该轮到meta标签出场了。

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

该meta标签的作用是让当前viewport的宽度等于设备的宽度,同时不允许用户手动缩放。也许允不允许用户缩放不同的网站有不同的要求,但让viewport的宽度等于设备的宽度,这个应该是大家都想要的效果,如果你不这样的设定的话,那就会使用那个比屏幕宽的默认viewport,也就是说会出现横向滚动条。

五、把当前的viewport宽度设置为 ideal viewport 的宽度

 

要得到ideal viewport就必须把默认的layout viewport的宽度设为移动设备的屏幕宽度。因为meta viewport中的width能控制layout viewport的宽度,所以我们只需要把width设为width-device这个特殊的值就行了。

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

可是你肯定不知道

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

这句代码也能达到和前一句代码一样的效果,也可以把当前的的viewport变为 ideal viewport。

呵呵,傻眼了吧,因为从理论上来讲,这句代码的作用只是不对当前的页面进行缩放,也就是页面本该是多大就是多大。那为什么会有 width=device-width 的效果呢?

要想清楚这件事情,首先你得弄明白这个缩放是相对于什么来缩放的,因为这里的缩放值是1,也就是没缩放,但却达到了 ideal viewport 的效果,所以,那答案就只有一个了,缩放是相对于 ideal viewport来进行缩放的,当对ideal viewport进行100%的缩放,也就是缩放值为1的时候,不就得到了 ideal viewport吗?事实证明,的确是这样的。下图是各大移动端的浏览器当设置了<meta name="viewport" content="initial-scale=1"> 后是否能把当前的viewport宽度变成 ideal viewport 的宽度的测试结果。

但如果width 和 initial-scale=1同时出现,并且还出现了冲突呢?比如:

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

width=400表示把当前viewport的宽度设为400px,initial-scale=1则表示把当前viewport的宽度设为ideal viewport的宽度,那么浏览器到底该服从哪个命令呢?是书写顺序在后面的那个吗?不是。当遇到这种情况时,浏览器会取它们两个中较大的那个值。例如,当width=400,ideal viewport的宽度为320时,取的是400;当width=400, ideal viewport的宽度为480时,取的是ideal viewport的宽度。(ps:在uc9浏览器中,当initial-scale=1时,无论width属性的值为多少,此时viewport的宽度永远都是ideal viewport的宽度)

最后,总结一下,要把当前的viewport宽度设为ideal viewport的宽度,既可以设置 width=device-width,也可以设置 initial-scale=1,但这两者各有一个小缺陷,就是iphone、ipad以及IE 会横竖屏不分,通通以竖屏的ideal viewport宽度为准。所以,最完美的写法应该是,两者都写上去,这样就 initial-scale=1 解决了 iphone、ipad的毛病,width=device-width则解决了IE的毛病:

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

1、关于缩放以及initial-scale的默认值

当前缩放值 = ideal viewport宽度  / visual viewport宽度

在iphone和ipad上,无论你给viewport设的宽的是多少,如果没有指定默认的缩放值,则iphone和ipad会自动计算这个缩放值,以达到当前页面不会出现横向滚动条(或者说viewport的宽度就是屏幕的宽度)的目的。

论meta标签的影响

从上边可以看出,有了meta标签以后,原本的iPhone6,即像素比为2的手机,可以按照css-width相同的像素比为1的手机一样正常显示,像素比更高的手机也能正常显示。当然现在andriod的2K屏在meta标签的帮助下也能正常显示。即对于开发者来说,已经可以不管手机的像素比,只需按照css像素编写代码即可。

大佬的网站

下一节写基于viewport和rem的淘宝布局

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于viewport视口的学习 的相关文章

  • 我可以动态更改 mobile safari 中的视口元标记吗?

    我有一个为移动 Safari 浏览器构建的 AJAX 应用程序 需要显示不同类型的内容 对于某些内容 我需要user scalable 1对于其他的 我需要user scalable 0 有没有办法在不刷新页面的情况下修改content属性
  • 新的 iOS 7.1 mini-ui 视口设置是否存在错误?

    iOS 7 1 中新的 最小 ui 设置非常适合横向网站 我的网络应用程序使用全屏 绝对定位的 div 来显示其内容 以赋予其类似应用程序的感觉 但 Safari 似乎只是在底部添加了 URL 栏的高度 我在不同的 iPhone 上都试过了
  • 使用中心插件将 jQuery 中心元素置于视口

    我目前正在使用 jQuery center 插件来居中我的 div 元素 到目前为止 它的工作范围已经达到了将其居中到包含父容器的位置 我想要它做的是将其居中到当前浏览器视口中心 那怎么办呢 我的设置是一个简单的链接 单击时会弹出一个 di
  • 如何以通用方式检测位置缺失:固定?

    在iPad等移动设备上 我想禁用仅在支持position fixed时才有效的功能 有没有一种方法可以在不使用用户代理字符串的情况下检测这些设备 原因是我想尽可能避免搜索 iPad iPhone iPod Android 等 运行以下函数来
  • 如何使用 Javascript 动态更改缩放级别?

    我正在尝试找出如何重置 ios 网页中的缩放级别 似乎当用户进行捏放大 缩小时 缩放功能不再起作用 我想要捏合手势 但想以编程方式重置缩放 有人有关于使用 Javascript jQuery 动态改变缩放的想法吗 document read
  • Android 4.4 中的 WebView 和初始规模

    我一整天都在用头撞墙 我需要一些帮助 问题是 我有一个专门为640x960 我们没有时间为每个屏幕尺寸编写CSS 所以我使用了initial scale maximum scale minimum scale in the viewport
  • 仅将视口设置为横向模式

    我正在完成我的网站 除了一件小事之外 一切都运行良好 当我使用 iPhone 时 纵向模式完全符合我的要求 问题在于横向模式 我就像我已经设计了它 但我不喜欢最终版本 所以我需要插入另一行代码 但我不知道该怎么做 这就是我现在拥有的 现在我
  • HTML 中的视口是什么。

    HTML 中的视口是什么 您能否举一些有关如何访问视口详细信息的示例 视口是用户当前可以看到的网页部分 滚动条移动视口以显示页面的其他部分 按照本文的说明在 Javascript 中获取视口尺寸 http andylangton co uk
  • 当在CSS中使用“视口高度/vh”时,它是否包括“浏览器书签栏”在内?

    在 Chrome 中 使用 command shift b 禁用书签栏 我是否应该始终在禁用此功能的情况下测试网站 以使浏览器真正达到 100 或者启用此功能实际上会产生 vh 95 吗 vh 使用视口的大小 因此 如果您打开书签栏 那么您
  • Android 4.1 视口缩放( setInitialScale、元初始缩放不起作用)

    SO 和互联网上有数百篇关于尝试修复 Android 中视口缩放的帖子 我现在相当确定您无法在 Android 4 1 上的 webview 中设置初始比例 我正在构建一个 Cordova Phonegap 应用程序 并且我已经在 iPho
  • iPad Safari 视口的高度

    iPad 的视口宽度为 980 像素 高度是多少 在 Safari 中 我们必须添加地址和新的水龙头 Safari 横向模式下的高度是多少 有一个媒体查询可以使网页适合宽度 有没有办法使网页适合高度 以下是答案 你是对的 iPhone iP
  • 页面滚动时停留在页面底部的粘性 div

    当有人向下滚动我们的页面时 在某个时刻 会出现一个 div 带有 cta 按钮 我想要实现的是 从那一刻起 这个 div 变得 粘性 并随着视口向下滚动 在视口的底部 如果网站正在向下滚动 这个 div 基本上是 但不是真正的 一种粘性页脚
  • 在大屏幕上修复 FireFox 与 Chrome 中的网站大小

    看起来 Gecko Trident 和 Webkit 在高分辨率屏幕上显示网页的方式不同 Chrome 和新 Opera 等 Webkit 浏览器会缩小页面以匹配屏幕的像素分辨率 然而 这可能会使小文本很难阅读 另一方面 Firefox 和
  • 使用 JavaScript 获取 iPhone X 安全区域

    We have safe area inset left safe area inset right safe area inset top and safe area inset bottom在 CSS 中 但是我们如何使用 JavaSc
  • Webgl使用视口+剪刀更新区域

    我一直在尝试创建一个多视口 webgl 应用程序 对于每个视图 我使用视口 剪刀将所有内容渲染得非常好 但现在我想改进渲染并只渲染更新的视图 因此跳过过度绘制 我做了一个小演示来展示这个想法 http kile stravaganza or
  • 当 iPad 处于纵向方向时缩小 Mobile Safari 视口宽度?-

    我正在开发一个网站 该网站设计为在 iPad 上以横向模式查看时效果最佳 一切都是 1024px 宽 div 容器 然而 我仍然需要缩小视口 这样当用户将 iPad 转为纵向时 用户不必缩小或水平滚动来查看页面上的所有内容 目前我有这个标签
  • WP8 上的 IE 10 忽略媒体查询?

    我正在开发一个使用媒体查询的网站 我可以在桌面浏览器中看到它们正常工作 但是当我在 WP8 设备上导航到该网站时 没有加载 CSS 我创建了一个非常简单的 HTML 页面来复制问题并显示我尝试过但无法正常工作的解决方案 这是完整的代码
  • 当视口设置为 user-scalable=no 时,iOS/移动 Safari 仍然会缩放?检查辅助功能设置!

    这个特定的 Mobile Safari 看似不可能且未记录 问题让我今天坚持了很长一段时间 当我弄清楚它时 我正要在这里发布一个有关它的问题 问题 虽然我设置了我的 iPad 网络应用程序仍然允许手动缩放 在浏览器中捏合 但只能在我的 iP
  • Galaxy S3..视口元标记不起作用

    我目前正在开发一个网络应用程序 它在视口元标记中使用中等 dpi 如下所示 当我在 Galaxy S3 设备上测试它时 视口似乎无法正常工作 我在Android 4 0 2中看到过这种事情 在android 4 0 2中 我听说androi
  • iPad 上的网站纵向视图

    我的网站在 iPad 纵向模式下无法正确显示 它在横向模式下看起来不错 但当我将其转换为纵向模式时 我最终会得到一个混乱的网站 所有元素都分散在整个网站上 我怎样才能解决这个问题 请帮我 这是我网站的链接 inclouds co uk ht

随机推荐

  • Django 判断访问来源是PC端还是手机端

    pc or mobile py 判断访问来源是pc端还是手机端 import re def judge pc or mobile ua 34 34 34 param ua 访问来源头信息中的User Agent字段内容 return 34
  • 圆形进度条是学习

    学习网站 xff1a http www cnblogs com jr1993 p 4677921 html CSS margin 0px padding 0px box margin 50px auto 0 width 300px heig
  • 定位插件

    写了个等位插件 xff0c 点击nav中的LI xff0c 位移 xff08 与href有视觉效果 xff09 到达相应板块 xff08 这里的类比li中的类中多了个H字母 xff09 的位置 lt li class 61 34 wz 34
  • JQ复习

    一选择器 1 基本选择器 2 层级选择器 3 过滤选择器 first 选取第一个元素 last 选择最后一个元素 not 去除所有与给定选择器匹配的元素 39 input not first 39 even选取索引是偶数的元素 xff0c
  • 第7章艺术编程Ajax的学习

    终于学到Ajax以前一直没接触到一直以为很NB xff0c 对这些内容我基本上是个小白中的小白哎 xff0c 继续加油 Ajax可以做到只更新页面的一下部分 xff0c 其他部分不需要重新加载 下面就是根据书上的内容所写 HTML lt d
  • 函数是否加括号的问题

    lt a onclick 61 34 fun 34 gt lt a gt 这里有括号 document getElementById 34 ID 34 onclick 61 fun 这里不可以有括号 为什么会有这样的不同 首先加上括号是执行
  • this的详细分析加案例

    this对象是在函数运行时候基于函数的执行环境 xff08 上下文 xff09 绑定的 方法调用模式函数调用模式改造器调用模式apply call bind调用模式 1 方法调用模式 函数有所属对象 xff0c 也就是这个函数是myObje
  • 构造函数与原型链和面向对象的学习(一)

    什么是构造函数 构造函数就是一个普通的函数 xff0c 里面可以写任何语句 逻辑语句或DOM操作 xff0c 可以new出新的实例 xff0c 使其实例可以共享构造函数的原型 第一个例子 function Fun this name 61
  • 构造函数与原型链和面向对象的学习(二)

    原型链 proto proto 也就是对象的 prototype 属性 每一个函数都有一个属性叫做prototype 指向一个对象 不是函数就没有这个属性 这个对象叫原型对象 当这个构造函数被new的时候 xff0c 他的每一个实例对象的
  • 构造函数与原型链和面向对象的学习(三)

    小案例 xff08 红绿灯 xff09 下面对面向对象写个小案例 xff08 红绿灯 xff09 上面是原图 用来来实现点击图片 xff0c 红绿灯的颜色改变 xff0c 控制背景图片的定位来改变 点击一下 就是要完成上面的效果 如果只要实
  • js中的预编译和作用域链

    预编译目的 1 定义作用域中的初始化词法环境 xff0c 而词法环境中有定于作用域 xff0c 从而规定了变量的作用域 2 先是在为undefined xff0c 减少运行时报错 形参去实参的区别 1 形参变量只有在被调用时才分配内存单元
  • ffmpeg视频处理神器学习基础笔记

    FFmpeg文档汇总 xff1a https ffmpeg org documentation html FFmpeg filters文档 xff1a https ffmpeg org ffmpeg filters html 视频处理 视频
  • Vue.js动画和过渡

    vue中的过渡与动画 过滤 把需要添加动画效果的DIV放到transition标签 之后就会发生以下3个步骤 自动嗅探目标元素是否应用了 CSS 过渡或动画 xff0c 如果是 xff0c 在恰当的时机添加 删除 CSS 类名 等下要写的6
  • Vue.js使用keyframes动画

    lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt Vue中css动画的原理 lt title gt lt scrip
  • Vue.js使用animate.css框架

    1 如何使用animate框架 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt Vue中css动画的原理 lt t
  • vue.js中添加动画

    通过触发事件 xff0c 改变data中的值 xff0c 或者改变点击标签元素上的属性值 lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 6
  • 多个元素和列表的过渡

    多个元素 lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title gt 多个元素的组件的过渡动
  • flex弹性布局的学习

    布局的传统解决方案是基于盒状模型 xff0c 依赖 display 43 position 43 float 方式来实现 xff0c 灵活性较差 2009年 xff0c W3C提出了一种新的方案 Flex xff0c Flex是Flexib
  • 震惊!Ajax项目中的使用

    啊啊 xff01 实习第一天写了个移动端的分享列表 就在第三天我们的技术大佬亲自教我们如何对接后台 当然用的是我写的移动端的分享列表 虽然这次应用不是很深入 xff0c 但还是比较广泛 用到了Ajax xff0c sui框架 zepto x
  • 关于viewport视口的学习

    简单来说 lt meta name 61 34 viewport 34 content 61 34 width 61 device width initial scale 61 1 0 34 gt content属性值 width 可视区域