# 移动端篇

# 1,html5的新特性

  • 文件类型声明(<!DOCTYPE>)仅有一型:<!DOCTYPE HTML>
  • 新的解析顺序:不再基于SGML
  • 绘画 canvas;
  • 用于媒介回放的 video 和 audio 元素;
  • 语意化更好的内容元素:article、footer、header、nav、section;
  • 表单控件:calendar、date、time、email、url、search;
  • input元素的新类型:date, email, url等。
  • 新的技术: webworker, websocket, Geolocation;
  • 新的属性:ping(用于a与area), charset(用于meta), async(用于script)。
  • 全域属性:id, tabindex, repeat。
  • 新的全域属性:contenteditable, contextmenu, draggable, dropzone, hidden, spellcheck。
  • 新应用程序接口:
    • HTML Geolocation
    • HTML Drag and Drop
    • HTML Local Storage
    • HTML Application Cache
    • HTML Web Workers
    • HTML SSE
    • HTML Canvas/WebGL
    • HTML Audio/Video
  • 移除的元素:
    • 纯表现的元素:basefont,big,center,font, s,strike,tt,u;
    • 对可用性产生负面影响的元素:frame,frameset,naframes;

# 2,什么是Retina 显示屏,带来了什么问题?

retina:一种具备超高像素密度的液晶屏,同样大小的屏幕上显示的像素点由1个变为多个,如在同样带下的屏幕上,苹果设备的retina显示屏中,像素点1个变为4个
在高清显示屏中的位图被放大,图片会变得模糊,因此移动端的视觉稿通常会设计为传统PC的2倍 那么,前端的应对方案是:
设计稿切出来的图片长宽保证为偶数,并使用backgroud-size把图片缩小为原来的1/2

/* 例如图片宽高为:200px*200px,那么写法如下 */
.css{width:100px;height:100px;background-size:100px 100px;}
/* 其它元素的取值为原来的1/2,例如视觉稿40px的字体,使用样式的写法为20px */
.css{font-size:20px}

# 3,ios系统中元素被触摸时产生的半透明灰色遮罩怎么去掉?

ios用户点击一个链接,会出现一个半透明灰色遮罩, 如果想要禁用,可设置-webkit-tap-highlight-color的alpha值为0,也就是属性值的最后一位设置为0就可以去除半透明灰色遮罩

a,button,input,textarea{-webkit-tap-highlight-color: rgba(0,0,0,0;)}

# 4,部分android系统中元素被点击时产生的边框怎么去掉

android用户点击一个链接,会出现一个边框或者半透明灰色遮罩, 不同生产商定义出来额效果不一样,可设置-webkit-tap-highlight-color的alpha值为0去除部分机器自带的效果  ```css a,button,input,textarea{    -webkit-tap-highlight-color: rgba(0,0,0,0);    -webkit-user-modify:read-write-plaintext-only; }

     
### 5,webkit表单元素的默认外观怎么重置
```css
/* 通用 */
.css{-webkit-appearance:none;}
/* 伪元素改变number类型input框的默认样式 */
input[type=number]::-webkit-textfield-decoration-container { 
    background-color: transparent;    
} 
input[type=number]::-webkit-inner-spin-button { 
    -webkit-appearance: none; 
} 
input[type=number]::-webkit-outer-spin-button { 
    -webkit-appearance: none; 
} 

# 6,webkit表单输入框placeholder的颜色值能改变么

