2017年4月看面试题记

AMD 和 CMD 的区别有哪些?
AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出。
“RequireJS 遵循的是 AMD(异步模块定义)规范,SeaJS 遵循的是 CMD (通用模块定义)规范

目的:为了 JavaScript 的模块化开发,

对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible.

移动端常见的一些兼容性问题

随着手机的普及,移动端的开发也成了一个重要的方向,但由于设备的不统一会造成一些兼容性问题,
1、安卓浏览器看背景图片,有些设备会模糊。
用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢?
经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显示网页,这样字会非常小,所以苹果当初就把iPhone 4的960640分辨率,在网页里只显示了480320,这样devicePixelRatio=2。现在android比较乱,有1.5的,有2的也有3的。
想让图片在手机里显示更为清晰,必须使用2x的背景图来代替img标签(一般情况都是用2倍)。例如一个div的宽高是100100,背景图必须得200200,然后background-size:contain;,这样显示出来的图片就比较清晰了。
代码可以如下:
background:url(../images/icon/all.png) no-repeat center center;

-webkit-background-size:50px 50px;

background-size: 50px 50px;display:inline-block; width:100%; height:50px;

或者指定 background-size:contain;都可以,大家试试!
2、图片加载
若您遇到图片加载很慢的问题,对这种情况,手机开发一般用canvas方法加载:
具体的canvas API 参见:http://javascript.ruanyifeng.com/htmlapi/canvas.html
下面举例说明一个canvas的例子:
<li><canvas></canvas></li>
js动态加载图片和li 总共举例17张图片!
vartotal=17; varzWin=$(window); varrender=function(){ varpadding=2; varwinWidth=zWin.width(); varpicWidth=Math.floor((winWidth-padding*3)/4); vartmpl =''; for(vari=1;i<=totla;i++){ varp=padding; varimgSrc='img/'+i+'.jpg'; if(i%4==1){ p=0; } tmpl +='<li style="width:'+picWidth+'px;height:'+picWidth+'px;padding-left:'+p+'px;padding-top:'+padding+'px;"><canvas id="cvs_'+i+'"></canvas></li>'; varimageObj = newImage(); imageObj.index = i; imageObj.onload = function(){ varcvs =$('#cvs_'+this.index)[0].getContext('2d'); cvs.width = this.width; cvs.height=this.height; cvs.drawImage(this,0,0); } imageObj.src=imgSrc; }}render();
3、假如手机网站不用兼容IE浏览器,一般我们会使用zeptojs
zeptojs内置Touch events方法,具体可以看http://zeptojs.com/#Touch events
看了一下zeptio新版的API,已经支持IE10以上浏览器,对zeptojs可以选择使用!
4、防止手机中网页放大和缩小。
这点是最基本的,最为手机网站开发者来说应该都知道的,就是设置meta中的viewport
还有就是,有些手机网站我们看到如下声明:

代码如下:

<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">

设置了DTD的方式是XHTML的写法,假如我们页面运用的是html5,可以不用设置DTD,直接声明<!DOCTYPE html>。
使用viewport使页面禁止缩放。 通常把user-scalable设置为0来关闭用户对页面视图缩放的行为。
<meta name="viewport"content="user-scalable=0"/>

但是为了更好的兼容,我们会使用完整的viewport设置。

复制代码代码如下:

<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />

当然,user-scalable=0,有的人也写成user-scalable=no,都可以的。
5、apple-mobile-web-app-capable
apple-mobile-web-app-capable是设置Web应用是否以全屏模式运行。
语法:
<meta name="apple-mobile-web-app-capable"content="yes">

