移动端基础

2018-02-23  本文已影响0人  年过古稀的Coder

viewport

layout viewport(布局视口)

一般移动设备的浏览器都默认设置了一个viewport 元标签,定义一个虚拟的layout viewport(布局视口),用于解决早期的页面在手机上显示的问题。iOS, Android基本都将这个视口分辨率设置为 980px,所以pc上的网页基本能在手机上呈现,只不过元素看上去很小,一般默认可以通过手动缩放网页。

visual viewport(视觉视口)和物理像素

visual viewport(视觉视口)备物理屏幕的可视区域,屏幕显示器的物理像素,同样尺寸的屏幕,像素密度大的设备,硬件像素会更多。

ideal viewport(理想视口)和 dpi (设备逻辑像素)

ideal viewport(理想视口)通常是我们说的屏幕分辨率。
dip (设备逻辑像素)跟设备的硬件像素无关的。一个 dip 在任意像素密度的设备屏幕上都占据相同的空间。
逻辑像素宽度x倍率 = 物理像素宽度

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
属性名 取值 描述
width 正整数 或 device-width 定义视口的宽度,单位为像素
height 正整数 或 device-height 定义视口的高度,单位为像素,一般不用
initial-scale [0.0-10.0] 定义初始缩放值
minimum-scale [0.0-10.0] 定义缩小最小比例,它必须小于或等于maximum-scale设置
maximum-scale [0.0-10.0] 定义放大最大比例,它必须大于或等于minimum-scale设置
user-scalable yes/no 定义是否允许用户手动缩放页面,默认值yes

width属性被用来控制layout viewport(布局视口)的宽度,layout viewport(布局视口)宽度默认值是设备厂家指定的。iOS, Android基本都将这个视口分辨率设置为 980px。我们可以 width=320 这样设为确切的像素数,也可以设为device-width这一特殊值,一般为了自适应布局,普遍的做法是将width设置为device-width
width=device-width 也就是将layout viewport(布局视口)的宽度设置 ideal viewport(理想视口)的宽度。网页缩放比例为100%时,一个CSS像素就对应一个 dpi(设备逻辑像素),而layout viewport(布局视口)的宽度,ideal viewport(理想视口)的宽度(通常说的分辨率),dpi的宽度值是相等的。

自适应font-size的设置

(function () {
    window.addEventListener("orientation" in window ? "deviceorientation" : "resize", setSize);
    setSize();
    function setSize() {
        var html = document.documentElement;
        var hWidth = html.getBoundingClientRect().width;
        html.style.fontSize = hWidth / 15 + "px";//根据不同的屏幕宽度重置html的字体大小//15为自定义比例
    }
})()

获取设备逻辑像素,设置根元素font-size的大小为页面宽度/15,而rem是相对于根元素的font-size大小,也就是说1rem = 页面宽度/15,假设设计图宽度为750px,那么 1rem = 750/15 = 50px,假设设计图上一元素宽度为 25px,则 转换成rem为 25/50 = 0.5rem;在实际应用手机屏幕逻辑像素为320px,则1rem = 320/15 = 21.33px;则设计图25px宽度元素,在css中写为:width:.5rem,则实际显示尺寸为25/50*21.33 = 10.66px;

rem

rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。

移动端事件

在模拟器下用事件绑定的方式添加touch事件,时好时坏,但是在真机上没有问题,最好用事件监听添加事件

在移动端也支持mouse事件,但是mouse事件的执行,会有300ms左右的延迟

ontouchstart//手指触碰元素
ontouchmove//手指触碰元素之后在屏幕上滑动
ontouchend//手指触碰元素之后在屏幕上抬起

事件点透

手指按下之后,会先执行touch事件,然后记录点击的坐标,300ms之后,在该坐标上查找元素,如果元素上有鼠标事件就执行

解决办法:

preventDefault()//在webkit的模拟器下,目前已经不支持在document上阻止默认事件,真机没问题

移动端event属性

clientX/clientY //相对于屏幕左上角的坐标

pageX/pageY//相对于页面左上角的坐标


index//第几根手指
function () {
    var touchs = ev.changedTouches[0];
    touchs.pageY;
}

阻止默认事件(preventDefault())可以解决以下问题

阻止默认事件 带来的危害

不推荐的解决方案

各种方案

查询横竖屏

window.orientation//记录手机横竖屏状态

orientationchange//监测横竖屏切换

window.addEventListener(‘orientation’ in window ?'orientationchange':'resize',function(){
    setSize();
    //放置有部分手机带有动画,所以延迟在执行一次
    setTimeout(function(){
        setSize();
    },500)
})
function setSize(){
            var html = document.documentElement;
            html.style.fontSize = html.clientWidth/16 + "px";
        }

devicemotion//检测重力加速度

安卓和iOS下数值相反

window.addEventListener('devicemotion',function(e){
    var motion = e.accelerationIncludingGravity;
    montion.x//x方向加速度
    montion.y//y方向加速度
    montion.z//z方向加速度
})

deviceorientation//检测手机旋转角度变化

window.addEventListener('deviceorientation',function(e){
    var motion = e.accelerationIncludingGravity;
    e.beta//围绕x轴旋转(-180 - 180)
    e.gama.y//围绕y轴旋转(-90 - 90)
    e.alpha//围绕z轴旋转(0 - 360)
})

navigator.userAgent//判断是安卓还是iOS

function getIos(){
    var u = navigator.userAgent;
    //var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
    var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
    return isiOS;
}

transform:'rotateZ' //iOS下有兼容问题

上一篇下一篇

猜你喜欢

热点阅读