input::-webkit-input-placeholder{color:#AAAAAA;}
input:focus::-webkit-input-placeholder{color:#EEEEEE;}

# 7,禁止ios 长按时不触发系统的菜单,禁止ios&android长按时下载图片

.css{-webkit-touch-callout: none}

# 8,禁止ios和android用户选中文字

.css{-webkit-user-select:none}

# 9,打电话发短信写邮件怎么实现

  • 打电话: <a href="tel:0755-10086">打电话给:0755-10086</a>
  • 发短信, <a href="sms:10086">发短信给: 10086</a>
  • 写邮件: <a href=“mailto:peun@foxmail.com">peun@foxmail.com</a>

# 10,audio元素和video元素在ios和andriod中无法自动播放

应对方案:触屏即播

$('html').one('touchstart',function(){
    audio.play()
})

# 11,闪屏怎么解决

通过transform的3d属性改去硬件加速可以解决闪屏问题 开启硬件加速

  1. 解决页面闪白
  2. 保证动画流畅
.css { 
    -webkit-transform: translate3d(0, 0, 0); 
    -moz-transform: translate3d(0, 0, 0); 
    -ms-transform: translate3d(0, 0, 0); 
    transform: translate3d(0, 0, 0); 
} 

# 12,取消input在ios下,输入的时候英文首字母的默认大写

<input autocapitalize="off" autocorrect="off" />

# 13,android 上去掉语音输入按钮

input::-webkit-input-speech-button {display: none}

# 14,设计高性能CSS3动画的几个要素

尽可能地使用合成属性transform和opacity来设计CSS3动画
不使用position的left和top来定位
利用translate3D开启GPU加速

# 15,fixed bug

ios下fixed元素容易定位出错,软键盘弹出时,影响fixed元素定位
android下fixed表现要比iOS更好,软键盘弹出时,不会影响fixed元素定位

# 解决方案

  1. 可用isroll.js,暂无完美方案
  2. 记录屏幕高度,监听resize事件,修改fixed元素的位置

# 16,移动H5前端性能优化指南

  1. PC优化手段在Mobile侧同样适用
  2. 在Mobile侧我们提出三秒种渲染完成首屏指标
  3. 基于第二点,首屏加载3秒完成或使用Loading
  4. 基于联通3G网络平均338KB/s(2.71Mb/s),所以首屏资源不应超过1014KB
  5. Mobile侧因手机配置原因,除加载外渲染速度也是优化重点
  6. 基于第五点,要合理处理代码减少渲染损耗
  7. 基于第二、第五点,所有影响首屏加载和渲染的代码应在处理逻辑中后置
  8. 加载完成后用户交互使用时也需注意性能 优化指南 加载过程是最为耗时的过程,可能会占到总耗时的80%时间,因此是优化的重点

# [资源加载优化]

· 减少HTTP请求
因为手机浏览器同时响应请求为4个请求(Android支持4个,iOS 5后可支持6个),所以要尽量减少页面的请求数,首次加载同时请求数不能超过4个

  • a) 合并CSS、JavaScript
  • b) 合并小图片,使用雪碧图

· 缓存
使用缓存可以减少向服务器的请求数,节省加载时间,所以所有静态资源都要在服务器端设置缓存,并且尽量使用长Cache(Cache资源的更新可使用时间戳)

  • a) 缓存一切可缓存的资源
  • b) 使用长Cache(使用时间戳更新Cache)
  • c) 使用外联式引用CSS、JavaScript

· 压缩HTML、CSS、JavaScript
减少资源大小可以加快网页显示速度,所以要对HTML、CSS、JavaScript等进行代码压缩,并在服务器端设置GZip

  • a) 压缩(例如,多余的空格、换行符和缩进)
  • b) 启用GZip

· 无阻塞
写在HTML头部的JavaScript(无异步),和写在HTML标签中的Style会阻塞页面的渲染,因此CSS放在页面头部并使用Link方式引入,避免在HTML标签中写Style,JavaScript放在页面尾 部或使用异步方式加载

· 使用首屏加载
首屏的快速显示,可以大大提升用户对页面速度的感知,因此应尽量针对首屏的快速显示做优化

· 按需加载
将不影响首屏的资源和当前屏幕资源不用的资源放到用户需要时才加载,可以大大提升重要资源的显示速度和降低总体流量
PS:按需加载会导致大量重绘,影响渲染性能

  • a) LazyLoad
  • b) 滚屏加载
  • 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) 使用Srcset
  • d) 选择合适的图片(1. webP优于JPG 2. PNG8优于GIF)
  • e) 选择合适的大小(1. 首次加载不大于1014KB 2. 不宽于640(基于手机屏幕一般宽度))

· 减少Cookie
Cookie会影响加载速度,所以静态资源域名不使用Cookie

· 避免重定向
重定向会影响加载速度,所以在服务器正确设置避免重定向

· 异步加载第三方资源
第三方资源不可控会影响页面的加载和显示,因此要异步加载第三方资源

# [脚本执行优化]

脚本处理不当会阻塞页面加载、渲染,因此在使用时需当注意
· CSS写在头部,JavaScript写在尾部或异步
· 避免图片和iFrame等的空Src
空Src会重新加载当前页面,影响速度和效率
  · 尽量避免重设图片大小