说明:
如果content设置为yes,Web应用会以全屏模式运行,反之,则不会。content的默认值是no,表示正常显示。你可以通过只读属性window.navigator.standalone来确定网页是否以全屏模式显示。
6、format-detection
format-detection 启动或禁用自动识别页面中的电话号码。
语法:
<meta name="format-detection"content="telephone=no">
说明:
默认情况下,设备会自动识别任何可能是电话号码的字符串。设置telephone=no可以禁用这项功能。
7、html5调用安卓或者ios的拨号功能
html5提供了自动调用拨号的标签,只要在a标签的href中添加tel:就可以了。
如下:
<ahref="tel:4008106999,1034">400-810-6999 转 1034</a>

拨打手机直接如下
<a href="tel:15677776767">点击拨打15677776767</a>8、html5GPS定位功能
具体请看:http://www.jb51.net/post/html5_GPS_getCurrentPosition
9、上下拉动滚动条时卡顿、慢
body {-webkit-overflow-scrolling: touch; overflow-scrolling: touch;}

Android3+和iOS5+支持CSS3的新属性为overflow-scrolling

10、禁止复制、选中文本

Element {-webkit-user-select:none; -moz-user-select:none; -khtml-user-select:none; user-select:none;}
解决移动设备可选中页面文本(视产品需要而定)
11、长时间按住页面出现闪退
element { -webkit-touch-callout:none;}****
12、iphone及ipad下输入框默认内阴影
Element{ -webkit-appearance:none;}

13、ios和android下触摸元素时出现半透明灰色遮罩
Element { -webkit-tap-highlight-color:rgba(255,255,255,0)}

设置alpha值为0就可以去除半透明灰色遮罩,备注:transparent的属性值在android下无效。
后面一篇文章有详细介绍,地址:http://www.jb51.net/post/phone_web_ysk
14、active兼容处理 即 伪类 :active 失效
方法一:body添加ontouchstart
<body ontouchstart="">

