移动端WEB

像素基础知识

px:css pixels 逻辑像素,浏览器使用的抽象单位

dp(Android),pt(iOS):device independent pixels 设备无关像素,逻辑像素

dpr:devicePixelRatio 设备像素缩放比

 

DPi:打印机每英寸可以喷的墨汁点(印刷行业)

PPI:屏幕每英寸的像素数量,即单位英寸内的像素密度

目前,在计算机显示设备参数描述上,二者意思表达的是一样的。

 

计算公式:以 iPhone5 为例,

ppi = √(11362 + 6402) / 4 = 326 ppi

 

  ldpi mdpi hdpi xhdpi
ppi 120 160 240 320
默认缩放比 0.75 1.0 1.5 2.0

 

 

 

 

注意:Retina屏(高清屏):dpr 都是大于等于 2 。

Viewport

<meta name="viewport" content="name1=value1,name2="value2" />

width:设置布局 viewport 的特定值("device-width")

initial-scake:设置页面的初始缩放

minimum-scale:最小缩放

maximum-scale:最大缩放

user-scalable:用户能否缩放

移动web最佳viewport设置

【布局viewport】=【设备宽度】=【度量viewport】

<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />

Flexbox 弹性盒子布局

不定宽高的水平垂直居中

1 .myoff-wrapper {
2     position: absolute;
3     top: 50%;
4     left: 50px;
5     transform: translate(-50%, -50%);
6 }

 

【flexbox版】不定宽高的水平垂直居中

1 .parent {
2     display: flex;
3     justify-content: center;    /*子元素水平居中*/
4     align-items: center;    /*子元素垂直居中*/
5 }

响应式设计

常用媒体查询参数

  • width —— 视口宽高
  • height —— 视口宽高
  • device-width —— 设备的宽度
  • device-height —— 设备的高度
  • orientation —— 设备处于横向(landscape)还是纵向(portrait)

设计点一:百分比布局

设计点二:弹性图片

img {

  max- 100%;

  height: auto;

}

 设计点三:重新布局,显示与隐藏

  • 同比例缩减元素尺寸
  • 调整页面结构布局
  • 隐藏冗余的元素

注意:经常需要切换位置元素使用【绝对定位】,减少重绘提高渲染性能。

权衡利弊

  • 利:减少重复开发。
  • 弊:性能不是最优。当一个移动设备访问时,会下载不同设备对应的样式,其他样式是冗余的。

移动 web 特别样式处理

  • 高清图片:在移动 web 页面上渲染图片,为了避免图片产生模糊,图片的宽高应该用物理像素单位渲染,即 100 * 100 的图片,应该使用 100dp * 100dop 。

(w_value / dpr)px;

height: (h_value / dpr)px

  • 一像素边框:retina屏幕下的问题。根本原因:1px 使用 2dp 渲染。解决办法:scaleY(0.5)。
li {
/*border-bottom: 0.5px solid #ddd*/
position: relative;
padding: 8px 0 8px 15px;
color: #7c7c7c;
cursor: pointer;
}
li:before {
position: absolute;
top: -1px;
left: 0;
content: "";
100%;
hieght: 1px;
border-top: 1px solid #ddd;
transform: scaleY(0.5);
}

  另:移动端1像素边框问题的解决方案

  • 相对单位

em:根据父节点的 font-size 为相对单位。(多层嵌套时,难以使用)

rem:根据 html 的 font-size 为相对单位。(建议使用)

1.设置rem 的基值:rem = screen,width / 20 。

2.设置 html 的 font-size 值。 

//默认320px

html { font-size: 32px; }

//iphone 6

@media (min-device- 375px) { html { font-size: 37.5px; } }

//iphone 6 plus

@media (min-device- 414px) { html { font-size: 41.4px; } }

3. px / rem; height: px / rem; (rem 表示 rem 的基值)

  • 多行文本溢出
/*单行文本溢出*/
.inaline {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}

/*多行文本溢出*/
.intowline {
overflow: hidden;

text-overflow: ellipsis;
word-break: break-all;

box-orient: vertical;
line-clamp: 2;  //显示到第二行
}

Touch 基础事件

触摸事件

  • touchstart:手指触摸屏幕触发(已经有手指放屏幕上不会触发);
  • touchmove:手指在屏幕上滑动,连续触发;
  • touchend:手指离开屏幕是触发;
  • touchcancel:系统取消 touch 时触发(不常用)。

触摸事件的属性

  • touches:跟踪触摸操作的 touch 对象数组。
  • targetTouches:特定事件目标的 touch 对象数组。
  • changeTouches:上次触摸改变的 touch 对象数组。

每个 touch 对象包含的属性

  • identifier:表示触摸的唯一 ID。
  • clientX:触摸目标在视口中的 x 坐标。
  • clientY:触摸目标在视口中的 y 坐标。
  • pageX:触摸目标在页面中的 x 坐标(包含滚动)。
  • pageY:触摸目标在页面中的 y 坐标(包含滚动)。
  • screenX:触摸目标在屏幕中的 x 坐标。
  • screenY:触摸目标在屏幕中的 y 坐标。
  • target:触摸的 DOM 节点目标。

BUG:Android 只会触发一次 touchstart,一次 touchmove,touchend 不触发。

解决方案:在 touchmove 中加入 event.preventDefault()。

注意:event.preventDefault() 会导致默认行为不发生,如 scroll,导致页面不滚动。

Tap 基础事件

300 毫秒的故事:移动 web 页面上的 click 事件响应都要慢 300ms(需要 300ms 的延时来判断用户 “双击” 还是 “单击”)。

自定义 Tap 事件原理:在 touchstart、touchend 时记录时间和手指的位置,在 touchend 时进行比较,如果手指位置为同一位置(或允许移动一个非常小的位移值)且时间间隔较短(一般认为是 200ms),且过程中未曾处罚过 touchmove 事件,即可认为触发了手持设备上的 “click”事件,一般称它为 “tap” 事件。一般使用移动框架库 Zepto.js。

Tap 透传 BUG:

Tap 透传的解决方案

  1. 使用缓动动画,过渡 300ms 的延迟(让蒙层慢慢消失)。
  2. 中间层 dom 元素的加入,让中间层接受这个 “穿透” 事件,稍后隐藏。
  3. “上下” 都使用 tap事件,原理上解决 tap 透传事件 (但不可避免原生标签 imput,a等的 click 事件)。
  4. 改用 Fastclick 的库。

弹性滚动

当客户端的页面滚动到顶部或底部的时候,滚动条会收缩并让我们多滑动一定距离,就想惯性一样。

  • body 层滚动(系统特殊处理):自带弹性滚动;overflow:hidden; 失效;GIF 和定时器暂定。
  • 局部滚动:没有弹性滚动,没有滚动惯性,不流畅。

局部滚动实现弹性滚动

body {

  overflow: sceoll;

  overflow-scrolling: touch;

}

注意:Android 不支持原生的弹性滚动!需要借助第三方库 iScroll 来实现。

下拉刷新 / 上拉加载

sceoll 属性判断 document 是否在顶部 / 底部。

总结

资源:慕课网

原文地址:https://www.cnblogs.com/xiaochechang/p/5767253.html