指屏幕对角线长度,单位是英寸(inch)。常见尺寸有:3.5寸、4.0寸、5.0寸、5.5寸、6.0寸等等。
备注:1英寸(inch)= 2.54 厘米(cm)
是指屏幕在:横向、纵向上的物理像素点总数,一般用 n * m 表示。
例如:iPhone6 的屏幕分辨率为: 750 * 1334
又称:屏幕像素密度,是指屏幕上每英寸里包含的物理像素点个数,单位是ppi(pixels per inch),其实这里还有另一个单位 dpi (dots per inch),两个值的计算方式都一样,只是使用的场景不同。
ppi主要用来衡量屏幕,
dpi主要用来衡量打印机、投影仪等。
物理像素又名:设备像素,是一个长度单位(px)。一个物理像素就是屏幕上的一个物理成像点,就是屏幕中一个微小的发光物理元器件(可简单理解为超级微小的灯泡),是屏幕能显示的最小粒度。屏幕的物理像素点数(分辨率)是手机屏幕的一个重要参数,由屏幕制造商决定,屏幕生产后无法修改。例如iPhone6 横向上拥有的物理像素为750、纵向上拥有 的物理像素为1334,用750*1334表示。
css像素又名:逻辑像素,css像素是一个抽象的长度单位,单位也是px,它是为Web开发者创造的,用来精确地度量Web页面上的内容大小。我们在编写css\js\less中所使用的都是css像素。
设备独立像素简称DIP或DP(device-independent pixel),又称:屏幕密度无关像素。
设备独立像素与css像素关系:
在标准情况下(无缩放):1 css像素 = 1 设备独立像素
设备独立像素与物理像素关系:
普通屏幕下:1 设备物理像素 = 1 物理像素
高清屏幕下:1 设备物理像素 = N 物理像素
像素比(dpr,device pixel ratio):单一方向上,【物理像素】和【设备独立像素】的比值。即:dpr = 物理像素 / 设备独立像素
型号 | 分辨率(物理像素点总和) | 设备独立像素(dip或dp) | 像素比(dpr) |
---|---|---|---|
iPhone 3G / 3GS | 320 * 480 | 320 * 480 | 1 |
iPhone 4 / 4s | 640 * 960 | 320 * 480 | 2 |
iPhone 5 / 5s | 640 * 1136 | 320 * 568 | 2 |
iPhone 6 / 7 / 8 | 750 * 1334 | 375 * 667 | 2 |
iPhone 6p / 7p / 8p | 1242 * 2208 | 414 * 736 | 3 |
iPhone X | 1125 * 2436 | 375 * 812 | 3 |
https://uiiiuiii.com/screen/index.htm
位图和矢量图
位图像素也是一个长度单位,位图像素可以理解为位图中的一个“小格子”,是位图的最小单元。
目前一般仅logo需要做高清显示,或提供svg格式logo即可解决问题,否则采用媒体查询:
@media screen and (-webkit-min-device-pixel-ratio:2) {
.logo{
content: url(../imgs/[email protected])
}
}
@media screen and (-webkit-min-device-pixel-ratio:3) {
.logo{
content: url(../imgs/[email protected])
}
}
在pc端,视口的默认宽度和浏览器窗口的宽度一致。在css标准文档中,视口也被称作:初始包含块,它是所有css百分比宽度推算的根源,在PC端可通过如下几种方式获取宽度:
console.log('最干净的显示区域', document.documentElement.clientWidth); // 常用
console.log('最干净的显示区域+滚动条', window.innerWidth);
console.log('最干净的显示区域+滚动条+浏览器边框', window.outerWidth);
console.log('与浏览器无关,当前设备显示分辨率横向的值', screen.width);
在移动端,浏览器厂商面临着一个比较大的问题:他们如何将数以万计甚至可以说是数以亿计的pc端网页完整的呈现在移动端设备上,并且不会出现横向滚动条呢?那就要引出移动端的三个概念:1.布局视口、2.视觉视口、3.理想视口
用于解决早期的页面在手机上显示的问题,早期的时候我们这样做:pc端网页宽度一般都为:960px1024px这个范围,就算超出了该范围,960px1024px这个区域也依然是版心的位置。
浏览器厂商针对移动端设备设计了一个容器,先用这个容器去承装PC端的网页,这容器的宽度一般是980px,不同的设备可能有所差异,但相差并不大;随后将这个容器等比例压缩到与手机等宽,这样就可以保证没有滚动条且能完整呈现页面,但是这样做依然有问题:网页内容被压缩的太小,严重影响用户体验。
**移动端获取布局视口的方式:document.documentElement.clientWidth**
(一般都是980px,iPad Pro是1024px)
注意:布局视口经过压缩后,横向的宽度用css像素表达就不再是375px了,而是980px,因为布局视口是被压缩,而不是截取。
视觉视口就是用户可见的区域,它的绝对宽度永远和设备屏幕一样宽,但是这个宽度里所包含的css像素值是变化的,例如:一般手机会将980个css像素放入视觉视口中 (视觉视口大小=布局视口大小),而 ipad Pro会将1024个css像素放入视觉视口中。
**移动端获取视觉视口方式: window.innerWidth**
,不过在 Android2、 Opera mini、UC8中无法正确获取。(一般也不通过代码看视觉视口)
如果以iPhone6为例,描述一下屏幕:
与屏幕(设备独立像素,dp/dip)等宽的布局视口,称之为理想视口,所以也可以说理想视口是一种标准:让布局视口宽与屏幕等宽(设备独立像素),靠meta标签实现。
设置理想视口的具体方法:
<meta name="viewport" content="width=device-width">
【总结】:
1.描述屏幕:物理像素:750p×、设备独立像素:375px、css像素:980px。
2.优点:元素在不同设备上,呈现效果几乎一样,因都是通过布局容器等比缩放的,例如200宽的盒子: 200/980
3.缺点:元素太小,页面文字不清楚,用户体验不好。
1.描述屏幕:物理像素:750px、设备独立像素:375px、css像素:375px。
2.优点:页面清晰展现,内容不再小到难以观察,用户体验较好。
3.缺点:同一个元素,在不同屏幕(设备)上,呈现效果不一样,例如375宽的盒子:375/375和375/414(不是等比显示)
4.如何解决:做适配。
放大时:
缩小时:
算法过程: 放大时,浏览器向内截取一定比例面积,然后立即把裁剩下的画面等比例撑满整个视口,放不下的元素自动换行。
监测脚本:
console.log('pc端视口为:',document.documentElement.clientWidth)
// pc端, onresize监测的是视口的变化(初识包含块)
window.onresize = () => {
console.log('pc端视口为:',document.documentElement.clientWidth)
}
放大时:
注意:移动端缩放不会影响页面布局,因为缩放的时候,布局视口大小没有变化。
meta-viewport标签是苹果公司在2007年引进的,用于移动端布局视口的控制,企图改变980布局视口的行业规则。
viewport相关选项:
width值可以是device-width,也可以是具体值,但有些安卓手机不支持具体值,IOS全系列支持
width=device-width, initial-scale=1.0
一起写。允许用户缩放的最大比例 【safari不支持】
maximum-scale = 屏幕宽度(设备独立像素,dip)/ 视觉视口宽度
允许用户缩放的最大比例
minimum-scale = 屏幕宽度(设备独立像素,dip)/ 视觉视口宽度
是否允许用户通过手指缩放页面 【safari不支持】
设置为cover可以解决【刘海屏】的留白问题
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no, viewport-fit=cover">
一、为什么要做适配?
由于移动端设备的屏幕尺寸大小不一,会出现:同一个元素,在两个不同的手机上显示效果不一样(比例不同)。要想让同一个元素在不同设备上,显示效果一样,就需要适配。
无论采用何种适配方式,中心原则永远是:等比!
主流的适配方式有三种:
em和rem都是css中的长度单位。而且两个都是相对长度单位,不过两个有点区别
理想视口下,以设计稿(dip为375px)为标准,根字体设计为100px,来匹配其它设备的dip
理想视口下,根字体设为dip/10,即把dip比作10份rem,考虑内部元素的占多少rem
1 vw = 布局视口宽度的1%
2 vh = 布局视口高度的1%
查看兼容性: caniuse.com
高清屏幕下 1px对应更多的物理像素(小灯泡),所以1像素边框看起来比较粗,解决方法如下:
@media screen and (-webkit-min-device-pixel-ratio:2){
#demo{
border: solid 0.5px black;
}
}
@media screen and (-webkit-min-device-pixel-ratio:3){
#demo{
border: solid 0.333px black;
}
}
移动端事件列表
以上事件最早出现于IOS safari中,为了向开发人员转达一些特殊的信息
注意:
touch事件结束后会默认触发元素的click事件,如果没有设置完美视口,则事件触发的时间间隔为300ms左右,如设置完美视口则时间间隔为30ms左右(视具体设备特性而定)。
如果touch事件导致隐藏了元素,则click动作将作用到背后的元素上,触发新元素的click事件或页面跳转,此现象称为点击穿透。
阻止默认行为
btn.addEventListener('touchend',(event)=>{
event.preventDefault()
shade.style.display = 'none'
})
让背后元素不具备click特性,修改为普通div标签:
<div id="baidu">点我去百度div>
利用touchend事件,点击跳转新网页
baidu.addEventListener('touchend',()=>{
window.location.href = 'https://www.baidu.com'
})
利用css中的pointer-events属性让背后的元素暂时失去click事件,300毫秒后再复原:
#baidu{
display: block;
width: 100%;
height: 300px;
background-color: skyblue;
pointer-events: none;
}
btn.addEventListener('touchend',()=>{
shade.style.display = 'none'
setTimeout(() => {
baidu.style.pointerEvents = 'auto' // 恢复正常
}, 300);
})
让隐藏的元素延迟300毫秒左右再隐藏
btn.addEventListener('touchend',()=>{
setTimeout(() => {
shade.style.display = 'none'
}, 300);
})