方法二:js给 document 绑定 touchstart 或 touchend 事件
<style> a { color:#000; } a:active { color:#fff; } </style> <a herf=foo >bar</a> <script> document.addEventListener('touchstart',function(){},false);</script>

15、动画定义3D启用硬件加速
Element { -webkit-transform:translate3d(0,0,0) transform: translate3d(0,0,0);}

注意:3D变形会消耗更多的内存与功耗
16、Retina屏的1px边框
Element{ border-width:thin;}
17、webkit mask 兼容处理
某些低端手机不支持css3 mask,可以选择性的降级处理。
比如可以使用js判断来引用不同class:
if('WebkitMask'indocument.documentElement.style){ alert('支持mask');}else{ alert('不支持mask');}

18、旋转屏幕时,字体大小调整的问题
html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6{ -webkit-text-size-adjust:100%;}
19、transition闪屏
/设置内嵌的元素在3D 空间如何呈现:保留3D /-webkit-transform-style: preserve-3d;/ 设置进行转换的元素的背面在面对用户时是否可见:隐藏 / -webkit-backface-visibility:hidden;

20、圆角bug
某些Android手机圆角失效
background-clip: padding-box;

21、顶部状态栏背景色
<meta name="apple-mobile-web-app-status-bar-style"content="black"/>
说明:
除非你先使用apple-mobile-web-app-capable指定全屏模式,否则这个meta标签不会起任何作用。
如果content设置为default,则状态栏正常显示。如果设置为blank,则状态栏会有一个黑色的背景。如果设置为blank-translucent,则状态栏显示为黑色半透明。如果设置为default或blank,则页面显示在状态栏的下方,即状态栏占据上方部分,页面占据下方部分,二者没有遮挡对方或被遮挡。如果设置为blank-translucent,则页面会充满屏幕,其中页面顶部会被状态栏遮盖住(会覆盖页面20px高度,而iphone4和itouch4的Retina屏幕为40px)。默认值是default。
22、设置缓存
<meta http-equiv="Cache-Control"content="no-cache"/>

手机页面通常在第一次加载后会进行缓存,然后每次刷新会使用缓存而不是去重新向服务器发送请求。如果不希望使用缓存可以设置no-cache。
23、桌面图标
<link rel="apple-touch-icon"href="touch-icon-iphone.png"/><link rel="apple-touch-icon"sizes="76x76"href="touch-icon-ipad.png"/><link rel="apple-touch-icon"sizes="120x120"href="touch-icon-iphone-retina.png"/><link rel="apple-touch-icon"sizes="152x152"href="touch-icon-ipad-retina.png"/>

iOS下针对不同设备定义不同的桌面图标。如果不定义则以当前屏幕截图作为图标。
上面的写法可能大家会觉得会有默认光泽,下面这种设置方法可以去掉光泽效果,还原设计图的效果!
<link rel="apple-touch-icon-precomposed"href="touch-icon-iphone.png"/>
图片尺寸可以设定为5757(px)或者Retina可以定为114114(px),ipad尺寸为72*72(px)
24、启动画面
<link rel="apple-touch-startup-image"href="start.png"/>

iOS下页面启动加载时显示的画面图片,避免加载时的白屏。
可以通过madia来指定不同的大小:
<link href="apple-touch-startup-image-320x460.png"media="(device-width: 320px)" rel="apple-touch-startup-image"/><link href="apple-touch-startup-image-640x920.png"media="(device-width: 320px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image"/><link rel="apple-touch-startup-image"media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="apple-touch-startup-image-640x1096.png"><link href="apple-touch-startup-image-768x1004.png"media="(device-width: 768px) and (orientation: portrait)" rel="apple-touch-startup-image"/><link href="apple-touch-startup-image-748x1024.png"media="(device-width: 768px) and (orientation: landscape)" rel="apple-touch-startup-image"/><link href="apple-touch-startup-image-1536x2008.png"media="(device-width: 1536px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image"/><link href="apple-touch-startup-image-1496x2048.png"media="(device-width: 1536px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)"rel="apple-touch-startup-image"/>

25、浏览器私有及其它meta
以下属性在项目中没有应用过,可以写一个demo测试以下!
QQ浏览器私有
全屏模式
<meta name="x5-fullscreen"content="true">

强制竖屏
<meta name="x5-orientation"content="portrait">

强制横屏
<meta name="x5-orientation"content="landscape">

应用模式
<meta name="x5-page-mode"content="app">

UC浏览器私有
全屏模式
<meta name="full-screen"content="yes">

强制竖屏
<meta name="screen-orientation"content="portrait">
强制横屏
<meta name="screen-orientation"content="landscape">

应用模式
<meta name="browsermode"content="application">

其它
针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓
<meta name="HandheldFriendly"content="true">

微软的老式浏览器
<meta name="MobileOptimized"content="320">

windows phone 点击无高光
<meta name="msapplication-tap-highlight"content="no">

26、 IOS中input键盘事件keyup、keydown、keypress支持不是很好
问题是这样的,用input search做模糊搜索的时候,在键盘里面输入关键词,会通过ajax后台查询,然后返回数据,然后再对返回的数据进行关键词标红。用input监听键盘keyup事件,在安卓手机浏览器中是可以的,但是在ios手机浏览器中变红很慢,用输入法输入之后,并未立刻相应keyup事件,只有在通过删除之后才能相应!
解决办法:
可以用html5的oninput事件去代替keyup
<input type="text"id="testInput"><script type="text/javascript"> document.getElementById('testInput').addEventListener('input',function(e){ varvalue = e.target.value; });</script>

然后就达到类似keyup的效果!
27、h5网站input 设置为type=number的问题
h5网页input 的type设置为number一般会产生三个问题,一个问题是maxlength属性不好用了。另外一个是form提交的时候,默认给取整了。三是部分安卓手机出现样式问题。
问题一解决,我目前用的是js。如下
<input type="number"oninput="checkTextLength(this ,10)"> functioncheckTextLength(obj, length) { if(obj.value.length > length) { obj.value = obj.value.substr(0, length); } }

问题二,是因为form提交默认做了表单验证,step默认是1,要设置step属性,假如保留2位小数,写法如下:
<input type="number"step="0.01"/>

关于step,我在这里做简单的介绍,input 中type=number,一般会自动生成一个上下箭头,点击上箭头默认增加一个step,点击下箭头默认会减少一个step。number中默认step是1。也就是step=0.01,可以允许输入2位小数,并且点击上下箭头分别增加0.01和减少0.01。
假如step和min一起使用,那么数值必须在min和max之间。
看下面的例子:
<input type="number"step="3.1"min="1"/>

输入框可以输入哪些数字?
首先,最小值是1,那么可以输入1.0,第二个是可以输入(1+3.1)那就是4.1,以此类推,每次点击上下箭头都会增加或者减少3.1,输入其他数字无效。这就是step的简单介绍。
问题三,去除input默认样式
input[type=number] { -moz-appearance:textfield;}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button { -webkit-appearance:none; margin:0;}

28、ios 设置input 按钮样式会被默认样式覆盖
解决方式如下:
input,textarea { border: 0; -webkit-appearance: none; }

设置默认样式为none
29、IOS键盘字母输入,默认首字母大写
解决方案,设置如下属性
<input type="text"autocapitalize="off"/>

30、select 下拉选择设置右对齐
设置如下:
select option {direction: rtl;}

31、通过transform进行skew变形,rotate旋转会造成出现锯齿现象
可以设置如下:
-webkit-transform: rotate(-4deg) skew(10deg) translateZ(0); transform: rotate(-4deg) skew(10deg) translateZ(0); outline: 1px solid rgba(255,255,255,0)

32、移动端点击300ms延迟
300ms尚可接受,不过因为300ms产生的问题,我们必须要解决。300ms导致用户体验并不是很好,解决这个问题,我们一般在移动端用tap事件来取代click事件。
推荐两个js,一个是fastclick,一个是tap.js
关于300ms延迟,具体请看:http://thx.github.io/mobile/300ms-click-delay/
33、移动端点透问题
案例如下:
<div id="haorooms">点头事件测试</div> <a href="www.baidu.net">www.baidu.com</a>

div是绝对定位的蒙层,并且z-index高于a。而a标签是页面中的一个链接,我们给div绑定tap事件:
$('#haorooms').on('tap',function(){$('#haorooms').hide();});

我们点击蒙层时 div正常消失,但是当我们在a标签上点击蒙层时,发现a链接被触发,这就是所谓的点透事件。
原因:
touchstart 早于 touchend 早于click。 亦即click的触发是有延迟的,这个时间大概在300ms左右,也就是说我们tap触发之后蒙层隐藏, 此时 click还没有触发,300ms之后由于蒙层隐藏,我们的click触发到了下面的a链接上。解决:
(1)尽量都使用touch事件来替换click事件。例如用touchend事件(推荐)。(2)用fastclick,https://github.com/ftlabs/fastclick(3)用preventDefault阻止a标签的click(4)延迟一定的时间(300ms+)来处理事件 (不推荐)(5)以上一般都能解决,实在不行就换成click事件。下面介绍一下touchend事件,如下:
$("#haorooms").on("touchend",function(event) { event.preventDefault(); });

34、消除 IE10 里面的那个叉号
input:-ms-clear{display:none;}

35、关于 iOS 与 OS X 端字体的优化(横竖屏会出现字体加粗不一致等)
iOS 浏览器横屏时会重置字体大小,设置 text-size-adjust 为 none 可以解决 iOS 上的问题,但桌面版 Safari 的字体缩放功能会失效,因此最佳方案是将 text-size-adjust 为 100% 。
-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;

36、关于 iOS 系统中,中文输入法输入英文时,字母之间可能会出现一个六分之一空格
可以通过正则去掉
this.value = this.value.replace(/\u2006/g,'');

37、移动端 HTML5 audio autoplay 失效问题
这个不是 BUG,由于自动播放网页中的音频或视频,会给用户带来一些困扰或者不必要的流量消耗,所以苹果系统和安卓系统通常都会禁止自动播放和使用 JS 的触发播放,必须由用户来触发才可以播放。
解决方法思路:先通过用户 touchstart 触碰,触发播放并暂停(音频开始加载,后面用 JS 再操作就没问题了)。
解决代码:
document.addEventListener('touchstart',function() { document.getElementsByTagName('audio')[0].play(); document.getElementsByTagName('audio')[0].pause();});

38、移动端 HTML5 input date 不支持 placeholder 问题
这个我感觉没有什么好的解决方案,用如下方法

复制代码代码如下:

<input placeholder="Date" class="textbox-n" type="text" onfocus="(this.type='date')" id="date">

有的浏览器可能要点击两遍!
39、部分机型存在type为search的input,自带close按钮样式修改方法
有些机型的搜索input控件会自带close按钮(一个伪元素),而通常为了兼容所有浏览器,我们会自己实现一个,此时去掉原生close按钮的方法为

Search::-webkit-search-cancel-button{ display:none; }

如果想使用原生close按钮,又想使其符合设计风格,可以对这个伪元素的样式进行修改。
40、唤起select的option展开
zepto方式:
$(sltElement).trrgger("mousedown");

原生js方式:
functionshowDropdown(sltElement) { varevent; event = document.createEvent('MouseEvents'); event.initMouseEvent('mousedown',true,true, window); sltElement.dispatchEvent(event);};

移动H5前端性能优化指南
http://isux.tencent.com/h5-performance.html
概述

  1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网络平均338KB/s(2.71Mb/s),所以首屏资源不应超过1014KB5. Mobile侧因手机配置原因,除加载外渲染速度也是优化重点6. 基于第五点,要合理处理代码减少渲染损耗7. 基于第二、第五点,所有影响首屏加载和渲染的代码应在处理逻辑中后置8. 加载完成后用户交互使用时也需注意性能优化指南
    [加载优化]
    加载过程是最为耗时的过程,可能会占到总耗时的80%时间,因此是优化的重点
    · 减少HTTP请求因为手机浏览器同时响应请求为4个请求(Android支持4个,iOS 5后可支持6个),所以要尽量减少页面的请求数,首次加载同时请求数不能超过4个a) 合并CSS、JavaScriptb) 合并小图片,使用雪碧图
    · 缓存使用缓存可以减少向服务器的请求数,节省加载时间,所以所有静态资源都要在服务器端设置缓存,并且尽量使用长Cache(长Cache资源的更新可使用时间戳)a) 缓存一切可缓存的资源b) 使用长Cache(使用时间戳更新Cache)c) 使用外联式引用CSS、JavaScript
    · 压缩HTML、CSS、JavaScript减少资源大小可以加快网页显示速度,所以要对HTML、CSS、JavaScript等进行代码压缩,并在服务器端设置GZipa) 压缩(例如,多余的空格、换行符和缩进)b) 启用GZip
    · 无阻塞写在HTML头部的JavaScript(无异步),和写在HTML标签中的Style会阻塞页面的渲染,因此CSS放在页面头部并使用Link方式引入,避免在HTML标签中写Style,JavaScript放在页面尾
    部或使用异步方式加载
    · 使用首屏加载首屏的快速显示,可以大大提升用户对页面速度的感知,因此应尽量针对首屏的快速显示做优化
    · 按需加载将不影响首屏的资源和当前屏幕资源不用的资源放到用户需要时才加载,可以大大提升重要资源的显示速度和降低总体流量PS:按需加载会导致大量重绘,影响渲染性能a) LazyLoadb) 滚屏加载c) 通过Media Query加载
    · 预加载大型重资源页面(如游戏)可使用增加Loading的方法,资源加载完成后再显示页面。但Loading时间过长,会造成用户流失对用户行为分析,可以在当前页加载下一页资源,提升速度a) 可感知Loading(如进入空间游戏的Loading)b) 不可感知的Loading(如提前加载下一页)
    · 压缩图片图片是最占流量的资源,因此尽量避免使用他,使用时选择最合适的格式(实现需求的前提下,以大小判断),合适的大小,然后使用智图压缩,同时在代码中用Srcset来按需显示PS:过度压缩图片大小影响图片显示效果a) 使用智图( http://zhitu.isux.us/ )b) 使用其它方式代替图片(1. 使用CSS3 2. 使用SVG 3. 使用IconFont)c) 使用Srcsetd) 选择合适的图片(1. webP优于JPG 2. PNG8优于GIF)e) 选择合适的大小(1. 首次加载不大于1014KB 2. 不宽于640(基于手机屏幕一般宽度))
    · 减少CookieCookie会影响加载速度,所以静态资源域名不使用Cookie
    · 避免重定向重定向会影响加载速度,所以在服务器正确设置避免重定向
    · 异步加载第三方资源第三方资源不可控会影响页面的加载和显示,因此要异步加载第三方资源
    [脚本执行优化]
    脚本处理不当会阻塞页面加载、渲染,因此在使用时需当注意
    · CSS写在头部,JavaScript写在尾部或异步
    · 避免图片和iFrame等的空Src空Src会重新加载当前页面,影响速度和效率
    · 尽量避免重设图片大小重设图片大小是指在页面、CSS、JavaScript等中多次重置图片大小,多次重设图片大小会引发图片的多次重绘,影响性能
    · 图片尽量避免使用DataURLDataURL图片没有使用图片的压缩算法文件会变大,并且要解码后再渲染,加载慢耗时长
    [CSS优化]
    · 尽量避免写在HTML标签中写Style属性
    · 避免CSS表达式CSS表达式的执行需跳出CSS树的渲染,因此请避免CSS表达式
    · 移除空的CSS规则空的CSS规则增加了CSS文件的大小,且影响CSS树的执行,所以需移除空的CSS规则
    · 正确使用Display的属性Display属性会影响页面的渲染,因此请合理使用a) display:inline后不应该再使用width、height、margin、padding以及floatb) display:inline-block后不应该再使用floatc) display:block后不应该再使用vertical-alignd) display:table-后不应该再使用margin或者float
    · 不滥用FloatFloat在渲染时计算量比较大,尽量减少使用
    · 不滥用Web字体Web字体需要下载,解析,重绘当前页面,尽量减少使用
    · 不声明过多的Font-size过多的Font-size引发CSS树的效率
    · 值为0时不需要任何单位为了浏览器的兼容性和性能,值为0时不要带单位
    · 标准化各种浏览器前缀a) 无前缀应放在最后b) CSS动画只用 (-webkit- 无前缀)两种即可c) 其它前缀为 -webkit- -moz- -ms- 无前缀 四种,(-o-Opera浏览器改用blink内核,所以淘汰)
    · 避免让选择符看起来像正则表达式高级选择器执行耗时长且不易读懂,避免使用
    [JavaScript执行优化]
    · 减少重绘和回流a) 避免不必要的Dom操作b) 尽量改变Class而不是Style,使用classList代替classNamec) 避免使用document.writed) 减少drawImage
    · 缓存Dom选择与计算每次Dom选择都要计算,缓存他
    · 缓存列表.length每次.length都要计算,用一个变量保存这个值
    · 尽量使用事件代理,避免批量绑定事件
    · 尽量使用ID选择器ID选择器是最快的
    · TOUCH事件优化使用touchstart、touchend代替click,因快影响速度快。但应注意Touch响应过快,易引发误操作
    [渲染优化]
    · HTML使用ViewportViewport可以加速页面的渲染,请使用以下代码
    <meta name="viewport" content="width=device-width, initial-scale=1">*
    · 减少Dom节点Dom节点太多影响页面的渲染,应尽量减少Dom节点
    · 动画优化a) 尽量使用CSS3动画b) 合理使用requestAnimationFrame动画代替setTimeoutc) 适当使用Canvas动画 5个元素以内使用css动画,5个以上使用Canvas动画(iOS8可使用webGL)
    · 高频事件优化Touchmove、Scroll 事件可导致多次渲染a) 使用requestAnimationFrame监听帧变化,使得在正确的时间进行渲染b) 增加响应变化的时间间隔,减少重绘次数
    · GPU加速CSS中以下属性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)来触发GPU渲染,请合理使用PS:过渡使用会引发手机过耗电增加

