课程手记 · Hello,移动web

内容来自慕课网WebApp开发课程的内容,看完之后回想起来,确实有必要记录一下,便于温故

课程地址:http://www.imooc.com/learn/494

Pixel移动开发像素基础

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

dp,pt: device independent pixels 设备无关像素

dpr: devicePixelRatio 设备像素缩放比

计算公式:1px = (dpr)^2 * dp

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

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

目前,在计算机显示设备参数描述上,二者意思表达的是一样的(单位为硬件像素,非px)

PPI越高,像素数越高,图像越清晰,但可视度越低(小),系统默认设置缩放比越大

Retina屏(高清屏)dpr都是大于等于2

Viewport视图

思考下面一个问题:

手机浏览器默认为我们做了两件事情

一:页面渲染在移动设备分辨率大小的viewport

二:缩放

为什么渲染时,要有Viewport

为了排版正确。

viewport有两个,visual viewport和layout viewport


Viewport Meta标签

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

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

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

minimum-scale: 最少缩放

maximum-scale: 最大缩放

user-scalable: 用户能否缩放

常用写法

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

Flex弹性盒子布局

.nav{display:-webkit-flex;}/*父元素*/

.item{flex:1}/*子元素*/

display:-webkit-flex 标示使用弹性布局

flex:num 占容器的比例

Flex不定宽高的水平垂直居中

.parent{

    justify-content:center;/*子元素水平居中*/

    align-items:center;/*子元素垂直居中*/

    display:-webkit-flex;

}

Web的Flex弹性盒模型

http://oldblog.smallyu.net/web/web_flex.html

访问这个链接查看flex的所有属性案例

响应式设计

兼容性

·iOS可以使用最新的flex布局

·android4.4以下,只能兼容旧版的flexbox布局

·android4.4及以上,可以使用最新的flex布局

媒体类型

screen(屏幕)

print(打印机)

handheld(手持设备)

all(通用)

常用该媒体查询参数

width—视口宽高

height——视口宽高

device-width——设备的宽度

device-height——设备的高度

orientation:检查设备处于横向(landscape)还是竖屏(portrait)

设计点一:百分比布局

仅仅使用媒体查询来适应不同的固定宽高设计,只会从一组css到另一组css的切换。两种之间没有任何平滑渐变。当没有命中媒体查询时,表现就会变得不可控制(滚动,换行)。

设计点二:弹性图片

很简单,如同多一点布局使用百分比,图片也使用百分比。其背后的思路是:无论何时,都全包在图片的元素宽度范围内,以最大的宽度同比完整的显示图片。

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

当页面达到屏幕手机宽度的时候,很多时候就要放弃一些传统的页面设计思想。力求页面简单,简介。所以我们必须要做出以下处理:

1.同比例缩减元素尺寸

2.调整页面结构布局

3.隐藏冗余的元素

移动web特别样式处理

高清图片

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

width:(w_value/dpr)px;

height:(h_value/dpr)px;

一像素边框

同样是retina屏幕下的问题,根本原因:1px使用2dp渲染

border:0.5px (FALSE) 仅仅ios8可以用

sacleY(.5)

相对单位rem

为了是一个各大屏幕的手机,px略显固定,不能根据尺寸的大小而改变,使用相对单位更能体验页面兼容性

em:根据父节点的font-size为相对单位

rem:是根据html的font-size为相对单位

em在多层嵌套下,变得非常难以为何

rem更加能作为全局统一设置的度量

rem的基值设置为多少好?

为了使用各大手机屏幕,rem=screen.width/20

不使用rem的情况:font-size

多行文本溢出

单行文本溢出,对title类的使用非常多,而多行文本溢出,在详情介绍则使用的比较多

终端交互优化

Tap基础事件

300毫秒的故事

移动web页面上的click时间响应都要慢上300毫秒。移动设备访问的web页面都是pc上的页面。在默认的viewport(980px)的页面往往都是需要“双击”或“捏开”放大页面,来看高清页面。而正是为了确认用户是“双击”还是“单击”,safari需要300ms的延迟来判断。

300ms延迟怎么破?

使用Tap时间来代替click事件

自定义Tap事件原理

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

Tap“点透”的bug

看过这个过程应该可以秒懂“点透”

Tap透传的解决方案

1.使用缓动动画,过度300ms的延迟

2.中间层dom元素的假如,让中间层接受这个“穿透”

3.“上下”都使用tap时间,原理上解决tap透传事件(但不可避免原生标签click事件)

4.改用Fastclick的库(听过最新的zepto已经fixed掉这个bug)

触摸Touch

Touch基础事件

触摸才是移动设备的交互的核心事件

touchstart:手指触摸屏幕触发(已经有手指放屏幕上不会触发)

touchmove:手指在屏幕滑动,连续触发

touchend:手指离开屏幕时触发

touchcancel:系统取消touch时候触发(不常用)

除常见的事件属性外,触摸事件包含专有的触摸属性

touches:跟踪触摸操作的touch对象数组

targetTouches:特定时间目标的touch对象数组

changeTouches:上次触摸改变的touch对象数组

每个touch对象包含属性

clientX:触摸目标在视口中的x坐标

clientY:触摸目标在视口中的y坐标

identifier:表示触摸的唯一ID。

pageX:触摸目标在页面中的x坐标(包含滚动)。

pageY:触摸目标在页面中的y坐标(包含滚动)。

screenX:触摸目标在屏幕中的x坐标。

screenY:触摸目标在屏幕中的y坐标。

target:触摸的DOM节点目标。

根据touch对象跟踪触摸具体位置,从而判断触摸交互或手势事件。

BUG

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

解决方案

在touchmove中加入:enevt.preventDefault()。

但注意

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

弹性滚动

当客户端的页面滚动到顶部或底部的时候,滚动条会收缩并让我们多滑动一定距离。通过缓冲反弹的效果,带给用户良好的体验。

移动web页面也是拥有这样能力的,但滚动有几种情况需要考虑

body层滚动:(系统特殊化处理)

再带弹性滚动,overflow:hidden失效,GIF和定时器暂停

局部滚动开启弹性滚动

body{

    overflow:scroll;

    -webkit-over-scrolling:touch;

}

注意Android不支持原生的弹性滚动!但可以借助三方库iScroll来实现

下拉刷新

顶端下拉一小点距离,页面弹性滚动向下

上拉加载

使用scroll事件而不是touch时间(android有bug)

总结