重设图片大小是指在页面、CSS、JavaScript等中多次重置图片大小,多次重设图片大小会引发图片的多次重绘,影响性能

· 图片尽量避免使用DataURL
DataURL图片没有使用图片的压缩算法文件会变大,并且要解码后再渲染,加载慢耗时长

# [CSS优化]

· 尽量避免写在HTML标签中写Style属性

· 避免CSS表达式
CSS表达式的执行需跳出CSS树的渲染,因此请避免CSS表达式

· 移除空的CSS规则
空的CSS规则增加了CSS文件的大小,且影响CSS树的执行,所以需移除空的CSS规则

· 正确使用Display的属性
Display属性会影响页面的渲染,因此请合理使用
a) display:inline后不应该再使用width、height、margin、padding以及float
b) display:inline-block后不应该再使用float
c) display:block后不应该再使用vertical-align
d) display:table-*后不应该再使用margin或者float

· 不滥用Float
Float在渲染时计算量比较大,尽量减少使用

· 不滥用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代替className
  c) 避免使用document.write
  d) 减少drawImage

· 缓存Dom选择与计算
  每次Dom选择都要计算,缓存他

· 缓存列表.length
  每次.length都要计算,用一个变量保存这个值

· 尽量使用事件代理,避免批量绑定事件

· 尽量使用ID选择器
  ID选择器是最快的

· TOUCH事件优化
  使用touchstart、touchend代替click,因快影响速度快。但应注意Touch响应过快,易引发误操作

# [渲染优化]

· HTML使用Viewport
Viewport可以加速页面的渲染,请使用以下代码

<meta name=”viewport” content=”width=device-width, initial-scale=1> 

· 减少Dom节点
Dom节点太多影响页面的渲染,应尽量减少Dom节点
· 动画优化
a) 尽量使用CSS3动画
b) 合理使用requestAnimationFrame动画代替setTimeout
c) 适当使用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:过渡使用会引发手机过耗电增加)

# 17,CSS动画与Canvas动画性能优劣分析

a、CSS动画更为流畅、但内存占用过高,动画元素在5个以内更为推荐;
b、Canvas动画存在丢帧现象,这一现象在android中低端手机中表现更为明显;
c、5个以内动画元素,选用CSS动画,80%的设备帧频可达80以上。

# 18、移动端怎么自适应?

移动自适应的话一般我用的话就是rem,通过rem单位配合媒体查询来完成几个屏幕的适配,以iphone6位标准,向上适配plus,向下适配5,不做过多的适配,有时候有要求的话也用js来控制rem的大小达到适配效果,rem是相对单位,相对html元素的font-size值的属性,比如font-size:100px; 的话1rem就得100px,这样我子需要通过改变html的font-size就可以达到适配效果

# 19、如何开启gpu加速?

为动画DOM元素添加CSS3样式

-webkit-transform:transition3d(0,0,0)
-webkit-transform:translateZ(0);

这两个属性都会开启GPU硬件加速模式,从而让浏览器在渲染动画时从CPU转向GPU
通过-webkit-transform:transition3d/translateZ开启GPU硬件加速之后,有些时候可能会导致浏览器频繁闪烁或抖动,可以尝试以下办法解决之:

-webkit-backface-visibility:hidden;
-webkit-perspective:1000;

通过-webkit-transform:transition3d/translateZ开启GPU硬件加速的适用范围:

  • 使用很多大尺寸图片(尤其是PNG24图)进行动画的页面。
  • 页面有很多大尺寸图片并且进行了css缩放处理,页面可以滚动时。
  • 使用background-size:cover设置大尺寸背景图,并且页面可以滚动时
  • 编写大量DOM元素进行CSS3动画时(transition/transform/keyframes/absTop&Left)
  • 使用很多PNG图片拼接成CSS Sprite时

# 20、Svg和canvas的区别

canvas是html5提供的新元素<canvas>,而svg存在的历史要比canvas久远,已经有十几年了。svg并不是html5专有的标签,最初svg是用xml技术(超文本扩展语言,可以自定义标签或属性)描述二维图形的语言。在H5中看似canvas与svg很像,但是,他们有巨大的差别。
  首先,从它们的功能上来讲,canvas可以看做是一个画布。,其绘制出来的图形为标量图,因此,可以在canvas中引入jpg或png这类格式的图片,在实际开发中,大型的网络游戏都是用canvas画布做出来的,并且canvas的技术现在已经相当的成熟。另外,我们喜欢用canvas来做一些统计用的图表,如柱状图曲线图或饼状图等。而svg,所绘制的图形为矢量图,所以其用法上受到了限制。因为只能绘制矢量图,所以svg中不能引入普通的图片,因为矢量图的不会失真的效果,在项目中我们会用来做一些动态的小图标。但是由于其本质为矢量图,可以被无限放大而不会失真,这很适合被用来做地图,而百度地图就是用svg技术做出来的。