H5页面适配所有iPhone和安卓机型的六个技巧

http://www.25xt.com/html5css3/10524.html

1、viewport 简单粗暴的方式:
<meta name="viewport" content="width=320,maximum-scale=1.3,user-scalable=no">
直接设置viewport为320px的1.3倍,将页面放大1.3倍。
为什么是1.3?
目前大部分页面都是以320px为基准的布局,而iphone6的宽度比是375/320 = 1.171875,iphone6+则是 414/320 = 1.29375那么以1.29倍也就约等于1.3了。2、ip6+ 的CSS media query
@media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){ /iphone 6/}@media (min-device-width : 414px) and (max-device-width : 736px) and (-webkit-min-device-pixel-ratio : 3){ /iphone 6 plus/}
PS: 也可以直接使用实际的device-width:如 device-width : 375px

在原有页面的基础上,再针对相应的屏幕大小单独写样式做适配。3、REM布局
REM是CSS3新增的一种单位,并且移动端的支持度很高,android2.x+,ios5+ 都支持。REM是相对于dom结构的根元素来设置大小,也就是html这个元素。相较于em单位,rem使用上更容易理解及运用。
REM与PX的换算可以查看网址: https://offroadcode.com/prototypes/rem-calculator/
假设,html我们设置font-size:12px; 也就是说12px相对于1rem,那么18px也就是 18/12 = 1.5rem。
那么我们以320px的设计布局为基准,将html设置为font-size:100px,即100px = 1rem。(设置100px是为了方便计算)那么可以将大部分px单位除以100就可以直接改成rem单位了。
REM如何做响应式布局?

