Fork me on GitHub

移动web基础知识

移动web基础知识

一.pixel 移动开发像素知识

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

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

dpr: devicePixelRatio 设备像素比缩放

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

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

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

目前,在计算机显示设备惨呼描述上,两者意思表达的是一样的

计算公式: 以iphone5为例

ppi = √ (1136^2 + 640^2) /4 = 326ppi(视网膜Retina屏)

注意: 单位为硬件像素,非px

| ldpi | mdpi | hdpi | xhdpi

ppi | 120 | 160 | 240 | 320
默认缩放比| 0.75 | 1.0 | 1.5 | 2

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

二.viewport

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

  1. 页面渲染在1个980px(ios)的viewport
  2. 缩放> 为什么渲染时,要有Viewport?

    为了渲染正确

viewport分为2种:

visual viewport(度量/视口) = 窗口缩放sclce

layout viewport(布局viewport)

为什么不适用默认的980px的布局viewport?

  • 宽度不可控制,不同系统不同设备的默认值都可能不同
  • 页面缩小版显示,交互不友好
  • 链接不可点
  • 有缩放,缩放后又有滚动
  • font-size为40px等于PC上12px同等物理太少,不规范*

三. meta标签

<meta name="viewport" content="name=value,name=value">

  • width: 设置布局viewport的特定值(“device-width”指设备宽度)
  • initial-scale: 设置页面的初始缩放
  • minimun-sacle: 最小缩放
  • maximun-sacle: 最大缩放
  • user-scalable: 用户能否缩放> 注意: initial-scale自带width = deviece-width

移动web最佳viewport设置

[布局viewport] = [设备宽度] = [度量viewport]

常用设置: <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no">

四.设计移动Web

方案一:根据设备的实际宽度来设计(常用)

手机宽320px,我们就拿320px设计

方案二:1px = 1dp(淘宝用过)

缩放0.5,根据设备的物理像素dp等于抽象像素px来设计。1像素边框和高清图片都不需要额外处理

五.移动web布局

不定宽高的水平垂直居中

.wrap{position:absoulue;top:50%;left:50%;z-index:3;-webkit-transform: translate(-50%,-50%);}

flexbox版:.wrap{justify-content:center,;align-itens: center;display: -webkit-flex}

flex布局就不多说了,可以搜一下,我之前有写一个demo

flex 有兼容性

-ios 可以使用最新的flex布局
-android4.4以下,只能兼容旧版的flexbox布局
-android4.4以上,可以使用最新的flex布局

六.响应式设计

响应式设计,常用媒体查询,例如
@media screen and (max-width: 1024){....}

媒体类型:

  • screen(屏幕)
  • print(打印机)
  • handheld(手持设备)
  • all(通用)

常用媒体查询参数:

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

设计点一: 百分比布局。没有任何平滑渐变

设计点二: 弹性图片

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

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

  • 1.同比例缩减元素尺寸

  • 2.调整页面结构布局

  • 3.隐藏多余的元素

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

所以,使用响应式布局,性能不是最优,但是减少重复开发,一个页面包含所有设备。

七.特殊样式处理

1.高清图片

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

width(w_value/dpr)px; height(h_value/dpr)px;

2.一像素边框问题

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

  • border:0.5px(仅仅ios8可用)

  • sacleY(.5)

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

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

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

em在多层嵌套下,变得非常难控制,rem更加能作为全局统一设置的度量

remm的基值设置多少好?

回归我们的目的:为了适应个大手机屏幕 rem = screen.width/20

width: px/rem基值 | height: px/rem基值

注意: 不使用rem的情况:font-size,因为字体的大小是趋向于阅读的实用性,并不适合与排版布局

3.多行文本溢出…

八.移动web事件

  1. 300ms延迟> 在默认的viewport(980px)的页面,旺旺需要双击或者捏开放大页面。正是为了确认用户是双击,还是单击。

    safari需要300ms的延迟来判断,而后来的iphone也一直沿用这样的设计,借鉴于成功iphone的android也沿用了这样的设计,于是‘300ms’成了一种规范

touch 有一个bug:

android 只会触发一次touchstart,依次touchmove,touchend不触发
(android4.0 4.1有,4.2没有,4.4又回来,直到5.0)

解决方案: 在touchmove中加入 : event.preventDefault(),可fixedBug

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

弹性滚动

局部滚动开启弹性滚动:
body{overflow:scroll;-webkit-overflow-scrolling:touch;}

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

下拉刷新

上拉加载

-------------本文结束感谢您的阅读-------------