另外从技术发面来讲canvas里面绘制的图形不能被引擎抓取,如我们要让canvas里面的一个图片跟随鼠标事件:canvas.onmouseover=function(){}。而svg里面的图形可以被引擎抓取,支持事件的绑定。另外canvas中我们绘制图形通常是通过javascript来实现,svg更多的是通过标签来来实现,如在svg中绘制正矩形形就要用<rect>,这里我们不能用属性style="width:XXX;height:XXX;”来定义

# SVG

SVG 是一种使用 XML 描述 2D 图形的语言。 SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。您可以为某个元素附加 JavaScript 事件处理器。 在 SVG 中,每个被绘制的图形均被视为对象。如果 SVG 对象的属性发生变化,那么浏览器能够自动重现图形。 特点:

  • 不依赖分辨率
  • 支持事件处理器
  • 最适合带有大型渲染区域的应用程序(比如谷歌地图)
  • 复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)
  • 不适合游戏应用

# Canvas

Canvas 通过 JavaScript 来绘制 2D 图形。 Canvas 是逐像素进行渲染的。 在 canvas 中,一旦图形被绘制完成,它就不会继续得到浏览器的关注。如果其位置发生变化,那么整个场景也需要重新绘制,包括任何或许已被图形覆盖的对象。 特点:

  • 依赖分辨率
  • 不支持事件处理器
  • 弱的文本渲染能力
  • 能够以 .png 或 .jpg 格式保存结果图像
  • 最适合图像密集型的游戏,其中的许多对象会被频繁重绘

# 21,物理1像素怎么实现

可以使用after插入的形式将宽度设置为200%,然后通过css transfrom 的scale 缩放0.5倍;

# 22,响应式布局的原理

Meta标签定义 使用 viewport meta 标签在手机浏览器上控制布局

通过快捷方式打开时全屏显示 隐藏状态栏 iPhone会将看起来像电话号码的数字添加电话连接,应当关闭 使用Media Queries适配对应样式 常用于布局的CSS Media Queries有以下几种:

# 设备类型(media type):

  • all所有设备;
  • screen 电脑显示器;
  • print打印用纸或打印预览视图;
  • handheld便携设备;
  • tv电视机类型的设备;
  • speech语意和音频盒成器;
  • braille盲人用点字法触觉回馈设备;
  • embossed盲文打印机;
  • projection各种投影设备;
  • tty使用固定密度字母栅格的媒介,比如电传打字机和终端。

# 设备特性(media feature):

  • width浏览器宽度;
  • height浏览器高度;
  • device-width设备屏幕分辨率的宽度值;
  • device-height设备屏幕分辨率的高度值;
  • orientation浏览器窗口的方向纵向还是横向,当窗口的高度值大于等于宽度时该特性值为
  • portrait,否则为landscape;
  • aspect-ratio比例值,浏览器的纵横比;
  • device-aspect-ratio比例值,屏幕的纵横比。

# 设置多种视图宽度

@media only screen and (min-width:768px)and(max-width:1024px){}
@media only screen and (width:320px)and (width:768px){}
@media (min-width:640px){body{font-size:1rem;}}
@media (min-width:960px){body{font-size:1.2rem;}}
@media (min-width:1200px){body{font-size:2rem;}}

# 27,你们怎么嵌套h5页面的

一般都是我前端这边开发好h5页面给安卓和ios一个地址,然后告诉他们我有哪些方法,然后在做一些安卓ios的接口调用,安卓和ios会吧他们的方法提供一个接口给我,我直接调用就好,一般都是调用一些分享,跳转之类的方法

# 28,webapp你主要做的是哪个模块,是页面布局做的多还是交互做的多

webapp部分基本都是我自己负责开发,页面交互都做,因为当时刚去公司的时候公司也刚往这个方向发展,让我也一直就负责移动业务这块的内容

上次更新: 2021/7/31下午10:06:11