1、如果仅仅是适配ip6+设备,那么使用media query就行。
伪代码如下:
/320px布局/html{font-size: 100px;}body{font-size: 0.14rem /实际相当于14px/}/* iphone 6 /@media (min-device-width : 375px) and (max-device-width : 667px) and (-webkit-min-device-pixel-ratio : 2){ html{font-size: 117.1875px;}}/ iphone6 plus */@media (min-device-width : 414px) and (max-device-width : 736px) and (-webkit-min-device-pixel-ratio : 3){ html{font-size: 129.375px;}}
这样,在ip6下,也就将页面内的元素放大了1.17倍,ip6+下也就是放大了1.29倍。

2、如果是完全自适应,那么可以通过JS来控制。
(function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) return; docEl.style.fontSize = 100 * (clientWidth / 320) + 'px'; }; // Abort if browser does not support addEventListener if (!doc.addEventListener) return; win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false);})(document, window);
页面初始化的时候计算font-size,然后再绑定resize事件。这种效果就和百分比布局一样了。
那么用REM做单位与百分比做单位有什么优势?
主要优势在于能更好的控制元素大小。(一般百分比应用在布局层,一般常见设置为50%,33.3%,25%之类的整数居多,难以运用在复杂的页面小部件内)。但是相比百分比布局,需要借助JS或media query实现,略有一点瑕疵。

