## 究竟以哪个为设备独立像素
### window.innerwidth、window.screen.width 的区别
开始时(`viewport scale=1`),二者的值是相同的,但是 `scale=2` 页面放大时,也就是设备独立像素缩小时,`window.innerwidth` 缩小了(按scale倍数缩小,除以scale),而`window.screen.width`不变(也可以说window.screen.width为初始默认的设备独立像素)。
当不在移动环境中时,`window.screen.width`始终为显示器屏幕的宽,`window.innerwidth`为浏览器可见区域的宽,包含滚动条(`$(window).width()`不包含滚动条)。
* * * * *
### 设备的独立像素的表示
window.innerWidth:浏览器可见区域宽度(包含滚动条,不过在移动端滚动条不单独占宽度,不占空间的,不滚动时还是完全透明的),这个值其实就可以表示设备独立像素的值了,甚至可以把它解读为设备独立像素。
**viewport scale大于1时,页面放大,window.innerWidth缩小,设备的独立像素减少,即点数量减少,为原来的1/scale。**
**viewport scale小于1时,页面缩小,window.innerWidth放大,设备的独立像素增多,即点数量增多,为原来的1/scale。**
* * * * *
### 分析
淘宝:html.clientWidth
```javascript
var html = document.documentElement
var rem = html.clientWidth / 10
html.style.fontSize = rem + 'px'
```
小米:html.getBoundingClientRect().width
```javascript
var html = document.documentElement
var e = html.getBoundingClientRect().width
document.documentElement.style.fontSize = e / 7.2 + "px"
```
他们的实验区别:
1. window.innerWidth: 628
2. html.clientWidth:617
3. html.getBoundingClientRect().width:616.6666870117188
以上是在PC模式下的值,可以看到:
1是包含滚动条的。
2不包含滚动条,但是不够精确,明显是四舍五入取整的值,对精确计算不友好。
3不包含滚动条,最精确,能精确到小数位后13位。
> 在移动端,缩放时,他们都会变化,是相同的,但偶尔window.innerWidth的值会比后两者大1px(鼠标移到html元素上显示的值与后两者相同)。
回想之前我们视口缩放viewport scale:
```javascript
// 注意这里,设置视口缩放时没有设置 width=device-width
metaEl.setAttribute('content', 'initial-scale=' + scale + ',maximum-scale=' + scale + ',minimum-scale=' + scale + ',user-scalable=no,viewport-fit=cover');
```
之前`window.innerwidth`和`window.screen.width`对比时,我们已经知道了,页面放大时,设备独立像素缩小,`window.innerwidth` 缩小了,而`window.screen.width`不变,`window.screen.width`只会随着窗口大小而改变。
**`window.innerWidth`、`html.clientWidth`、`html.getBoundingClientRect().width`,三者没有区别,表现的特性相同,它们的值与将鼠标移到html元素上显示的值相同,都能代表随着视口缩放而变化的设备独立像素。**
>[danger] 看来移动端开发很多东西还是要真机测试才行啊,上面的测试是在PC浏览器上模拟的,真机测试不是这样:只要scale不为1,后两者竟然都是980,看来还是得用window.innerWidth才靠谱啊。
上面是没有设置`width=device-width`时的效果。
试想一下,如果又设置缩放,又设置最佳视口宽度等于设备宽度会不会相互矛盾呢?
我们同时设置试一下:
```javascript
// 注意这里,设置视口缩放时同时也设置了 width=device-width
metaEl.setAttribute('content', 'width=device-width,initial-scale=' + scale + ',maximum-scale=' + scale + ',minimum-scale=' + scale + ',user-scalable=no,viewport-fit=cover');
```
首先我们发现,视口缩放不会触发`resize`事件了,之前是可以触发的。
当`scale>1`时`html.clientWidth`、`html.getBoundingClientRect().width`的值始终与将鼠标移到html元素上显示的值相同(始终为初始默认的设备独立像素值),不会跟随视口缩放而改变,只有当`scale<1`时才正常,也就是说,它俩最小不会小于初始默认的设备独立像素值(即最小不会小于window.screen.width的值)。
只有`window.innerWidth`能一直正常体现视口缩放时设备独立像素随着变化了。
那么此时,我们在想,到底使用哪个算基准值呢?
基准值 = ? / Z
(Y = P / Z)
显然使用后两个的话,缩放时基准值也会保持不变,就会出现不正常,rem元素也会被缩放。
总结:不同时设置时,他们基本没有什么区别,无论用哪个做为基准值计算都是一样的,没有区别。同时设置时,问题就出来了,**同时设置是错误的做法,不要同时设置**,并且width默认就是device-width,所以其实可以不用设置这一项。
(不合理就不合理,不然视口缩放不会触发`resize`事件就不好了)
* * * * *
如果只进行比较简单的适配,视口这样设置就可以了:
```html
<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,viewport-fit=cover">
```
如果有用到视口缩放,就一定不要使用`width=device-width`。
* * * * *
### vh可以替代js实时计算的方案
我们是通过 `resize` 事件实时计算 基准值的,这种适配方案依赖于JS,如果不使用JS能实现类似的适配吗?
也可以,答案是用 vh
拼多多就是用的vh
```css
html {
font-size: 100vh / Z;
}
```
原理与JS版的同理。
*****
last update:2018-7-21 07:39:03
- 开始
- 微信小程序
- 获取用户信息
- 记录
- HTML
- HTML5
- 文档根节点
- 你真的了解script标签吗?
- 文档结构
- 已经落后的技术
- form表单
- html实体
- CSS
- css优先级 & 设计模式
- 如何编写高效的 CSS 选择符
- 笔记
- 小计
- flex布局
- 细节体验
- Flex
- Grid
- tailwindcss
- JavaScript
- javascript物语
- js函数定义
- js中的数组对象
- js的json解析
- js中数组的操作
- js事件冒泡
- js中的判断
- js语句声明会提前
- cookie操作
- 关于javascript你要知道的
- 关于innerHTML的试验
- js引擎与GUI引擎是互斥的
- 如何安全的修改对象
- 当渲染引擎遇上强迫症
- 不要使用连相等
- 修改数组-对象
- 算法-函数
- 事件探析
- 事件循环
- js事件循环中的上下文和作用域的经典问题
- Promise
- 最佳实践
- 页面遮罩加载效果
- 网站静态文件之思考
- 图片加载问题
- 路由及转场解决方案
- web app
- 写一个页面路由转场的管理工具
- 谈编程
- 技术/思想的斗争
- 前端技术选型分析
- 我想放点html模板代码
- 开发自适应网页
- 后台前端项目的开发
- 网站PC版和移动版的模板方案
- 前后端分离
- 淘宝前后端分离
- 前后端分离的思考与实践(一)
- 前后端分离的思考与实践(二)
- 前后端分离的思考与实践(三)
- 前后端分离的思考与实践(四)
- 前后端分离的思考与实践(五)
- 前后端分离的思考与实践(六)
- 动画
- 开发小技巧
- Axios
- 屏幕适配
- 理论基础
- 思考
- flexible.js原理
- 实验
- rem的坑,为什么要设置成百分比,为什么又是62.5%
- 为什么以一个标准适配的,其它宽度也能同等适配
- 自适应、响应式、弹性布局、屏幕适配
- 适配:都用百分比?
- 番外篇
- 给你看看0.5px长什么样?
- 用事实证明viewport scale缩放不会改变rem元素的大小
- 为什么PC端页面缩放不会影响rem元素
- 究竟以哪个为设备独立像素
- PC到移动端初试
- 深入理解px
- 响应式之栅格系统
- 深入理解px(二)
- 一篇搞定移动端适配
- flex版栅格布局
- 其他
- 浏览器加载初探
- 警惕你的开发工具
- JS模块化
- webpack
- 打包原理
- 异步加载
- gulp
- 命名规范
- 接口开发
- sea.js学习
- require.js学习
- react学习
- react笔记
- vue学习
- vue3
- 工具、技巧
- 临时笔记
- 怎么维护好开源项目
- 待办
- 对前端MVV*C框架的思考
- jquery问题
- 临时
- 好文
- 节流防抖