4、图片自适应
刚说完REM布局,那么用百分比布局也能实现一样的效果,但是用百分比布局,必须要面临一个问题:图片宽度100%,页面加载时会存在高度塌陷的问题。.
如图:页面加载时图片高度默认不存在。
那么可以用padding-top设置百分比值来实现自适应。
公式如下:
padding-top = (Image Height / Image Width) * 100%
原理:padding-top值为百分比时,取值是是相对于宽度的。
相关代码实现:
<div class="cover">

</div>
.cover{position: relative; padding-top: 100%; height: 0; overflow: hidden;}.cover img{position: absolute; top: 0; width: 100%;}

5、图片高清化
大家都知道,iphone6 plus 是3倍高清图了,它的devicePixelRatio = 3。
关于DPR的介绍可以查看这篇文章《 设备像素比devicePixelRatio简单介绍
在ios8下,已经开始支持img的 srcset
属性了(目前移动端也就ios8开始支持),也就是说,可以对一张图片设置2个URL,浏览器自动加载对应的图片。

黄色表示仅支持旧的srcset规范,绿色表示支持全新的srcset规范,包括sizes属性,w描述符。 这里不展开,详细了解可自行google。
如下DEMO,请切换devicePixelRatio值进行查看:

不过目前前端这边图片的实现基本都用lazyload的方式实现。srcset的图片加载方式在实际项目中运用还比较少。

6、背景图高清化
media query 实现高清化
img标签的高清化,可以通过JS判断devicePixelRatio的值来加载不同尺寸的图片,但是对于背景图,写在CSS中的,用JS来判断就略麻烦了,还好CSS通过media query也能判断dpr。
目前兼容性最好的背景图高清化实现方式,使用media query的 -webkit-min-device-pixel-ratio
做判断:
/* 普通显示屏(设备像素比例小于等于1)使用1倍的图 / .css{ background-image: url(img_1x.png); } / 高清显示屏(设备像素比例大于等于2)使用2倍图 / @media only screen and (-webkit-min-device-pixel-ratio:2){ .css{ background-image: url(img_2x.png); } } / 高清显示屏(设备像素比例大于等于3)使用3倍图 / @media only screen and (-webkit-min-device-pixel-ratio:3){ .css{ background-image: url(img_3x.png); } }
进一步,可以通过工具生成相应的3x,2x,1x的图片及css,在使用时直接引用即可。谁搞一个?
关于移动设备的 -webkit-min-device-pixel-ratio
值,可以查看该网页的整理: http://bjango.com/articles/min-device-pixel-ratio/
image-set 实现高清化
image-set,它是Webkit的私有属性,也是Css4的一个属性,它是为了解决Retina屏幕下的图像显示而生。
使用方式也很简单。伪代码如下:
.css { background-image: url(1x.png); /
不支持image-set的情况下显示/ background: -webkit-image-set( url(1x.png) 1x,/ 支持image-set的浏览器的[普通屏幕]下 / url(2x.png) 2x,/ 支持image-set的浏览器的[2倍Retina屏幕] / url(3x.png) 3x/ 支持image-set的浏览器的[3倍Retina屏幕] */ ); }
目前移动端的支持程度来看,ios7+,android 4.4+ 下已经支持了。如果仅仅是做ip6+的高清适配方案。 image-set
也是一种实现方案。

使用image-set 与 media query 实现有什么区别及好处?
这篇文章里面做了很详细的阐述,大家可以看看:http://blog.cloudfour.com/safari-6-and-chrome-21-add-image-set-to-support-retina-images/

大体的意思是:image-set不需要告诉浏览器使用什么图像,而是直接提供了图像让浏览器选择。这就意味着,如果在低网速下,浏览器可以选择加载低分辨率的图片。(PS:好智能的样子)
但是相比如media query的实现,image-set仅支持单个图片的高清化,不适合在css sprite下使用。 并且兼容性也是一大硬伤。
一般来说,用在LOGO区域,单个图片图标的区域下,也是个不错的选择。

关于图片列表适配,也就是要让布局更灵活,在电商网站里面,商品列表是一个非常常见的结构。一种比较智能的列表方式是:两端对齐,间距自适应。
那么可以使用FLEXBOX布局来实现两端对齐的效果,也可以使用 text-align:justify
的方式实现。
具体实现办法:http://www.ghugo.com/inline-block-justify/
以上内容是非常适合想要学习H5页面的童鞋们,算是H5页面开发的入门教程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容